如何访问 RecyclerView 中 TextView 中显示的字符串(使用游标)?
How to access String displayed in a TextView in RecyclerView (using a Cursor)?
由于 pskink 在 . After doing some research (based on the 问题的答案下方的评论,我编写了直接使用 Cursor 的代码)和实验我发现将 setOnClickListener() 移动到 ViewHolder 并添加 onClick() 作为其方法,我可以访问 TextView 但无法获取 String 值。
m游标已初始化:
public SelectPetNameAdapter(Context context, Cursor cursor) {
this.mContext = context;
mCursor = cursor;
//TEST: the following is here to verify that the Cursor is passed to this class. It is.
int cnt = getItemCount();
Log.d("Cursor count is", " " + cnt);
}
onClick 所在的代码:
public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
public TextView tvName;
public View mView;
public ViewHolder(View itemView) {
super(itemView);
Log.d("Instantiating", "ViewHolder");
itemView.setOnClickListener(this);
tvName = (TextView) itemView.findViewById(R.id.petname);
mView = itemView;
}
@Override
public void onClick(View v){
Log.d("Entered", "onClick in ViewHolder");
int mPosition = getLayoutPosition();
String name = mCursor.getString(0);
int rowId = mCursor.getPosition();
Intent intent = new Intent(mContext, PetInformationActivity.class);
long holderId = itemView.getId();
String holderName = itemView.toString();
int viewId = v.getId();
mCursor.moveToPosition(mPosition);
Log.d("Entered", "setOnClickListener in SelectPetNameAdapter");
Log.d("holderId is", " " + holderId);
Log.d("holderName is", " " + holderName);
Log.d("viewId is", " " + viewId);
Log.d("position is", " " + mPosition);
Log.d("Pet ID is", " " + rowId);
Log.d("Pet name is", " " + name);
Bundle extras = new Bundle();
extras.putString(NAME_KEY, name);
intent.putExtras(extras);
mContext.startActivity(intent);
}
}
虽然这确实提供了对 TextView 的字符串的访问,但显示的名称与单击的 TextView 不同步。如下图LOGCAT第一个Position是:2是被点击的TextView的位置但是Pet ID:0和Pet name:qwerty是上一次点击的Cursor值。再次点击后 Position is: 8 是被点击的 TextView 和 Pet ID: 2 and the Pet name 的位置: fert 是上次点击的 Cursor 的值!
LOGCAT
Entered: onClick in ViewHolder
Entered: setOnClickListener in SelectPetNameAdapter
holderId is: 2131558581
holderName is: android.support.v7.widget.AppCompatTextView{b3adb53 V.ED..C.. ...P.... 0,98-1056,147 #7f0d00b5 app:id/petname}
viewId is: 2131558581
Position is: 2
Pet ID is: 0
Pet name is: qwerty
Entered: onCreate in PetInformatioActivity
petName (from Bundle) is: qwerty
Id (from Bundle) is: null
Entered: onClick in ViewHolder
Entered: setOnClickListener in SelectPetNameAdapter
holderId is: 2131558581
holderName is: android.support.v7.widget.AppCompatTextView{45fe03c V.ED..C.. ...P.... 0,392-1056,441 #7f0d00b5 app:id/petname}
viewId is: 2131558581
Position is: 8
Pet ID is: 2
Pet name is: fert
Entered: onCreate in PetInformatioActivity
petName (from Bundle) is: fert
Id (from Bundle) is: null
但是,虽然当前点击的位置是正确的,但如何访问被点击的 TextView 中的字符串,而不是光标中的前一个字符串?
我相信我已经找到了在使用 Cursor 时获取被点击的 TextView 的字符串的解决方案。它确实如 中所述:
- 将 OnClickListener 设置为 ViewHolder 中的视图(这是在 itemView.setOnClickListener(this);)
中完成的
- 在 onClick 中获取视图的位置(这是在 int mPosition = getLayoutPosition(); 中完成的)。
- 在 onClick 中将 Cursor 设置为指向视图的位置(这是在 mCursor.moveToPosition(mPosition); 中完成的)。
现在可以在下一个 Activity 中访问和使用 String 对象。
public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
public TextView tvName;
public View mView;
public ViewHolder(View itemView) {
super(itemView);
itemView.setOnClickListener(this);
tvName = (TextView) itemView.findViewById(R.id.petname);
mView = itemView;
}
@Override
public void onClick(View v){
int mPosition = getLayoutPosition();
mCursor.moveToPosition(mPosition);
String name = mCursor.getString(0);
Intent intent = new Intent(mContext, PetInformationActivity.class);
Bundle extras = new Bundle();
extras.putString(NAME_KEY, name);
intent.putExtras(extras);
mContext.startActivity(intent);
}
}
由于 pskink 在
m游标已初始化:
public SelectPetNameAdapter(Context context, Cursor cursor) {
this.mContext = context;
mCursor = cursor;
//TEST: the following is here to verify that the Cursor is passed to this class. It is.
int cnt = getItemCount();
Log.d("Cursor count is", " " + cnt);
}
onClick 所在的代码:
public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
public TextView tvName;
public View mView;
public ViewHolder(View itemView) {
super(itemView);
Log.d("Instantiating", "ViewHolder");
itemView.setOnClickListener(this);
tvName = (TextView) itemView.findViewById(R.id.petname);
mView = itemView;
}
@Override
public void onClick(View v){
Log.d("Entered", "onClick in ViewHolder");
int mPosition = getLayoutPosition();
String name = mCursor.getString(0);
int rowId = mCursor.getPosition();
Intent intent = new Intent(mContext, PetInformationActivity.class);
long holderId = itemView.getId();
String holderName = itemView.toString();
int viewId = v.getId();
mCursor.moveToPosition(mPosition);
Log.d("Entered", "setOnClickListener in SelectPetNameAdapter");
Log.d("holderId is", " " + holderId);
Log.d("holderName is", " " + holderName);
Log.d("viewId is", " " + viewId);
Log.d("position is", " " + mPosition);
Log.d("Pet ID is", " " + rowId);
Log.d("Pet name is", " " + name);
Bundle extras = new Bundle();
extras.putString(NAME_KEY, name);
intent.putExtras(extras);
mContext.startActivity(intent);
}
}
虽然这确实提供了对 TextView 的字符串的访问,但显示的名称与单击的 TextView 不同步。如下图LOGCAT第一个Position是:2是被点击的TextView的位置但是Pet ID:0和Pet name:qwerty是上一次点击的Cursor值。再次点击后 Position is: 8 是被点击的 TextView 和 Pet ID: 2 and the Pet name 的位置: fert 是上次点击的 Cursor 的值!
LOGCAT
Entered: onClick in ViewHolder
Entered: setOnClickListener in SelectPetNameAdapter
holderId is: 2131558581
holderName is: android.support.v7.widget.AppCompatTextView{b3adb53 V.ED..C.. ...P.... 0,98-1056,147 #7f0d00b5 app:id/petname}
viewId is: 2131558581
Position is: 2
Pet ID is: 0
Pet name is: qwerty
Entered: onCreate in PetInformatioActivity
petName (from Bundle) is: qwerty
Id (from Bundle) is: null
Entered: onClick in ViewHolder
Entered: setOnClickListener in SelectPetNameAdapter
holderId is: 2131558581
holderName is: android.support.v7.widget.AppCompatTextView{45fe03c V.ED..C.. ...P.... 0,392-1056,441 #7f0d00b5 app:id/petname}
viewId is: 2131558581
Position is: 8
Pet ID is: 2
Pet name is: fert
Entered: onCreate in PetInformatioActivity
petName (from Bundle) is: fert
Id (from Bundle) is: null
但是,虽然当前点击的位置是正确的,但如何访问被点击的 TextView 中的字符串,而不是光标中的前一个字符串?
我相信我已经找到了在使用 Cursor 时获取被点击的 TextView 的字符串的解决方案。它确实如
- 将 OnClickListener 设置为 ViewHolder 中的视图(这是在 itemView.setOnClickListener(this);) 中完成的
- 在 onClick 中获取视图的位置(这是在 int mPosition = getLayoutPosition(); 中完成的)。
- 在 onClick 中将 Cursor 设置为指向视图的位置(这是在 mCursor.moveToPosition(mPosition); 中完成的)。
现在可以在下一个 Activity 中访问和使用 String 对象。
public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
public TextView tvName;
public View mView;
public ViewHolder(View itemView) {
super(itemView);
itemView.setOnClickListener(this);
tvName = (TextView) itemView.findViewById(R.id.petname);
mView = itemView;
}
@Override
public void onClick(View v){
int mPosition = getLayoutPosition();
mCursor.moveToPosition(mPosition);
String name = mCursor.getString(0);
Intent intent = new Intent(mContext, PetInformationActivity.class);
Bundle extras = new Bundle();
extras.putString(NAME_KEY, name);
intent.putExtras(extras);
mContext.startActivity(intent);
}
}