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()在my
hideShowAll()
中,而不是在那里访问
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”应设置为什么?这应该是一个