单击 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();
这将写入最后选择的变量并强制整个列表自行重绘。当发生这种情况时,除了您刚刚按下的按钮之外的所有按钮都将被禁用。
我有一个列表视图,在每个列表项中我有一个 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();
这将写入最后选择的变量并强制整个列表自行重绘。当发生这种情况时,除了您刚刚按下的按钮之外的所有按钮都将被禁用。