单击 android 中 ListView 内的按钮时如何禁用 ListView 项目中的所有按钮

How to disable all the buttons in ListView items when click on button that is inside ListView in android

我有一个列表视图,在每个列表项中我有一个 TextView 和一个 Button,如下所示:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:orientation="horizontal"
              android:layout_width="match_parent"
              android:layout_height="match_parent"
              android:layout_margin="@dimen/activity_horizontal_margin"
              android:gravity="right">

    <Button
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:text="New Button"
        android:id="@+id/button_listItem_action"
        android:layout_gravity="center"
        android:layout_weight="1.2"
        android:layout_marginRight="10dp"/>

    <TextView
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:text="Large Text"
        android:id="@+id/textView_listItem_provider_address"
        android:layout_gravity="center"
        android:layout_weight="2"
        android:layoutDirection="rtl"
        android:textDirection="rtl"/>

</LinearLayout> 

我想要做的是,我想为每个列表项中的每个按钮设置一个点击侦听器,以禁用此列表视图中其他列表项中的所有其他按钮。我不知道我是否应该将这个侦听器放入适配器中,我也不知道如何工作。

这是我的适配器:

public class ProviderListArrayAdapter extends ArrayAdapter<Provider> {

    private static class ViewHolder{
        TextView txtViewAddress;
        Button buttonAction;
    }

    public ProviderListArrayAdapter(Context context, List<Provider> providers) {
        super(context, -1, providers);
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder viewHolder;
        final Provider provider = getItem(position);

        if (convertView == null) {
            viewHolder = new ViewHolder();
            LayoutInflater layoutInflater = LayoutInflater.from(getContext());
            convertView = layoutInflater.inflate(R.layout.list_item_provider_selector, parent, false);
            viewHolder.txtViewAddress = (TextView) convertView.findViewById(R.id.textView_listItem_provider_address);
            viewHolder.buttonAction = (Button) convertView.findViewById(R.id.button_listItem_action);
            convertView.setTag(viewHolder);
        }
        else {
            viewHolder = (ViewHolder) convertView.getTag();
        }

        viewHolder.txtViewAddress.setText(provider.address);
        viewHolder.buttonAction.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //don't know what to do
            }
        });

        return convertView;
    }

}

ps: 提供商 class 只有一个地址字符串文本。

任何帮助都会appreciated.Thanks提前

您需要跟踪上次单击的按钮是什么。所以在你的 class

中有一个变量
int mLastSelected = -1;  //This is the position last selected or -1 if none is selected

然后在您的 getView 中调用

holder.buttonAction.setEnabled(mLastSelected == -1 || mLastSelected == position);

如果选择了任何其他按钮,这将禁用它。那么你的onClick就变成了

mLastSelected = position;
notifyDataSetChanged();

这将写入最后选择的变量并强制整个列表自行重绘。当发生这种情况时,除了您刚刚按下的按钮之外的所有按钮都将被禁用。