0

我有一个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);

这并不理想,但它有效。

4

1 回答 1

0

好吧,虽然我不确定我是否完全了解这里的情况或完全了解正在发生的事情,但我可以提供一个指针来尝试解决您的问题。

设置时RecyclerView,最好保留对自定义适配器的引用并通过公共方法更新数据。这样,您就不会在每次有一组新数据通过时重新创建适配器并分配它。你的适配器上有这样的东西:

public void updateData(List<CustomData> listCustomData) {
    this.listCustomData = listCustomData;
    notifyDatasetChanged();
}

下一步是处理您的ItemTouchHelper. 即使它较旧,将其视为一个简单的实现示例以查看您是否做错了什么可能会有所帮助。

祝你好运。

于 2019-07-24T23:39:51.007 回答