我有一个RecyclerView
使用 anItemTouchHelper
来允许用户滑动每个项目。初始加载时一切正常,但如果RecyclerView
更新中的项目(通过搜索功能)ItemTouchHelper.Callback
,则即使应用程序中显示的项目已更改,这些项目也永远不会更改并且始终是初始项目。
public class ListActivity {
private RecyclerView mItemsList;
private String mQuery;
private static int SEARCH_RESULTS_CODE = 131;
@Override
public void onCreate(Bundle savedInstanceState) {
mItemsList = findViewById(R.id.list);
SetContent();
}
private void SetContent()
{
List<String> items = GetItems(mQuery); //returns different items depending on query string. Initial load is all items.
ItemsAdapter adapter = new ItemsAdapter(items);
mItemsList.setAdapter(adapter);
final ItemTouchHelper itemTouchhelper = new ItemTouchHelper(new CustomSwipeController(items));
itemTouchhelper.attachToRecyclerView(mItemsList);
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (resultCode == RESULT_OK) {
if (requestCode == SEARCH_RESULTS_CODE) {
mQuery = data.getData().toString();
SetContent();
}
}
}
@Override
public boolean onMenuItemClick(final MenuItem menuItem) {
final int itemId = menuItem.getItemId();
switch (itemId) {
case R.id.menu_drawer_episode_list_search:
startActivityForResult(new Intent(this, SearchActivity.class), SEARCH_RESULTS_CODE);
break;
}
}
}
public class CustomSwipeController extends ItemTouchHelper.Callback {
private List<String> mItems;
public CustomSwipeController(List<String> items)
{
mItems = items;
}
@Override
public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int direction) {
int position = viewHolder.getAdapterPosition();
String item = mItems.get(position); //these items are always the initial load of items, even though the items displayed in the app have changed
}
}
更新:经过一些调试,如果我发现这些项目在onSwiped
. 如果我在 CustomSwipeController 的构造函数中放置断点,则项目会更改,但在项目上滑动时不会更改。
更新2:我想出了一个解决方法。我没有刷新 中的项目onActivityResult
,而是开始了一项新活动,如下所示:
Intent intent = getIntent();
finish();
startActivity(intent);
这并不理想,但它有效。