使用游标将数据从 recyclerview 传递到 activity

Pass data from recyclerview to activity with a cursor

我有一个带有 recyclervView 的应用程序,它使用游标从 SQLite 数据库获取数据。现在,我想在单击某个项目时将这些数据传递给另一个 activity。可以用游标传递数据吗? 并获取行的 ID 以识别数据库中的数据?

第二个问题,对于 itemOnClick 方法,哪个是更好的解决方案?我在哪里使用此方法(在 viewHolder class 中?还是在 onBindValue 中?) 我需要在 putExtra 方法中添加什么?我的光标 ?

如果有帮助,我的适配器和支架代码如下:

public class GroceryAdapter extends RecyclerView.Adapter<GroceryAdapter.GroceryViewHolder> implements View.OnClickListener {

    private Context mContext;
    private Cursor mCursor;
    int id;


    public GroceryAdapter(Context context,Cursor cursor){
        mContext = context;
        mCursor = cursor;
    }

    @Override
    public void onClick(View v) {
    }

    public class GroceryViewHolder extends RecyclerView.ViewHolder{
        public TextView dateItem, colorItem, textItem;
        public ToggleButton lucidItem;


        public GroceryViewHolder(final View itemView) {
            super(itemView);
            dateItem = itemView.findViewById(R.id.date_item);
            colorItem = itemView.findViewById(R.id.color_item);
            textItem = itemView.findViewById(R.id.text_item);
            lucidItem = itemView.findViewById(R.id.lucid_item);

        }


    }

    @NonNull
    @Override
    public GroceryViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        LayoutInflater inflater = LayoutInflater.from(mContext);
        View view = inflater.inflate(R.layout.grocery_item, parent, false);
        return new GroceryViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull GroceryViewHolder holder, int position) {
        if(!mCursor.moveToPosition(position)){
            return;
        }
        final int id = mCursor.getInt(mCursor.getColumnIndex(CarnetDAO.ID_CARNET));
        String text = mCursor.getString(mCursor.getColumnIndex(CarnetDAO.TEXTE_CARNET));
        int color = mCursor.getInt(mCursor.getColumnIndex(CarnetDAO.COULEUR_CARNET));
        String date = mCursor.getString(mCursor.getColumnIndex(CarnetDAO.DATE_CARNET));
        int lucide = mCursor.getInt(mCursor.getColumnIndex(CarnetDAO.LUCIDITE_CARNET));

        holder.dateItem.setText(date);
        holder.colorItem.setBackgroundColor(color);
        holder.textItem.setText(text);

        if(lucide == 1){
            holder.lucidItem.setVisibility(View.VISIBLE);
        }
    }



    @Override
    public int getItemCount() {
        return mCursor.getCount();
    }

    public void swapCursor(Cursor newCursor){
        if(mCursor != null){
            mCursor.close();
        }
        mCursor = newCursor;
        if(newCursor != null){
            notifyDataSetChanged();
        }
    }

}

我的数据模型:

public class 单证册{

public Carnet(){
    super();
}

private int id;
private String text;
private String userId;
private int color;
private String method;
private String date;
private int lucid;


public int getId(){
    return id;
}

public void setId(int id){
    this.id = id;
}

public String getText(){
    return text;
}

public void setText(String text){
    this.text = text;
}

public int getLucid(){
    return lucid;
}

public void setLucid(int lucid){
    this.lucid = lucid;
}

public void setMethod(String method){
    this.method = method;
}

public String getMethod(){
    return method;
}

public void setDate(String date){
    this.date = date;
}

public String getDate(){
    return date;
}

public void setColor(int color){
    this.color = color;
}

public  int getColor(){
    return color;
}

}

我看到了 Parcelable,但我不知道如何使用它,它的特点是什么。

编辑

我试图在新 activity 中捕捉我的意图,但应用程序崩溃了。 我收到此错误:

FATAL EXCEPTION: main Process: morpheus.oniri, PID: 6696 java.lang.RuntimeException: Unable to start activity ComponentInfo{morpheus.oniri/morpheus.oniri.activities.afficherCarnetActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'boolean java.lang.String.isEmpty()' on a null object reference at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2325) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2387) at android.app.ActivityThread.access0(ActivityThread.java:151) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:135) at android.app.ActivityThread.main(ActivityThread.java:5254) at java.lang.reflect.Method.invoke(Native Method) at java.lang.reflect.Method.invoke(Method.java:372) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698) Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'boolean java.lang.String.isEmpty()' on a null object reference at morpheus.oniri.activities.afficherCarnetActivity.getAllData(afficherCarnetActivity.java:113) at morpheus.oniri.activities.afficherCarnetActivity.onCreate(afficherCarnetActivity.java:107) at android.app.Activity.performCreate(Activity.java:5990) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1106) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2278) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2387)  at android.app.ActivityThread.access0(ActivityThread.java:151)  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303)  at android.os.Handler.dispatchMessage(Handler.java:102)  at android.os.Looper.loop(Looper.java:135)  at android.app.ActivityThread.main(ActivityThread.java:5254)  at java.lang.reflect.Method.invoke(Native Method)  at java.lang.reflect.Method.invoke(Method.java:372)  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)

我在 onCreate() 中做了这个。

Intent i = getIntent();
Carnet carnetP;
carnetP = i.getParcelableExtra("data");
notes = carnetP.getText();

错误在这一行,在我在 onCreate() 中调用的方法 getAllData() 中

if(!notes.isEmpty()){
    dream.setVisibility(View.VISIBLE);
    getDream.setChecked(true);
    getDream.setBackgroundResource(R.color.colorLog);
} else{
    dream.setVisibility(View.GONE);
    getDream.setChecked(false);
    getDream.setBackgroundResource(R.color.colorText);
}

实际上,当我执行 Log.d() 时,我的字符串变量 "notes" 为空,但如果我在 "carnetP" 上执行 Log.d() 我已经明白了

morpheus.oniri.model.Carnet@14dbb242 And this is not what is stored in my database.

我是这样点击 putExtra 的

public class GroceryViewHolder 扩展 RecyclerView.ViewHolder 实现 View.OnClickListener{ public TextView dateItem, colorItem, textItem; public 切换按钮 lucidItem;

public GroceryViewHolder(final View itemView) {
    super(itemView);
    dateItem = itemView.findViewById(R.id.date_item);
    colorItem = itemView.findViewById(R.id.color_item);
    textItem = itemView.findViewById(R.id.text_item);
    lucidItem = itemView.findViewById(R.id.lucid_item);


    itemView.setOnClickListener(this); //my itemView clik
}


@Override
public void onClick(View v) {
    int pos = getAdapterPosition();
    if(pos != RecyclerView.NO_POSITION){
        Intent intent = new Intent(mContext, afficherCarnetActivity.class);
        intent.putExtra("data", new Carnet());
        mContext.startActivity(intent);
    }

}

}

这是 Parcelable class :

public class Camel implements Parcelable {
private int id;
private String text;
private String userId;
private int color;
private String method;
private String date;
private int lucid;

@Override
public int describeContents() {
    return 0;
}

@Override
public void writeToParcel(Parcel dest, int flags) {
    dest.writeInt(this.id);
    dest.writeString(this.text);
    dest.writeString(this.userId);
    dest.writeInt(this.color);
    dest.writeString(this.method);
    dest.writeString(this.date);
    dest.writeInt(this.lucid);
}

public Camel() {
}

protected Camel(Parcel in) {
    this.id = in.readInt();
    this.text = in.readString();
    this.userId = in.readString();
    this.color = in.readInt();
    this.method = in.readString();
    this.date = in.readString();
    this.lucid = in.readInt();
}

public static final Parcelable.Creator<Camel> CREATOR = new Parcelable.Creator<Camel>() {
    @Override
    public Camel createFromParcel(Parcel source) {
        return new Camel(source);
    }

    @Override
    public Camel[] newArray(int size) {
        return new Camel[size];
    }
};
}

现在你将这个 class 的对象传递给第二个 activity。

intent.putExtra("key",carnetdata );

不让我们讨论你的 NPE 错误。

出现此错误是因为您传递了新的 Camel 对象 class,它的所有字段都具有空值。您应该传递点击了哪个项目的对象。

public class GroceryAdapter extends RecyclerView.Adapter<GroceryAdapter.GroceryViewHolder> implements View.OnClickListener {

private Context mContext;
private Cursor mCursor;
List<Carnet> mListCarnet;
int id;


public GroceryAdapter(Context context,Cursor cursor){
    mContext = context;
    mCursor = cursor;
    mListCarnet=new ArrayList<>();
}

@Override
public void onClick(View v) {

int pos = getAdapterPosition();
    if(pos != RecyclerView.NO_POSITION){
    Intent intent = new Intent(mContext, afficherCarnetActivity.class);
    intent.putExtra("data", mListCarnet.get(pos));
    mContext.startActivity(intent);
    }
}

public class GroceryViewHolder extends RecyclerView.ViewHolder{
    public TextView dateItem, colorItem, textItem;
    public ToggleButton lucidItem;


    public GroceryViewHolder(final View itemView) {
        super(itemView);
        dateItem = itemView.findViewById(R.id.date_item);
        colorItem = itemView.findViewById(R.id.color_item);
        textItem = itemView.findViewById(R.id.text_item);
        lucidItem = itemView.findViewById(R.id.lucid_item);

        itemView.setOnClickListener(this); 
    }


}

@NonNull
@Override
public GroceryViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    LayoutInflater inflater = LayoutInflater.from(mContext);
    View view = inflater.inflate(R.layout.grocery_item, parent, false);
    return new GroceryViewHolder(view);
}

@Override
public void onBindViewHolder(@NonNull GroceryViewHolder holder, int position) {
    if(!mCursor.moveToPosition(position)){
        return;
    }
    final int id = mCursor.getInt(mCursor.getColumnIndex(CarnetDAO.ID_CARNET));
    String text = mCursor.getString(mCursor.getColumnIndex(CarnetDAO.TEXTE_CARNET));
    int color = mCursor.getInt(mCursor.getColumnIndex(CarnetDAO.COULEUR_CARNET));
    String date = mCursor.getString(mCursor.getColumnIndex(CarnetDAO.DATE_CARNET));
    int lucide = mCursor.getInt(mCursor.getColumnIndex(CarnetDAO.LUCIDITE_CARNET));

    holder.dateItem.setText(date);
    holder.colorItem.setBackgroundColor(color);
    holder.textItem.setText(text);


    Carnet carnet=new Carnet();
    carnet.setId(id);
    carnet.setText(text);
    carnet.setColor(color);
    carnet.setDate(date);
    carnet.setLucide.(lucide);
    mListCarnet.add(carnet);

    if(lucide == 1){
        holder.lucidItem.setVisibility(View.VISIBLE);
    }
}



@Override
public int getItemCount() {
    return mCursor.getCount();
}

public void swapCursor(Cursor newCursor){
    if(mCursor != null){
        mCursor.close();
    }
    mCursor = newCursor;
    if(newCursor != null){
        notifyDataSetChanged();
    }
}

}