使用游标将数据从 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();
}
}
}
我有一个带有 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();
}
}
}