Android:如何从外部bindView()方法访问viewHolder?
下面是我想要实现的示例代码。Android:如何从外部bindView()方法访问viewHolder?
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();
}
}
我试图在适配器内从另一个函数访问的视图元素,如Button
,TextView
在bindView
。
另外,如果可以的话,请添加一点解释,以便我能够理解它的工作原理,并可能为未来学习某些内容。
谢谢
更新
我终于在我的hideShowAll()
使用notifyDataSetChanged();
而不是在那里访问ViewHolder
。我将更改存储在数组中,然后调用notifyDataSetChanged()
。它刷新了我的观点,并根据阵列反映了我想要做出的更改。
此外,我有问题得到它为我工作,因为这里提到的一些意见宣称ViewHolder
newView
之后Constructor
。这不是一个好主意。你会得到错误的ViewHolder
,而不是属于某一行的。
试图声明“ViewHolderItem viewHolder”下面的构造函数和所有覆盖方法之外,并初始化成bindView方法
谢谢你,做到了。 现在我正面临另一个问题。 'viewHolder.arTextV.setVisibility(v.GONE);'在这个函数中应该设置什么'v'?这应该是一个'视图'我不知道哪一个。我在它的位置尝试了“视图”,但它没有按预期工作。我期望'textView'消失,现在是一个屏幕。它没有。 有什么想法? –
使用这个:viewHolder.arTextV.setVisibility(View.GONE); –
首先,初始化ViewHolderItem
全球范围内,那么你可以访问诸如Button
,TextView
等你的看法在另一个method
这样。
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();
}
希望它能帮助你。
谢谢你的回应。 是否做到了。 我现在的问题: 现在我正面临另一个问题。 'viewHolder.arTextV.setVisibility(v.GONE);'在这个函数中应该设置什么'v'?这应该是一个'视图'我不知道哪一个。我在它的位置尝试了“视图”,但它没有按预期工作。我期望'textView'消失,现在是一个屏幕。它没有。 有什么想法? –
'viewHolder.buttonIRV.setEnabled(View.GONE);'尝试像这样 – HassanUsman
试过了,akhi。没有工作。 我认为这是行不通的。我将更新一个数组以跟踪元素的状态,然后调用'notifyDataSetChanged()'。试图让这种方法奏效。 –
试试这个:
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();
}
}
无法将'ViewHolderItem'传递给'hideShowAll()'。该功能正在被其他活动调用。 谢谢你的回应 –
几乎在所有的情况下,你并不需要外部访问它。 什么是用例?您想在某些操作中更新某些/所有recyclerView行吗?如果是,则更改相应元素的数据模型并调用adapter.notifyItemChanged(position)。 –
事情是**你不应该访问ViewHolder外部bindView **。 –
@PraveenSingh Thi函数'showHideAll()'正在通过'MainActivity'在一个Button上调用我有一个数组来保存元素的状态(可见性)。我可以用它来显示/隐藏元素,但问题是我不知道如何刷新(如果这是适当的术语)屏幕上的视图。其余视图将在滚动上生效,因为它们将引用数组的状态。 这是我的第一个应用程序。 'adapter.notifyItemChanged(position)'刷新当前(屏幕上)视图的状态吗? 感谢您的回复。 –