为啥我的 onBindViewHolder () 根本没有运行,即使我的所有其他回收器视图方法都运行了?

Posted

技术标签:

【中文标题】为啥我的 onBindViewHolder () 根本没有运行,即使我的所有其他回收器视图方法都运行了?【英文标题】:Why does my onBindViewHolder () not run at all even though all my other recycler view methods run?为什么我的 onBindViewHolder () 根本没有运行,即使我的所有其他回收器视图方法都运行了? 【发布时间】:2020-11-30 02:46:10 【问题描述】:

我创建了一个recycler view,它应该在文本视图和图像视图中显示数据。但是我的适配器的onBindViewHolder () 没有运行。我的适配器中的所有其他方法都运行。我找不到onBindViewHolder () 不运行的原因,其他一切似乎都运行良好,只是我的数据没有显示在我的回收站视图的卡片视图中。任何帮助将不胜感激。

适配器代码:

package com.myapps.myapplication;

import android.content.Context;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import androidx.recyclerview.widget.RecyclerView;
import androidx.cardview.widget.CardView;

public class captionedImagesAdapter extends RecyclerView.Adapter <captionedImagesAdapter.ViewHolder> 

private Context context;
private Cursor cursor;

public captionedImagesAdapter (Context context, Cursor cursor) 
    this.context = context;
    this.cursor = cursor;


public captionedImagesAdapter.ViewHolder onCreateViewHolder (ViewGroup parent, int viewType) 
    LayoutInflater inflater = LayoutInflater.from(context);
    CardView cv = (CardView) inflater.inflate(R.layout.card_view, parent, false);

    return new ViewHolder (cv);


public void onBindViewHolder(ViewHolder holder, int position) 
    if (cursor.moveToPosition(position)) 
        return;
    

    String info_text = cursor.getString (0);
    byte [] info_image = cursor.getBlob(1);

    Bitmap bitmap = MyDatabaseHelper.getImages(info_image);

    holder.textView.setText(info_text);
    holder.imageView.setImageBitmap(bitmap);


public int getItemCount() 
    return cursor.getCount();


public static class ViewHolder extends RecyclerView.ViewHolder 
    private ImageView imageView;
    private TextView textView;

    public ViewHolder(CardView view) 
        super(view);
        imageView = view.findViewById(R.id.info_image);
        textView = view.findViewById(R.id.info_text);
    



数据库代码:

package com.myapps.myapplication;

import android.content.ContentValues;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.util.Log;

import java.io.ByteArrayOutputStream;
import java.util.ArrayList;

public class MyDatabaseHelper extends SQLiteOpenHelper 

private static final String DB_NAME = "starbuzz";
private static final int DB_VERSION = 5;
private Context context;
private ArrayList <Bitmap> bitmapArray;
private byte [] byteArray;

public MyDatabaseHelper(Context context) 
    super(context, DB_NAME, null, DB_VERSION);
    this.context = context;


@Override
public void onCreate(SQLiteDatabase db) 
    db.execSQL("CREATE TABLE GROCERY_ITEMS (" + "_id INTEGER PRIMARY KEY AUTOINCREMENT, " + "NAME TEXT, " + "IMAGE_RESOURCE_ID BLOB);");

    upgradeDatabase(db);


public void upgradeDatabase (SQLiteDatabase db) 
    convertToBitmap();
    byteArray = convertToByte();
    addItems(db);


public void convertToBitmap () 
    Bitmap faan = BitmapFactory.decodeResource(context.getResources(), R.drawable.faan);
    Bitmap milk = BitmapFactory.decodeResource (context.getResources(), R.drawable.milk);
    Bitmap egg = BitmapFactory.decodeResource (context.getResources(), R.drawable.egg);
    Bitmap toilet_tissue = BitmapFactory.decodeResource (context.getResources(), R.drawable.toilet_tissue);
    Bitmap kitchen_tissue = BitmapFactory.decodeResource (context.getResources(), R.drawable.kitchen_tissue);
    Bitmap bread = BitmapFactory.decodeResource (context.getResources(), R.drawable.bread);
    Bitmap potatoe = BitmapFactory.decodeResource (context.getResources(), R.drawable.potatoe);
    Bitmap onion = BitmapFactory.decodeResource (context.getResources(), R.drawable.onion);
    Bitmap flour = BitmapFactory.decodeResource (context.getResources(), R.drawable.flour);
    Bitmap tomatoe = BitmapFactory.decodeResource (context.getResources(), R.drawable.tomatoe);
    Bitmap corriandor = BitmapFactory.decodeResource (context.getResources(), R.drawable.corriandor);

    bitmapArray = new ArrayList <Bitmap> ();

    bitmapArray.add(faan);
    bitmapArray.add (milk);
    bitmapArray.add (egg);
    bitmapArray.add (toilet_tissue);
    bitmapArray.add (kitchen_tissue);
    bitmapArray.add (bread);
    bitmapArray.add (potatoe);
    bitmapArray.add (onion);
    bitmapArray.add (flour);
    bitmapArray.add (tomatoe);
    bitmapArray.add (corriandor);



public byte [] convertToByte () 

    ByteArrayOutputStream stream = new ByteArrayOutputStream ();

    for (Bitmap bitmap : bitmapArray) 
        bitmap.compress (Bitmap.CompressFormat.PNG, 0, stream);
    

    return stream.toByteArray();


public static Bitmap getImages (byte [] image) 
    return BitmapFactory.decodeByteArray(image, 0, image.length);


public void addItems (SQLiteDatabase db) 

    byte faan = byteArray [0];
    byte milk = byteArray [1];
    byte egg = byteArray [2];
    byte toilet_tissue = byteArray [3];
    byte kitchen_tissue = byteArray [4];
    byte bread = byteArray [5];
    byte potatoe = byteArray [6];
    byte onion = byteArray [7];
    byte flour = byteArray [8];
    byte tomatoe = byteArray [9];
    byte corriandor = byteArray [10];

    insertItems (db, "Faan", faan);
    insertItems (db, "Milk", milk);
    insertItems (db, "Egg", egg);
    insertItems (db, "Toilet Tissue", toilet_tissue);
    insertItems (db, "Kitchen Tissue", kitchen_tissue);
    insertItems (db, "Bread", bread);
    insertItems (db, "Potatoe", potatoe);
    insertItems (db, "Onion", onion);
    insertItems (db, "Flour", flour);
    insertItems (db, "Tomatoe", tomatoe);
    insertItems (db, "Corriandor", corriandor);



public void insertItems (SQLiteDatabase db, String name, byte image) 
    ContentValues contentValues = new ContentValues();
    contentValues.put ("NAME", name);
    contentValues.put ("IMAGE_RESOURCE_ID", image);

    db.insert ("GROCERY_ITEMS", null, contentValues);


@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) 
    db.execSQL("CREATE TABLE GROCERY_ITEMS (" + "_id INTEGER PRIMARY KEY AUTOINCREMENT, " + "NAME TEXT, " + "IMAGE_RESOURCE_ID BLOB);");

    upgradeDatabase(db);


Recycler查看代码:

package com.myapps.myapplication;

import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteException;
import android.os.Bundle;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.GridLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

public class grocery_item extends AppCompatActivity 

SQLiteDatabase db;
Cursor cursor;

protected void onCreate (Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);
    setContentView(R.layout.item_grocery);

    accessDataBase();

    RecyclerView groceryRecycler = (RecyclerView) findViewById(R.id.grocery_recycler_view);

    captionedImagesAdapter adapter = new captionedImagesAdapter (this, cursor);
    GridLayoutManager layoutManager = new GridLayoutManager(this, 2, GridLayoutManager.VERTICAL, false);
    groceryRecycler.setLayoutManager(layoutManager);
    groceryRecycler.setAdapter (adapter);


public void accessDataBase () 
    MyDatabaseHelper databaseHelper = new MyDatabaseHelper(this);

    try 

        db = databaseHelper.getReadableDatabase();

        cursor = db.query ("GROCERY_ITEMS", new String[] "NAME", "IMAGE_RESOURCE_ID", null, null, null, null, null);

     catch (SQLiteException e) 
        e.printStackTrace();
    


【问题讨论】:

【参考方案1】:

你马上从onBindViewHolder()返回:

if (cursor.moveToPosition(position)) 
    return;

moveToPosition() 成功返回 true。

【讨论】:

以上是关于为啥我的 onBindViewHolder () 根本没有运行,即使我的所有其他回收器视图方法都运行了?的主要内容,如果未能解决你的问题,请参考以下文章

为啥在 RecyclerView.Adapter 的 onBindViewHolder 中添加 OnClickListener 被认为是不好的做法?

如何在回收站视图的 onBindViewHolder() 方法中调用 getString()?

RecyclerView 不能在 onBindViewHolder() 中使用 setText()

在 onBindViewHolder 中为 RecyclerView 设置 Firebase 实时数据库参考中的图像

Android DiffUtil::onBindViewHolder 返回从列表中移除的位置

RecyclerView onCreateViewHolder 和 onBindViewHolder 没有被调用