我有一个RecyclerView
,它使用ItemTouchHelper
来允许用户划动每个项目。初始加载时一切正常,但是如果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);
这不是理想的方法,但是可行。
答案 0 :(得分:0)
好吧,虽然我不确定我是否完全了解这里的情况或完全了解正在发生的事情,但我可以提供一个指针来尝试解决您的问题。
设置RecyclerView
时,最好保留对自定义适配器的引用,并通过公共方法更新数据。这样,您就不必每次创建新数据集时都重新创建适配器并进行分配。适配器上的内容如下:
public void updateData(List<CustomData> listCustomData) {
this.listCustomData = listCustomData;
notifyDatasetChanged();
}
下一步是处理您的ItemTouchHelper
。即使比较老,也可以将其视为simple implementation示例,看看您做错了什么。
好运。