Android:如何从bindView()方法外部访问viewHolder?
下面是我想要实现的示例代码Android:如何从bindView()方法外部访问viewHolder?,android,android-cursoradapter,android-viewholder,Android,Android Cursoradapter,Android Viewholder,下面是我想要实现的示例代码 public class ToDoCursorAdapter extends CursorAdapter { ...... public ToDoCursorAdapter(Context context, Cursor cursor) { super(context, cursor, 0); } @Override public View newView(Context context, Curso
public class ToDoCursorAdapter extends CursorAdapter {
......
public ToDoCursorAdapter(Context context, Cursor cursor) {
super(context, cursor, 0);
}
@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {
ViewHolderItem viewHolder = new ViewHolderItem();
View rowView = LayoutInflater.from(context).inflate(R.layout.listview, parent, false);
viewHolder.refTextV = (TextView) rowView.findViewById(R.id.refText);
viewHolder.buttonIRV = (Button) rowView.findViewById(R.id.buttonIR); //For Ref Text
.....
rowView.setTag(viewHolder);
return rowView;
}
@Override
public void bindView(final View view, final Context context, final Cursor cursor) {
final ViewHolderItem viewHolder = (ViewHolderItem) view.getTag();
......
viewHolder.refTextV.setText(ref);
......
}
public void hideShowAll(Button but) {
//I want to be able to acess BUTTONS/TEXTVIWEs from this function.
// Like viewHolder.refTextV.setText(ref) in binView
Toast.makeText(mContext, "Hello" , Toast.LENGTH_SHORT).show();
}
}
我试图从适配器中的另一个函数访问视图元素,如bindView
中的按钮
,TextView
另外,如果可以的话,请在你的答案中添加一点解释,这样我就可以理解它是如何工作的,也可以为将来学到一些东西
多谢各位
更新
我最后使用了notifyDataSetChanged()代码>在myhideShowAll()
中,而不是在那里访问ViewHolder
。我将更改存储在数组中,然后调用notifyDataSetChanged()
。它刷新了我的视图,并反映了我希望基于数组所做的更改
另外,我对让它为我工作也有意见,因为这里的一些评论提到要在构造函数
之后在新视图
之外声明ViewHolder
。这不是一个好主意。您将得到错误的ViewHolder
,而不是属于特定行的视图。尝试将下面的“ViewHolderItem ViewHolder”声明给构造函数,并在所有重写方法之外将其初始化为bindView方法尝试将下面的“ViewHolderItem ViewHolder”声明给构造函数在所有覆盖方法之外,先初始化ViewHolderItem
,然后在另一个方法中访问视图,如按钮
,文本视图
等
public class ToDoCursorAdapter extends CursorAdapter {
......
// initialize ViewHolderItem here
ViewHolderItem viewHolder = new ViewHolderItem();
@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {
//remove this line here
// ViewHolderItem viewHolder = new ViewHolderItem();
View rowView = LayoutInflater.from(context).inflate(R.layout.listview, parent, false);
viewHolder.refTextV = (TextView) rowView.findViewById(R.id.refText);
viewHolder.buttonIRV = (Button) rowView.findViewById(R.id.buttonIR); //For Ref Text
.....
rowView.setTag(viewHolder);
return rowView;
}
public void hideShowAll(Button but) {
//call it like this and do what you want
viewHolder.buttonIRV.setEnabled(false);
Toast.makeText(mContext, "Hello" , Toast.LENGTH_SHORT).show();
}
希望它能帮助您。首先,全局初始化您的ViewHolderItem
,然后您可以通过另一种方法访问视图,如按钮
、文本视图
等
public class ToDoCursorAdapter extends CursorAdapter {
......
// initialize ViewHolderItem here
ViewHolderItem viewHolder = new ViewHolderItem();
@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {
//remove this line here
// ViewHolderItem viewHolder = new ViewHolderItem();
View rowView = LayoutInflater.from(context).inflate(R.layout.listview, parent, false);
viewHolder.refTextV = (TextView) rowView.findViewById(R.id.refText);
viewHolder.buttonIRV = (Button) rowView.findViewById(R.id.buttonIR); //For Ref Text
.....
rowView.setTag(viewHolder);
return rowView;
}
public void hideShowAll(Button but) {
//call it like this and do what you want
viewHolder.buttonIRV.setEnabled(false);
Toast.makeText(mContext, "Hello" , Toast.LENGTH_SHORT).show();
}
希望它能帮助您。试试这个:
public class ToDoCursorAdapter extends CursorAdapter {
......
public ToDoCursorAdapter(Context context, Cursor cursor) {
super(context, cursor, 0);
}
@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {
ViewHolderItem viewHolder = new ViewHolderItem();
View rowView = LayoutInflater.from(context).inflate(R.layout.listview, parent, false);
viewHolder.refTextV = (TextView) rowView.findViewById(R.id.refText);
viewHolder.buttonIRV = (Button) rowView.findViewById(R.id.buttonIR); //For Ref Text
.....
rowView.setTag(viewHolder);
return rowView;
}
@Override
public void bindView(final View view, final Context context, final Cursor cursor) {
final ViewHolderItem viewHolder = (ViewHolderItem) view.getTag();
......
viewHolder.refTextV.setText(ref);
......
}
public void hideShowAll(Button but, ViewHolderItem viewHolder) {
//I want to be able to acess BUTTONS/TEXTVIWEs from this function.
viewHolder.refTextV.setText("hello");
Toast.makeText(mContext, "Hello" , Toast.LENGTH_SHORT).show();
}
}
试试这个:
public class ToDoCursorAdapter extends CursorAdapter {
......
public ToDoCursorAdapter(Context context, Cursor cursor) {
super(context, cursor, 0);
}
@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {
ViewHolderItem viewHolder = new ViewHolderItem();
View rowView = LayoutInflater.from(context).inflate(R.layout.listview, parent, false);
viewHolder.refTextV = (TextView) rowView.findViewById(R.id.refText);
viewHolder.buttonIRV = (Button) rowView.findViewById(R.id.buttonIR); //For Ref Text
.....
rowView.setTag(viewHolder);
return rowView;
}
@Override
public void bindView(final View view, final Context context, final Cursor cursor) {
final ViewHolderItem viewHolder = (ViewHolderItem) view.getTag();
......
viewHolder.refTextV.setText(ref);
......
}
public void hideShowAll(Button but, ViewHolderItem viewHolder) {
//I want to be able to acess BUTTONS/TEXTVIWEs from this function.
viewHolder.refTextV.setText("hello");
Toast.makeText(mContext, "Hello" , Toast.LENGTH_SHORT).show();
}
}
在几乎所有情况下,您不需要在外部访问它。用例是什么?是否要在某些操作上更新recyclerView的部分/所有行?如果是,则更改相应元素的数据模型并调用adapter.notifyItemChanged(position)。问题是您不应该访问bindView之外的ViewHolder。@PraveenSingh此函数showHideAll()
是从按钮上的MainActivity
调用的。我有一个保存元素状态(可见性)的数组。我可以用它来显示/隐藏元素,但问题是我不知道如何刷新屏幕上的视图(如果这是合适的术语)。其余视图将在scroll上生效,因为它们将引用数组以了解其状态。这是我的第一个应用程序。'adapter.notifyItemChanged(position)`是否会刷新当前(屏幕上)视图的状态?谢谢您的回复。@PraveenSingh我正在使用ListView
。我的适配器不建议将notifyItemChanged()
作为有效方法。我有notifyDataSetChanged()
@pskink当前可见的一个。光标位置。其余视图将在重新循环时更新。我想在用户按下按钮时更新屏幕上可见的那个。如果我能找到如何在不丢失变量(它们的值)的情况下刷新当前视图,那么我可能不需要访问viewHolder。有什么想法吗?我尝试了notifyDataSetChanged()代码>来自MainActivity
但它似乎不起作用。在几乎所有情况下,您不需要在外部访问它。用例是什么?是否要在某些操作上更新recyclerView的部分/所有行?如果是,则更改相应元素的数据模型并调用adapter.notifyItemChanged(position)。问题是您不应该访问bindView之外的ViewHolder。@PraveenSingh此函数showHideAll()
是从按钮上的MainActivity
调用的。我有一个保存元素状态(可见性)的数组。我可以用它来显示/隐藏元素,但问题是我不知道如何刷新屏幕上的视图(如果这是合适的术语)。其余视图将在scroll上生效,因为它们将引用数组以了解其状态。这是我的第一个应用程序。'adapter.notifyItemChanged(position)`是否会刷新当前(屏幕上)视图的状态?谢谢您的回复。@PraveenSingh我正在使用ListView
。我的适配器不建议将notifyItemChanged()
作为有效方法。我有notifyDataSetChanged()
@pskink当前可见的一个。光标位置。其余视图将在重新循环时更新。我想在用户按下按钮时更新屏幕上可见的那个。如果我能找到如何在不丢失变量(它们的值)的情况下刷新当前视图,那么我可能不需要访问viewHolder。有什么想法吗?我尝试了notifyDataSetChanged()代码>来自MainActivity
,但它似乎不起作用。谢谢,你做到了。现在我面临另一个问题viewHolder.arTextV.setVisibility(v.GONE);`在该函数中,此“v”应设置为什么?这应该是一个视图
我不确定是哪一个。我试着用“视图”代替它,但它没有按预期工作。我希望textView
会消失,这是现在屏幕上的一个问题。没有。有什么想法吗?使用这个:viewHolder.arTextV.setVisibility(View.GONE);谢谢,你做到了。现在我面临另一个问题viewHolder.arTextV.setVisibility(v.GONE);`在该函数中,此“v”应设置为什么?这应该是一个视图
我不确定是哪一个。我试着用“视图”代替它,但它没有按预期工作。我希望textView
会消失,这是现在屏幕上的一个问题。没有。有什么想法吗?使用这个:viewHolder.arTextV.setVisibility(View.GONE);谢谢你的回复。是我干的。我现在的问题:现在我面临另一个问题viewHolder.arTextV.setVisibility(v.GONE);`在该函数中,此“v”应设置为什么?这应该是一个