如何在单击android

时间:2016-07-03 05:46:46

标签: android listview listitem

我有一个列表视图,在每个列表项中,我有一个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:提供者类只有一个地址的字符串文本。

任何帮助都会受到重视。谢谢提前

1 个答案:

答案 0 :(得分:1)

您需要跟踪上次点击的按钮是什么。所以在你的班级中有一个变量

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

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