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线程上调用
我希望你得到正确的答案.我有同样的问题并做了一些很好的搜索,最后得出了这个.
这是适配器
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)
| 归档时间: |
|
| 查看次数: |
7485 次 |
| 最近记录: |