将RecyclerView与来自LoaderManager的数据一起使用

Jam*_*ome 1 android android-loadermanager android-recyclerview

我有一个RecyclerView用于显示使用内容提供程序从内容提供程序获取的数据LoaderManager.它工作正常,但我注意到加载大数据时我的下面的实现有一些性能问题,显示数据有一个滞后,因为我使用a ViewPager加载Fragment主机这个方法

@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
    Favorites = new ArrayList<>();

    if (cursor != null) {
        while (cursor.moveToNext())
            Favorites.add(FavoritesModel.fromCursor(cursor));
    }
    adapter = new FavoritesAdapter(getActivity(),Favorites);
    favoritesRecyclerView.setAdapter(adapter);
  }
Run Code Online (Sandbox Code Playgroud)

所以我选择做以下事情:

 @Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
     ........
    adapter = new FavoritesAdapter(getActivity(),Favorites);
    favoritesRecyclerView.setAdapter(adapter);
    ........ 
Run Code Online (Sandbox Code Playgroud)

然后在onLoadFinished上

@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
    Favorites = new ArrayList<>();

    if (cursor != null) {
        while (cursor.moveToNext())
            Favorites.add(FavoritesModel.fromCursor(cursor));
    }
    adapter.notifyDataSetChanged();

  } 
Run Code Online (Sandbox Code Playgroud)

使用此功能无需显示.什么是问题,因为onLoadFinished总是被调用,我知道它始终在UI线程上调用

Kig*_*lip 8

我希望你得到正确的答案.我有同样的问题并做了一些很好的搜索,最后得出了这个.

这是适配器

public class RecordAdapter extends RecyclerView.Adapter<RecordAdapter.ViewHolder> {
    Cursor dataCursor;
    Context context;

    public static class ViewHolder extends RecyclerView.ViewHolder {
        public TextView time;
        public TextView date;
        public TextView distance;
        public ImageView imageView;
        public ViewHolder(View v) {
            super(v);
            time = (TextView) v.findViewById(R.id.time);
            date = (TextView) v.findViewById(R.id.date);
            distance = (TextView) v.findViewById(R.id.distance);
            imageView = (ImageView) v.findViewById(R.id.image);
        }
    }

    public RecordAdapter(Activity mContext, Cursor cursor) {
        dataCursor = cursor;
        context = mContext;
    }

    @Override
    public RecordAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View cardview = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.record_row, parent, false);
        return new ViewHolder(cardview);
    }

    public Cursor swapCursor(Cursor cursor) {
        if (dataCursor == cursor) {
            return null;
        }
        Cursor oldCursor = dataCursor;
        this.dataCursor = cursor;
        if (cursor != null) {
            this.notifyDataSetChanged();
        }
        return oldCursor;
    }

    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
        dataCursor.moveToPosition(position);

        String time = dataCursor.getString(dataCursor.getColumnIndex(FitContract.RecordData.TIME));
        String date = dataCursor.getString(dataCursor.getColumnIndex(FitContract.RecordData.DATE));
        String distance = dataCursor.getString(dataCursor.getColumnIndex(FitContract.RecordData.DISTANCE));

        holder.time.setText(time);
        holder.date.setText(date);
        holder.distance.setText(distance);
    }

    @Override
    public int getItemCount() {
        return (dataCursor == null) ? 0 : dataCursor.getCount();
    }
}
Run Code Online (Sandbox Code Playgroud)

然后这是片段(你也可以使用一个活动)

public class RecordFragment extends Fragment implements LoaderManager.LoaderCallbacks<Cursor> {
    private RecyclerView recyclerView;
    RecordAdapter adapter;
    private int LOADER_ID = 1;

    @Override
    public View onCreateView(LayoutInflater inflater,
                             @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.record_layout, container, false);

        recyclerView = (RecyclerView) rootView.findViewById(R.id.recycler_view_record);
        recyclerView.setHasFixedSize(true);
        recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));

        FloatingActionButton fab = (FloatingActionButton) rootView.findViewById(R.id.fab_record);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Log.d("RECORD_FRAGMENT", "FAB");
                startActivity(new Intent(getContext(), LineChartActivity.class));
            }
        });

        adapter = new RecordAdapter(getActivity(), null);
        recyclerView.setAdapter(adapter);
        return rootView;
    }

    @Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        getLoaderManager().initLoader(LOADER_ID, null, this);
    }

    @Override
    public Loader<Cursor> onCreateLoader(int id, Bundle args) {
        return new CursorLoader(getContext(), FitContract.RecordData.CONTENT_URI, null, null, null, null);
    }

    @Override
    public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
        adapter.swapCursor(data);
    }

    @Override
    public void onLoaderReset(Loader<Cursor> loader) {
        adapter.swapCursor(null);
    }
}
Run Code Online (Sandbox Code Playgroud)