【问题标题】:Android: How do you access viewHolder from outside bindView() method?Android:如何从外部 bindView() 方法访问 viewHolder?
【发布时间】:2018-02-22 23:22:42
【问题描述】:

下面是我想要实现的示例代码。

    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 中的 bindView 中的 ButtonTextView 等视图元素。

另外,如果可以的话,请在您的答案中添加一些解释,以便我了解它的工作原理,并为将来学习一些东西。

谢谢

更新

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

另外,我遇​​到了让它为我工作的问题,因为这里提到的一些 cmets 在 newView 之外声明 ViewHolder 就在 Constructor 之后。这不是一个好主意。您将得到错误的ViewHolder,而不是属于特定行的错误。

【问题讨论】:

  • 在几乎所有情况下,您都不需要在外部访问它。用例是什么?您想在某些操作上更新一些/所有的 recyclerView 行吗?如果是,则更改相应元素的数据模型并调用 adapter.notifyItemChanged(position)。
  • 问题是你不应该在 bindView 之外访问 ViewHolder
  • @PraveenSingh Thi 函数showHideAll() 正在从按钮上的MainActivity 调用我有一个保存元素状态(可见性)的数组。我可以用它来显示/隐藏元素,但问题是我不知道如何刷新(如果这是正确的术语)屏幕上的视图。其余视图将在滚动时生效,因为它们将引用数组的状态。这是我的第一个应用程序。 `adapter.notifyItemChanged(position)` 会刷新当前(屏幕上)视图的状态吗?感谢您的回复。
  • @PraveenSingh 我正在使用ListView。我的适配器不建议 notifyItemChanged() 作为有效方法。我有notifyDataSetChanged();
  • @pskink 现在可见的那个。光标位置。其余视图将在重新循环时更新。我想更新用户按下按钮时屏幕上可见的那个。如果我能找到如何在不丢失变量(它们的值)的情况下刷新当前视图,那么我可能不需要访问 viewHolder。任何想法?我从MainActivity 尝试了notifyDataSetChanged();,但它似乎不起作用。

标签: android android-cursoradapter android-viewholder


【解决方案1】:

尝试在构造函数和所有 Override 方法之外声明 'ViewHolderItem viewHolder' 并初始化到 bindView 方法

【讨论】:

  • 谢谢你,做到了。现在我面临另一个问题。 ` viewHolder.arTextV.setVisibility(v.GONE);` 在那个函数中,这个“v”应该设置成什么?这应该是View 我不确定是哪一个。我在它的位置尝试了“查看”,但它没有按预期工作。我希望textView 消失,这是现在的屏幕之一。它没有。有什么想法吗?
  • 使用这个:viewHolder.arTextV.setVisibility(View.GONE);
【解决方案2】:

首先,全局初始化您的ViewHolderItem,然后您可以像这样在另一个method 中访问您的视图,例如ButtonTextView 等。

 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'应该设置成什么?这应该是View 我不确定是哪一个。我在它的位置尝试了“查看”,但它没有按预期工作。我希望textView 消失,这是现在的屏幕之一。它没有。有什么想法吗?
  • viewHolder.buttonIRV.setEnabled(View.GONE); 试试这样
  • 试过了,阿基。没用。我认为这行不通。我将更新一个数组以跟踪元素的状态,然后调用notifyDataSetChanged()。试图让该方法发挥作用。
【解决方案3】:

试试这个:

  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()。该函数正在被另一个活动调用。感谢您的回复
猜你喜欢
  • 1970-01-01
  • 2019-08-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-19
  • 2014-09-10
相关资源
最近更新 更多