Android:如何从外部bindView()方法访问viewHolder?

时间:2017-09-14 05:33:44

标签: 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, 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中的TextViewbindView等视图元素。

另外,如果可以的话,请添加一些解释,以便我能够理解它是如何工作的,并且可以为将来学习一些东西。

谢谢

更新

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

另外,我遇​​到了问题,因为这里提到的一些评论是在ViewHolder之后newView之后宣布Constructor。这不是一个好主意。您将错误ViewHolder而不是属于特定行的那个。

3 个答案:

答案 0 :(得分:0)

尝试将下面的' ViewHolderItem viewHolder '声明为构造函数,并将所有Override方法和init声明为 bindView 方法

答案 1 :(得分:0)

首先,在全球范围内初始化您的ViewHolderItem,然后您就可以在另一个Button中访问您的观看内容,例如TextViewmethod等。

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

希望它会帮助你。

答案 2 :(得分:0)

试试这个:

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