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

我试图在适配器内从另一个函数访问的视图元素,如ButtonTextViewbindView

另外,如果可以的话,请添加一点解释,以便我能够理解它的工作原理,并可能为未来学习某些内容。

谢谢

更新

我终于在我的hideShowAll()使用notifyDataSetChanged();而不是在那里访问ViewHolder。我将更改存储在数组中,然后调用notifyDataSetChanged()。它刷新了我的观点,并根据阵列反映了我想要做出的更改。

此外,我有问题得到它为我工作,因为这里提到的一些意见宣称ViewHoldernewView之后Constructor。这不是一个好主意。你会得到错误的ViewHolder,而不是属于某一行的。

+1

几乎在所有的情况下,你并不需要外部访问它。 什么是用例?您想在某些操作中更新某些/所有recyclerView行吗?如果是,则更改相应元素的数据模型并调用adapter.notifyItemChanged(position)。 –

+1

事情是**你不应该访问ViewHolder外部bindView **。 –

+0

@PraveenSingh Thi函数'showHideAll()'正在通过'MainActivity'在一个Button上调用我有一个数组来保存元素的状态(可见性)。我可以用它来显示/隐藏元素,但问题是我不知道如何刷新(如果这是适当的术语)屏幕上的视图。其余视图将在滚动上生效,因为它们将引用数组的状态。 这是我的第一个应用程序。 'adapter.notifyItemChanged(position)'刷新当前(屏幕上)视图的状态吗? 感谢您的回复。 –

试图声明“ViewHolderItem viewHolder”下面的构造函数和所有覆盖方法之外,并初始化成bindView方法

+0

谢谢你,做到了。 现在我正面临另一个问题。 'viewHolder.arTextV.setVisibility(v.GONE);'在这个函数中应该设置什么'v'?这应该是一个'视图'我不知道哪一个。我在它的位置尝试了“视图”,但它没有按预期工作。我期望'textView'消失,现在是一个屏幕。它没有。 有什么想法? –

+0

使用这个:viewHolder.arTextV.setVisibility(View.GONE); –

首先,初始化ViewHolderItem全球范围内,那么你可以访问诸如ButtonTextView等你的看法在另一个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(); 
    } 

希望它能帮助你。

+0

谢谢你的回应。 是否做到了。 我现在的问题: 现在我正面临另一个问题。 'viewHolder.arTextV.setVisibility(v.GONE);'在这个函数中应该设置什么'v'?这应该是一个'视图'我不知道哪一个。我在它的位置尝试了“视图”,但它没有按预期工作。我期望'textView'消失,现在是一个屏幕。它没有。 有什么想法? –

+0

'viewHolder.buttonIRV.setEnabled(View.GONE);'尝试像这样 – HassanUsman

+0

试过了,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(); 
} 
} 
+0

无法将'ViewHolderItem'传递给'hideShowAll()'。该功能正在被其他活动调用。 谢谢你的回应 –