AsyncListUtil在刷新后保留旧数据

时间:2016-10-18 06:35:21

标签: android android-recyclerview android-support-library

我使用AsyncListUtil在后台加载数据库中的项目。

如果磁贴大小为50,则As refresh()之后AsyncListUtil不会清除缓存。回收视图显示旧列表中的前6项,但它应显示最后6项。当瓷砖尺寸为5时,没关系。

瓷砖尺寸有限制吗?或者我的代码有问题吗?

以下示例代码也存在同样的问题。

public class AsyncListUtilActivity extends AppCompatActivity {
    private static final String TAG = "AsyncListUtilActivity";
    private RecyclerView mRecyclerView;
    private LinearLayoutManager mLinearLayoutManager;
    private List<String> textList = new ArrayList<>();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mRecyclerView = new RecyclerView(this);
        mLinearLayoutManager = new LinearLayoutManager(this);
        textList.addAll(Arrays.asList(Cheeses.sCheeseStrings));
        mRecyclerView.setLayoutManager(mLinearLayoutManager);
        mRecyclerView.setHasFixedSize(true);
        final ViewGroup.LayoutParams layoutParams = new ViewGroup.LayoutParams(
                ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
        mRecyclerView.setLayoutParams(layoutParams);
        mRecyclerView.setAdapter(new AsyncAdapter(textList));
        setContentView(mRecyclerView);
    }
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        super.onCreateOptionsMenu(menu);
        MenuItemCompat.setShowAsAction(menu.add("Layout"), MenuItemCompat.SHOW_AS_ACTION_IF_ROOM);
        return true;
    }
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        List<String> tmpList = new ArrayList<>(6);
        for(int i = textList.size() - 1; i >= textList.size() - 6 ; --i) {
            tmpList.add(textList.get(i));
        }
        textList.clear();
        textList.addAll(tmpList);
        ((AsyncAdapter) mRecyclerView.getAdapter()).refresh();
        return super.onOptionsItemSelected(item);
    }
    private static class TextViewHolder extends RecyclerView.ViewHolder {
        TextView textView;
        public TextViewHolder(Context context) {
            super(new TextView(context));
            textView = (TextView) itemView;
        }
    }
    private class AsyncAdapter extends RecyclerView.Adapter<TextViewHolder> {
        private AsyncListUtil<String> mAsyncListUtil;
        AsyncAdapter(final List<String> textList) {
            mAsyncListUtil = new AsyncStringListUtil(textList);
        }
        @Override
        public TextViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            return new TextViewHolder(parent.getContext());
        }
        @Override
        public void onBindViewHolder(TextViewHolder holder, int position) {
            final String itemString = mAsyncListUtil.getItem(position);
            if (itemString == null) {
                holder.textView.setText("loading...");
            } else {
                holder.textView.setText(itemString);
            }
        }
        @Override
        public int getItemCount() {
            return mAsyncListUtil.getItemCount();
        }

        public void refresh() {
            mAsyncListUtil.refresh();
        }
    }
    private class AsyncStringListUtil extends AsyncListUtil<String> {
        private static final int TILE_SIZE = 50;
        private static final long DELAY_MS = 500;
        public AsyncStringListUtil(final List<String> textList) {
            super(String.class, TILE_SIZE,
                    new AsyncListUtil.DataCallback<String>() {
                        @Override
                        public int refreshData() {
                            return textList.size();
                        }
                        @Override
                        public void fillData(String[] data, int startPosition, int itemCount) {
                            sleep();
                            for (int i = 0; i < itemCount; i++) {
                                data[i] = textList.get(startPosition + i);
                            }
                        }
                        private void sleep() {
                            try {
                                Thread.sleep(DELAY_MS);
                            } catch (InterruptedException e) {
                                e.printStackTrace();
                            }
                        }
                    },
                    new AsyncListUtil.ViewCallback() {
                        @Override
                        public void getItemRangeInto(int[] outRange) {
                            outRange[0] = mLinearLayoutManager.findFirstVisibleItemPosition();
                            outRange[1] = mLinearLayoutManager.findLastVisibleItemPosition();
                        }
                        @Override
                        public void onDataRefresh() {
                            mRecyclerView.getAdapter().notifyDataSetChanged();
                        }
                        @Override
                        public void onItemLoaded(int position) {
                            mRecyclerView.getAdapter().notifyItemChanged(position);
                        }
                    });
            mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
                @Override
                public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
                    onRangeChanged();
                }
            });
        }
    }
}

1 个答案:

答案 0 :(得分:0)

您需要更新ItemSource。只需在itemSource.update();

之前致电listUtil.refresh();