- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个 RecyclerView
,用于显示使用 LoaderManager
从内容提供者获取的数据。它工作正常,但我注意到加载大数据时我的以下实现存在一些性能问题,显示数据时存在延迟,因为我使用 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);
}
所以我选择执行以下操作:
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
........
adapter = new FavoritesAdapter(getActivity(),Favorites);
favoritesRecyclerView.setAdapter(adapter);
........
然后在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();
}
使用这个什么都不会显示。问题是什么,因为 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();
}
}
然后这是 fragment (你也可以使用一个 Activity )
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);
}
}
关于android - 将 RecyclerView 与来自 LoaderManager 的数据一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32992239/
我想了解 LoaderManager 做了什么。任何人都可以分享一个例子吗?创建游标时必须使用它们吗?如果不是应该怎么用?非常感谢一个简单的例子。 最佳答案 简单地说,LoaderManager 负责
我正在使用 LoaderManager 从我的手机加载联系人列表的光标。 我实际上只使用此处给出的示例代码: http://developer.android.com/reference/androi
在您的 LoaderManager 中识别 Loader 时,您使用唯一的 ID。我在问这些 id 必须有多独特。 是否每个 Activity 和 fragment 都有自己的 LoaderManag
使用 Loaders 创建 Android 应用程序时,是否每个 Activity 和 Fragment 都有自己的 LoaderManager ?还是应该只有一个LoaderManager应用程序拥
嗨,请有人帮忙,我正在尝试创建一个基本的加载程序。我见过的有关加载器的所有文档都涉及以下内容: public class MyActivity extends Activity
当使用 LoaderManager 时,我是否仍然按照过去的方式管理我的数据库写入并让 Loader 获取更改?我正在为应用程序转换和添加功能,但我仍在适应 Android 平台。 最佳答案 如果您正
restartLoader(int id, Bundle args, LoaderCallbacks callback)创建一个全新的加载器对象?或者它只是通过重置其内部状态来重用旧的? 感谢您的帮助
我有一个 Android 应用,它有一个我经常更新的 Content Provider。为了加载上述数据的列表,我使用了 LoaderManager。 在详细信息页面上,我也使用 LoaderMana
我需要销毁一个加载器,有时我会得到以下异常: java.lang.NullPointerException at android.support.v4.app.FragmentManagerImpl.
好吧,我投降。我想不通。 我正在学习 Udacity 的 Android 基础类(class),需要弄清楚如何使用加载程序加载数据。但是,当我使用以下行时,“this”以红色突出显示并显示以下错误:
我正在构建一个包含 2 个 fragment 的(主从) View :aListFragment 和更详细的 Fragment View 。单击任何项目在列表中显示详细信息 View 。对于 Li
我正在尝试将我的代码从使用游标转换为使用 CursorLoaders。为了支持旧版本的 Android,我安装了支持库,而不是导入 android.content.CursorLoader,而是导入
在 Android 中使用 LoaderManager API 加载依赖查询的首选方法是什么?到目前为止,我能想到的最好的方法是: @Override public void onCreate( Bu
我正在使用 Fragments 和 LoaderManager。我必须启动未知数量的任务,并且它们可能会并行运行(否则我只会重复使用一个加载器)。例如,我有一个 ListView ,每一行可能都有一个
这是我的应用的层次结构: ViewPager 中的 3 个 fragment 包含一个 FrameLayout: 加载微调器,在搜索数据以填充 ListView 时可见。 显示消息的 LinearLa
我有一个使用自定义加载器和光标设置的数据加载系统,该系统在 Activity 和 fragment 中运行良好,但服务中没有加载器管理器(我可以找到)。有谁知道为什么 LoaderManager 被排
这个问题已经有答案了: What is the appropriate replacement of deprecated getSupportLoaderManager()? (6 个回答) 已关闭
我在项目中遇到了 LoaderCallbacks 问题。我已经在 android studio 中实现了 LoaderManager 。每当用户按下搜索按钮时,我都会尝试重新启动加载程序。 publi
我想我了解加载程序应该如何工作等,但我不太确定加载程序如何向 LoaderManager 或应用程序发出未成功完成的信号。执行此操作的最佳方法是什么? 最佳答案 没有内置的方式。捕获所有异常,并返回一
我正在开发一个 android 项目,我需要在服务中使用 contentprovider 进行线程安全数据库相关操作。但是带有回调的 loadermanager 不能在服务中使用。具有回调和 cont
我是一名优秀的程序员,十分优秀!