简体   繁体   English

如何在RecyclerView中使用光标适配器制作一张以上的卡?

[英]How to make more than one card in RecyclerView that uses cursor adapter?

I'm using a grid layout in RecyclerView in which each card displays some information from an SQLite Database using cursor adapter and cursor loader. 我在RecyclerView中使用网格布局,其中每张卡都使用光标适配器和光标加载器显示SQLite数据库中的某些信息。 I've used a library for achieving this. 我已经使用一个来实现这一目标。

The problem is all the cards are not getting displayed. 问题是所有卡都没有显示。 When I run the app for the first time, only one card is displayed which shows data from the last row of the database. 当我第一次运行该应用程序时,仅显示一张卡,其中显示了数据库最后一行的数据。 But I want it to show data from the first row. 但是我希望它显示第一行的数据。 If I close and run the app again, two cards are displayed but both cards have same data, that is from the last row of the database again. 如果我关闭并再次运行该应用程序,将显示两张卡,但是两张卡具有相同的数据,即再次来自数据库的最后一行。 I want the second card to display data from second row. 我希望第二张卡显示第二行的数据。 The third time, three cards are displayed and the pattern continues. 第三次,显示三张卡,并且图案继续。

Please help me to display the exact required number of cards each time that takes data from the corresponding row in the database. 每次从数据库中相应行获取数据时,请帮助我显示所需的确切卡数。

MainActivity.java MainActivity.java

public class MainActivity extends AppCompatActivity implements LoaderManager.LoaderCallbacks<Cursor>  {

    private RecyclerView recyclerView;
    private RecyclerViewAdapter adapter;

    ContentResolver contentResolver;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        contentResolver = getContentResolver();

        insertRecipes();

        recyclerView = (RecyclerView) findViewById(R.id.recycler_view);

        adapter = new RecyclerViewAdapter(getBaseContext());

        Log.v("MainActivity", "instantiating adapter");

        recyclerView.setAdapter(adapter);

        Log.v("MainActivity", "setting adapter");

        recyclerView.setLayoutManager(new GridLayoutManager(getBaseContext(), 2));

        Log.v("MainActivity", "setting layout manager for recycler view");

        getSupportLoaderManager().initLoader(0, null, this);
    }

    @Override
    protected void onStart() {
        super.onStart();
    }


    private void insertRecipes()
    {
        ContentValues values = new ContentValues();
        values.put(AppytizerEntry.COLUMN_APPYTIZER_NAME, "test name 1");
        values.put(AppytizerEntry.COLUMN_APPYTIZER_INGREDIENTS, "chips, salt, pepper");
        values.put(AppytizerEntry.COLUMN_APPYTIZER_DIRECTIONS, "mix chips, salt and pepper. eat it");
        values.put(AppytizerEntry.COLUMN_APPYTIZER_TOFDISH, AppytizerEntry.TOFDISH_VEGETARIAN);
        values.put(AppytizerEntry.COLUMN_APPYTIZER_COURSE, AppytizerEntry.COURSE_SNACKS);
        values.put(AppytizerEntry.COLUMN_APPYTIZER_TIME, 2);
        values.put(AppytizerEntry.COLUMN_APPYTIZER_CALORIES, 100);
        //values.put(AppytizerEntry.COLUMN_APPYTIZER_IMAGE, );

        values.put(AppytizerEntry.COLUMN_APPYTIZER_NAME, "test name 2");
        values.put(AppytizerEntry.COLUMN_APPYTIZER_INGREDIENTS, "chips, salt, pepper");
        values.put(AppytizerEntry.COLUMN_APPYTIZER_DIRECTIONS, "mix chips, salt and pepper. eat it");
        values.put(AppytizerEntry.COLUMN_APPYTIZER_TOFDISH, AppytizerEntry.TOFDISH_VEGETARIAN);
        values.put(AppytizerEntry.COLUMN_APPYTIZER_COURSE, AppytizerEntry.COURSE_SNACKS);
        values.put(AppytizerEntry.COLUMN_APPYTIZER_TIME, 2);
        values.put(AppytizerEntry.COLUMN_APPYTIZER_CALORIES, 100);
        //values.put(AppytizerEntry.COLUMN_APPYTIZER_IMAGE, );

        values.put(AppytizerEntry.COLUMN_APPYTIZER_NAME, "test name 3");
        values.put(AppytizerEntry.COLUMN_APPYTIZER_INGREDIENTS, "chips, salt, pepper");
        values.put(AppytizerEntry.COLUMN_APPYTIZER_DIRECTIONS, "mix chips, salt and pepper. eat it");
        values.put(AppytizerEntry.COLUMN_APPYTIZER_TOFDISH, AppytizerEntry.TOFDISH_VEGETARIAN);
        values.put(AppytizerEntry.COLUMN_APPYTIZER_COURSE, AppytizerEntry.COURSE_SNACKS);
        values.put(AppytizerEntry.COLUMN_APPYTIZER_TIME, 2);
        values.put(AppytizerEntry.COLUMN_APPYTIZER_CALORIES, 100);
        //values.put(AppytizerEntry.COLUMN_APPYTIZER_IMAGE, );

        values.put(AppytizerEntry.COLUMN_APPYTIZER_NAME, "test name 4");
        values.put(AppytizerEntry.COLUMN_APPYTIZER_INGREDIENTS, "chips, salt, pepper");
        values.put(AppytizerEntry.COLUMN_APPYTIZER_DIRECTIONS, "mix chips, salt and pepper. eat it");
        values.put(AppytizerEntry.COLUMN_APPYTIZER_TOFDISH, AppytizerEntry.TOFDISH_VEGETARIAN);
        values.put(AppytizerEntry.COLUMN_APPYTIZER_COURSE, AppytizerEntry.COURSE_SNACKS);
        values.put(AppytizerEntry.COLUMN_APPYTIZER_TIME, 2);
        values.put(AppytizerEntry.COLUMN_APPYTIZER_CALORIES, 100);
        //values.put(AppytizerEntry.COLUMN_APPYTIZER_IMAGE, );

        values.put(AppytizerEntry.COLUMN_APPYTIZER_NAME, "test name 5");
        values.put(AppytizerEntry.COLUMN_APPYTIZER_INGREDIENTS, "chips, salt, pepper");
        values.put(AppytizerEntry.COLUMN_APPYTIZER_DIRECTIONS, "mix chips, salt and pepper. eat it");
        values.put(AppytizerEntry.COLUMN_APPYTIZER_TOFDISH, AppytizerEntry.TOFDISH_VEGETARIAN);
        values.put(AppytizerEntry.COLUMN_APPYTIZER_COURSE, AppytizerEntry.COURSE_SNACKS);
        values.put(AppytizerEntry.COLUMN_APPYTIZER_TIME, 2);
        values.put(AppytizerEntry.COLUMN_APPYTIZER_CALORIES, 100);
        //values.put(AppytizerEntry.COLUMN_APPYTIZER_IMAGE, );

        Uri returnedUri = contentResolver.insert(AppytizerEntry.CONTENT_URI, values);

    }

    @Override
    public Loader<Cursor> onCreateLoader(int id, Bundle args) {

        String[] projection = {
                AppytizerEntry._ID,
                AppytizerEntry.COLUMN_APPYTIZER_NAME
        };

        Uri CONTENT_URI = AppytizerEntry.CONTENT_URI;
        CursorLoader cursorLoader = new CursorLoader(this, CONTENT_URI, projection, null, null, null);

        return cursorLoader;

    }

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

    @Override
    public void onLoaderReset(Loader<Cursor> loader) {
        adapter.swapCursor(null);
    }
}

RecyclerViewAdapter.java RecyclerViewAdapter.java

public class RecyclerViewAdapter extends RecyclerViewCursorAdapter<RecyclerViewAdapter.MyViewHolder> {

public RecyclerViewAdapter(Context context)
{
    super(context);

    setupCursorAdapter(null, 0, R.layout.custom_row, false);

    Log.v("Adapter", "RecyclerViewAdapter constructor");
}


@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    Log.v("Adapter", "onCreateViewHolder");
    return new MyViewHolder(mCursorAdapter.newView(mContext, mCursorAdapter.getCursor(), parent));
}

@Override
public void onBindViewHolder(MyViewHolder holder, int position) {

    Log.v("Adapter", "onBindViewHolder");

    mCursorAdapter.getCursor().moveToFirst();

    Log.v("Adapter", "moving to position " + position);

    setViewHolder(holder);
    mCursorAdapter.bindView(null, mContext, mCursorAdapter.getCursor());        
}

public class MyViewHolder extends RecyclerViewCursorViewHolder {

    public final TextView title;

    public MyViewHolder(View view)
    {
        super(view);

        Log.v("Adapter", "MyViewHolder constructor");

        title = (TextView) view.findViewById(R.id.title);
    }

    int i = 0;

    @Override
    public void bindCursor(Cursor cursor) {
        int titleColumnIndex = cursor.getColumnIndex(AppytizerContract.AppytizerEntry.COLUMN_APPYTIZER_NAME);

        title.setText(cursor.getString(titleColumnIndex));

        if(i<4)
        {
            cursor.moveToNext();
            i++;
        }

        Log.v("Adapter", "bindCursor");
    }
}

} }

I am not very familiar with ContentValues, but shouldn't you have an database.insert(TABLE_NAME, null, contentValues); 我对ContentValues不太熟悉,但您不应该拥有一个database.insert(TABLE_NAME, null, contentValues); between each test record? 每个测试记录之间?

Code example for ContentValues ContentValues的代码示例

That would explain that you see only the last record the first time, and a duplication the second time you run the app. 这将说明您第一次仅看到最后一条记录,而第二次运行该应用程序则看到重复记录。

更好的方法是使用ContentResolver.bulkInsert。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM