AsyncListUtil сохраняет старые данные после обновления

#android #android-recyclerview #android-support-library

#Android #android-recyclerview #android-поддержка-библиотека

Вопрос:

Я использую AsyncListUtil для загрузки элементов из базы данных в фоновом режиме.

Если размер плитки равен 50, AsyncListUtil после этого не очищает кеш refresh() . В режиме повторного использования отображаются верхние 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:

Вам необходимо обновить свой ItemSource. Просто позвоните itemSource.update(); перед listUtil.refresh();