在单击内部按钮时更新自定义适配器内容

Updating Custom Adapter Content On Inner-Button Click

所以我正在尝试能够从我动态创建的自定义适配器中更改列表项的外观。当我从我的自定义适配器的列表项中单击一个按钮时,我希望它发生变化。 This is an example of a Custom List Item looks like. 当我单击按钮时,我希望它执行一个操作来修改布局。例如,点击按钮后,我想让它隐藏另一个按钮,或者改变按钮的文本。出于某种原因,这些命令在单击时似乎没有任何效果。

我的最终目标是能够在单击按钮时调整列表项的大小。但正如我提到的,似乎没有任何效果。在 onClick 方法之外设置可见性似乎可行,但在内部设置则行不通。我知道正在访问代码,但我相信这与适配器不更新有关,但我在那里有 notifyDataSetChanged 方法。任何帮助表示赞赏。谢谢

这是我的自定义适配器代码

class CustomAdapter extends ArrayAdapter<Player> {
Button button, button2;

public CustomAdapter(Context context, ArrayList<Player> players) {
    super(context, R.layout.player_expanded, players);
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    LayoutInflater infater = LayoutInflater.from(getContext());
    final View customView = infater.inflate(R.layout.custom_list_item, parent, false);

    button = (Button) customView.findViewById(R.id.button);
    button2 = (Button) customView.findViewById(R.id.button2);
    button2.setVisibility(View.VISIBLE);
    button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            button2.setVisibility(View.GONE);   //Doesn't take effect
            notifyDataSetChanged();
        }
    });

    return customView;
  }
}

还有我的Custom_List_Item.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="wrap_content">

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="New Text"
    android:id="@+id/textView3"
    android:layout_alignParentTop="true"
    android:layout_alignParentLeft="true"
    android:layout_alignParentStart="true" />

<Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="New Button"
    android:layout_alignParentTop="true"
    android:focusable="false"  
    android:id="@+id/button"  />

<Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="New Button"
    android:focusable="false"
    android:id="@+id/button2" />
 </LinearLayout>

尝试如下:

class CustomAdapter extends ArrayAdapter<Player> {

private static class ViewHolder {
    Button button, button2;
}

public CustomAdapter(Context context, ArrayList<Player> players) {
super(context, R.layout.player_expanded, players);
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder viewHolder; // view lookup cache stored in tag
   if (convertView == null) {
      viewHolder = new ViewHolder();
      LayoutInflater infater = LayoutInflater.from(getContext());
final View customView = infater.inflate(R.layout.custom_list_item, parent, false);

viewHolder.button = (Button) customView.findViewById(R.id.button);
viewHolder.button2 = (Button) customView.findViewById(R.id.button2);

viewHolder.button.setTag(position);
viewHolder.button2.setTag(position);
convertView.setTag(viewHolder);
} else {
       viewHolder = (ViewHolder) convertView.getTag();
}
viewHolder.button2.setVisibility(View.VISIBLE);
viewHolder.button.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        viewHolder.button2.setVisibility(View.GONE);   //Doesn't take effect
        notifyItemChanged(Integer.valueOf(v.getTag().toString()));
    }
});

return customView;
}
}

调用 notifyDataSetChanged() 会导致 ListView 重建所有内容。它将删除它的 setVisibility 消失,为所有可见的项目调用 getView()。 为此,您需要一种逻辑并管理按钮的可见性。

发生这种情况是因为您让按钮在内部不可见 onClick 然后通知您的适配器。

现在您已经在您的适配器中写入 button2.setVisibility(View.VISIBLE);。因此,只要您的适配器收到通知,它就会再次将按钮的可见性设置为可见。

执行此操作的简单方法是使用 SparseBooleanArray

class CustomAdapter extends ArrayAdapter<Player> {

    Button button, button2;
    SparseBooleanArray mArray;

    public CustomAdapter(Context context, ArrayList<Player> players) {
        super(context, R.layout.player_expanded, players);
        mArray = new SparseBooleanArray(lenth of your list);
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {

        if (convertView == null) {
            LayoutInflater infater = LayoutInflater.from(getContext());
            final View customView = infater.inflate(R.layout.custom_list_item, parent, false);

            button = (Button) customView.findViewById(R.id.button);
            button2 = (Button) customView.findViewById(R.id.button2);
        }
        if(mArray.get(position)){
            button2.setVisibility(View.GONE);
        }else if(!mArray.get(position)){
            button2.setVisibility(View.VISIBLE);
        }

        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mArray.put(position, true);
                notifyDataSetChanged();
            }
        });

        return customView;
    }
}

希望这对你有用。