2016-07-03 8 views
0

У меня есть представление списка, так и внутри каждого элемента списка У меня есть TextView и Button вроде этого:Как отключить все кнопки в пункты ListView, когда нажмите на кнопку, которая находится внутри ListView в андроида

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

} 

пс: класс провайдер имеет только строку текста для адреса.

Любая помощь будет серьезно было оценено заранее

ответ

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

Это будет записывать последнюю выбранную переменную и принудительно перерисовать весь список. Когда это произойдет, все кнопки, кроме только что нажатого, станут отключенными.

+0

Спасибо за ваш ответ – roostaamir