【问题标题】:Implementing EmptyView with Recyclerview with Sqlite Cursor使用 Recyclerview 和 Sqlite 游标实现 EmptyView
【发布时间】:2018-07-06 00:28:52
【问题描述】:

在过去的几个小时里,我一直在尝试为我的 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">

 //....

【问题讨论】:

    标签: android sqlite android-recyclerview


    【解决方案1】:

    编辑:我想出了一个解决方案。我最终在我的加载器中添加了额外的代码。

     @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。

    【讨论】:

      猜你喜欢
      • 2016-04-25
      • 1970-01-01
      • 2014-11-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-10
      • 2023-03-18
      • 1970-01-01
      相关资源
      最近更新 更多