2016-10-27 9 views
0

チェックボックスがあるListViewを使用しています。チェックボックスをクリックしてスクロールすると、チェックボックスの状態が正しく機能していません。チェックボックスの状態が正しく動作しない

私は同様のStackOverflowを見てみましたquestion しかし、これらのソリューションは私のために働いていません。

private class CustomerEventsAdapter extends BaseAdapter { 
      private Context myContext; 
      private ArrayList<Events> myEventArrayList; 

      private LayoutInflater mInflater; 
      private Boolean isSelected = false; 

      public EventsAdapter(Context ctx, ArrayList<Events> theArrayListEvents) { 
       this.myContext = ctx; 
       this.myEventArrayList = theArrayListEvents; 
       mInflater = LayoutInflater.from(ctx); 

      } 

      @Override 
      public int getCount() { 
       return myEventArrayList.size(); 
      } 

      @Override 
      public Object getItem(int i) { 
       return myEventArrayList.get(i); 
      } 

      @Override 
      public long getItemId(int i) { 
       return i; 
      } 

      @Override 
      public View getView(final int i, View convertView, ViewGroup viewGroup) { 
       View view = convertView; 
       if (view == null) { 
        view = mInflater.inflate(R.layout.event_item_list, null); 
        final ViewHolder holder = new ViewHolder(); 


        holder.myCheckBoxCustomerEventItem = (CheckBox) view.findViewById(R.id.checkBoxCustomerEventItem); 





        holder.myCheckBoxCustomerEventItem.setOnClickListener(new View.OnClickListener() { 

         @Override 
         public void onClick(View v) { 
          Events events = myEventArrayList.get(i); 
          //is chkIos checked? 
          if (((CheckBox) v).isChecked()) { 
           holder.myCheckBoxCustomerEventItem.setChecked(true); 
           eventsInfo.setMyIsSelected(true); 
          } else { 
           holder.myCheckBoxCustomerEventItem.setChecked(false); 
           eventsInfo.setMyIsSelected(false); 
          } 
          //case 2 

         } 
        }); 




        view.setTag(holder); 

       } 

       if (view != null) { 
        ViewHolder holder = (ViewHolder) view.getTag(); 
        Events eventsInfo = myEventArrayList.get(i); 

        boolean isChecked = eventsInfo.getMyIsSelected(); 


        if (isChecked) { 
         holder.myCheckBoxCustomerEventItem.setChecked(true); 


        } else { 
         holder.myCheckBoxCustomerEventItem.setChecked(false); 


        } 
       } 

       return view; 
      } 
     } 

ありがとう:

は、ここに私のAdapterコードです。

答えて

2

getViewメソッドをアダプタに実装する基本的な規則は、再表示するビューがない場合にのみビューを拡張し、getViewが呼び出されるたびにすべてのビューを更新することです。

Checkboxのプロパティは、convertView == nullに設定されていません。 CheckBoxにはOnCheckedChangeListenerがあります。このボタンをクリックすると、状態の変更を識別できます。

としてあなた getView方法を変更

:コードが機能している

@Override 
public View getView(final int i, View convertView, ViewGroup viewGroup) { 
    View view = convertView; 
    if (view == null) { 
     view = mInflater.inflate(R.layout.event_item_list, null); 
     ViewHolder holder = new ViewHolder(); 

     holder.myCheckBoxCustomerEventItem = (CheckBox) view.findViewById(R.id.checkBoxCustomerEventItem); 

     holder.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 
      @Override 
      public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
       myEventArrayList.get(i).setMyIsSelected(isChecked); 
      } 
     }); 

     view.setTag(holder); 
    } 

    ViewHolder holder = (ViewHolder) view.getTag(); 
    Events eventsInfo = myEventArrayList.get(i); 

    boolean isChecked = eventsInfo.getMyIsSelected(); 

    holder.myCheckBoxCustomerEventItem.setChecked(isChecked); 

    return view; 
} 
+0

.. –

関連する問題