【问题标题】:Pass data from recyclerview to activity with a cursor使用游标将数据从 recyclerview 传递到活动
【发布时间】:2018-10-12 15:11:40
【问题描述】:

我有与recyclervView其与光标得到SQLite数据库的数据的应用。现在,我想这些DATAS传递到另一个活动时,我们点击一个项目。它可以通过DATAS与光标? 并获得行的ID数据库,以确定数据? P>

第二个问题,这对于itemOnClick方法更好的解决方案?当我用这个方法(在viewHolder类?还是在onBindValue?) 我需要把在putExtra方法?我的光标? P>

我的适配器和保持器的代码低于如果可以帮助:

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 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,但我不知道如何使用它,这个是什么专业。 P>

编辑

我试图抓住我的意图在新的活动,但应用程序崩溃。 我收到了这个错误:

致命异常:主 过程:morpheus.oniri,PID:6696 了java.lang.RuntimeException:无法启动活动 ComponentInfo {morpheus.oniri / morpheus.oniri.activities.afficherCarnetActivity}: 显示java.lang.NullPointerException:尝试调用虚拟方法 “布尔java.lang.String.isEmpty()”上的空对象引用 在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2325) 在android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2387) 在android.app.ActivityThread.access $ 800(ActivityThread.java:151) 在android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1303) 在android.os.Handler.dispatchMessage(Handler.java:102) 在 android.os.Looper.loop(Looper.java:135) 在android.app.ActivityThread.main(ActivityThread.java:5254) 在 java.lang.reflect.Method.invoke(本机方法) 在 java.lang.reflect.Method.invoke(Method.java:372) 在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:903) 在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698) 显示java.lang.NullPointerException:通过引起尝试调用虚拟方法 “布尔java.lang.String.isEmpty()”上的空对象引用 在morpheus.oniri.activities.afficherCarnetActivity.getAllData(afficherCarnetActivity.java:113) 在morpheus.oniri.activities.afficherCarnetActivity.onCreate(afficherCarnetActivity.java:107) 在android.app.Activity.performCreate(Activity.java:5990) 在android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1106) 在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2278) 在android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2387) 在android.app.ActivityThread.access $ 800(ActivityThread.java:151) 在android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1303) 在android.os.Handler.dispatchMessage(Handler.java:102) 在 android.os.Looper.loop(Looper.java:135) 在android.app.ActivityThread.main(ActivityThread.java:5254) 在 java.lang.reflect.Method.invoke(本机方法) 在 java.lang.reflect.Method.invoke(Method.java:372) 在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:903) 在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698) P>

我这样做在OnCreate()。 P>

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

该错误是在这条线,在我称为在OnCreate(方法getAllData()) P>

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()我的字符串变量“笔记”为空,但如果我我就“carnetP”做Log.d()我有这个 P>

morpheus.oniri.model.Carnet@14dbb242 而这是不是存储在我的数据库。 P>

我做了我putExtra上点击这样 P>

公共类GroceryViewHolder延伸RecyclerView.ViewHolder器具View.OnClickListener { 公众的TextView dateItem,colorItem,textItem; 公共切换按钮lucidItem; P>

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);
    }

}

}

【问题讨论】:

    标签: android sqlite android-recyclerview cursor


    【解决方案1】:

    这是 Parcelable 类:

    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];
        }
    };
    }
    

    现在您将此类的对象传递给第二个活动。

    intent.putExtra("key",carnetdata );
    

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

    这个错误是因为你传递了骆驼类的新对象,它的所有字段都为空值。你应该传递对象点击了哪个项目。

    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();
        }
    }
    

    }

    【讨论】:

    • 我编辑了我的帖子,我收到了一个报告值为空的错误
    • 你通过了:intent.putExtra("data", new Carnet());这里新的 Carnet 对象的所有字段都为空值。
    • 您应该传递骆驼对象,这些对象是单击的项目而不是传递新对象
    • 谢谢,我只是添加了一些修改,我需要使用 ArrayList 扩展我的 Carnet() 并将我的列表调用投射到 putExtra 中:intent.putExtra("data", (Parcelable) mListCarnet.get(position)); with parcelable cast这很好用!非常感谢
    • 欢迎@M.Dupont
    猜你喜欢
    • 1970-01-01
    • 2022-01-17
    • 1970-01-01
    • 2011-02-11
    • 1970-01-01
    • 2011-12-14
    • 1970-01-01
    • 1970-01-01
    • 2021-05-11
    相关资源
    最近更新 更多