android - 使用 Recyclerview 和 Sqlite 游标实现 EmptyView
问题描述
在过去的几个小时里,我一直在尝试为我的 RecyclerView 安装一个空视图。我发现的解决方案涉及创建新类并将空视图作为 XML 中的回收器视图放置在级别上。我理解后者,但我还没有看到用于 SQLite 数据库的 Java 解决方案。我使用的尝试将放入emptyview,但不会显示recyclerview 信息。有人可以帮我解决这个问题吗?
这是我的活动:
public class DisplayActivity extends AppCompatActivity implements
LoaderManager.LoaderCallbacks<Cursor>{
private static final int PRESCRIPTION_LOADER = 0;
private CustomCursorAdapter mAdapter;
RecyclerView mRecyclerView;
private static final String TAG = "MainTagName";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_display);
mRecyclerView = (RecyclerView) findViewById(R.id.recyclerView);
ViewGroup emptyView = findViewById(R.id.empty_view);
mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
mRecyclerView.addItemDecoration(new DividerItemDecoration(mRecyclerView.getContext(), DividerItemDecoration.VERTICAL));
mAdapter = new CustomCursorAdapter(this);
mRecyclerView.setAdapter(mAdapter);
if (mAdapter.getItemCount()==0) {
mRecyclerView.setVisibility(View.GONE);
emptyView.setVisibility(View.VISIBLE);
}else {
mRecyclerView.setVisibility(View.VISIBLE);
emptyView.setVisibility(View.GONE);
}
//Kick off the loader
getLoaderManager().initLoader(PRESCRIPTION_LOADER,null,this);
//….
@Override
public Loader<Cursor> onCreateLoader(int i, Bundle bundle) {
//….
@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
mAdapter.swapCursor(data);
Log.i(TAG,"Loader Manager Loading Finished: " + data.getCount());
}
@Override
public void onLoaderReset(Loader<Cursor> loader) {
mAdapter.swapCursor(null);
}
}
这是我的 RecyclerView 适配器:
public class CustomCursorAdapter extends
RecyclerView.Adapter<CustomCursorAdapter.MyTaskViewHolder>{
private Cursor mCursor;
private Context mContext;
public CustomCursorAdapter (Context mContext){
this.mContext = mContext;
}
@Override
public MyTaskViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.recycle_item, parent, false);
return new MyTaskViewHolder (view);
}
@Override
public void onBindViewHolder(CustomCursorAdapter.MyTaskViewHolder holder, int position) {
mCursor.moveToPosition(position);
//….
}
@Override
public int getItemCount() {
if (mCursor ==null){
return 0;
}
return mCursor.getCount();
}
public Cursor swapCursor(Cursor c) {
if (mCursor == c){
return null;
}
Cursor temp = mCursor;
this.mCursor = c;
if (c != null){
this.notifyDataSetChanged();
}
return temp;
}
class MyTaskViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{
//….
这是我的 RecyclerView XML:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior"
tools:context="com.cloiud.DisplayActivity"
tools:showIn="@layout/activity_display">
<android.support.v7.widget.RecyclerView
android:id="@+id/recyclerView"
android:layout_width="match_parent"
android:layout_height="match_parent"
/>
<include layout="@layout/empty_view"/>
这是我的空视图 XML:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/empty_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:visibility="gone"
android:gravity="center">
//....
解决方案
编辑:我想出了一个解决方案。我最终在我的加载器中添加了额外的代码。
@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
mAdapter.swapCursor(data);
Log.i(TAG,"Loader Manager Loading Finished: " + data.getCount());
if (mAdapter.getItemCount()== 0) {
mRecyclerView.setVisibility(View.GONE);
emptyView.setVisibility(View.VISIBLE);
}else {
mRecyclerView.setVisibility(View.VISIBLE);
emptyView.setVisibility(View.GONE);
}
}
我不确定它是否是正确的解决方案,但它的运行方式类似于 listview 的 emptyview。
推荐阅读
- c# - 自引用类
- mysql - 如何在 linux manjaro 上重置 mysql root 密码
- javascript - 如何首先检查我的 textarea 并在立即运行网站后使用 JS 显示内容
- javascript - 反应父组件从开关/路由中获取渲染元素的计数
- python - 如何有选择地将值映射到数据框的列中?
- grammar - 这种上下文无关的语法是明确的吗?
- c# - ASP.NET 5 中指定的 OpenApi/Swagger 版本在哪里
- r - ggplot2 条形图给出了奇怪的 y 轴
- c++ - 如何在将方法转换为引用和常量时保持 ABI 兼容性?
- flutter - 我无法从 Firestore 检索任何数据