2017-11-05 5 views
0

私はListViewのチェックボックスで作業しています。私の問題はちょっと変わっています。私がListViewの項目のいずれかをチェックするたびに、別の人もチェックを受け取ります。私はHashMapsetOnCheckedChangeListenerイベントのチェック項目のIDを保存しています。私はHashMapの結果をログに記録し、それがランダムにチェックされたものではなくクリックされたアイテムIDにそれらを保存します。エラー - 2つのチェックボックスがListViewで同時にチェックを受け取ります

私は本当にこれであなたの助けが必要です。

これは私のBaseAdapterコードです:

public class StrengthOfDemandAdapter extends BaseAdapter { 
    ArrayList<Products> list; 
    //private LayoutInflater layoutInflater; 
    private static HashMap<Integer, String> selectedSODBrandsMap = new HashMap<Integer, String>(); 
    private SQLiteDatabase database; 
    private SQLiteOpenHelper dbHelper; 
    //private static ArrayList<String> selectSODBRandNames = new ArrayList<String>(); 
    private Context con; 
    private int imageNo; 

    public StrengthOfDemandAdapter(Context context, ArrayList<Products> list, int imageNumber) { 
     this.list = list; 
     this.con = context; 
     this.imageNo = imageNumber; 
     //layoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     dbHelper = new DBHelper(con); 
     database = dbHelper.getWritableDatabase(); 
    } 

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

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

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

    @Override 
    public View getView(final int i, View convertView, ViewGroup viewGroup) { 
     View v = convertView; 
     final ViewHolder mHolder; 

     //Log.i("SIZE", "getView: "+list.size()); 
     if(v == null){ 
      //Log.i("INFO 2", "openDialog: "+((Products)list.get(i)).getProductID()+", "+((Products)list.get(i)).getProductName()); 
      LayoutInflater vi = (LayoutInflater) con.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      v = vi.inflate(R.layout.strengthofdemandlistview, null); 
      mHolder = new ViewHolder(); 

      mHolder.mCheckBox = (CheckBox) v.findViewById(R.id.SODCheckBox); 


      v.setTag(mHolder); 
     }else { 
      mHolder = (ViewHolder) v.getTag(); 
      //mHolder.mCheckBox.setOnCheckedChangeListener(null); 
     } 
     //mHolder.mCheckBox.setFocusable(false); 
     mHolder.mCheckBox.setText(((Products)list.get(i)).getProductName()); 
     mHolder.mCheckBox.setTag(((Products)list.get(i)).getProductID()); 

     mHolder.mCheckBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 
      @Override 
      public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
       if (isChecked) { 
        //Log.i("YES", "onCheckedChanged: YES"+((Products)list.get(i)).getProductName()); 
        selectedSODBrandsMap.put(((Products)list.get(i)).getProductID(), ((Products)list.get(i)).getProductName()); 
       }else { 
        //Log.i("NO", "onCheckedChanged: NO"+((Products)list.get(i)).getProductName()); 
        selectedSODBrandsMap.remove(((Products)list.get(i)).getProductID()); 
       } 
      } 
     }); 


     return v; 
    } 

    private class ViewHolder { 
     private CheckBox mCheckBox; 

    } 

    public static HashMap<Integer, String> sendSelectedSODBrandsMap(){ 
     return selectedSODBrandsMap; 
    } 

} 

答えて

1

これが原因でリストビューのリサイクル機構から発生します。

キーがインデックスでチェック項目を思い出すために使用される SparseBooleanArray mCheckStates;ある

public class StrengthOfDemandAdapter extends BaseAdapter implements CompoundButton.OnCheckedChangeListener { 

    private SparseBooleanArray mCheckStates; 
    ArrayList<Products> list; 
    //private LayoutInflater layoutInflater; 
    private static HashMap<Integer, String> selectedSODBrandsMap = new HashMap<Integer, String>(); 
    private SQLiteDatabase database; 
    private SQLiteOpenHelper dbHelper; 
    //private static ArrayList<String> selectSODBRandNames = new ArrayList<String>(); 
    private Context con; 
    private int imageNo; 

    public StrengthOfDemandAdapter(Context context, ArrayList<Products> list, int imageNumber) { 
     this.list = list; 
     this.con = context; 
     this.imageNo = imageNumber; 
     //layoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     dbHelper = new DBHelper(con); 
     database = dbHelper.getWritableDatabase(); 
     mCheckStates = new SparseBooleanArray(list.size()); 
    } 

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

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

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

    @Override 
    public View getView(final int i, View convertView, ViewGroup viewGroup) { 
     View v = convertView; 
     final ViewHolder mHolder; 

     //Log.i("SIZE", "getView: "+list.size()); 
     if(v == null){ 
      //Log.i("INFO 2", "openDialog: "+((Products)list.get(i)).getProductID()+", "+((Products)list.get(i)).getProductName()); 
      LayoutInflater vi = (LayoutInflater) con.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      v = vi.inflate(R.layout.strengthofdemandlistview, null); 
      mHolder = new ViewHolder(); 

      mHolder.mCheckBox = (CheckBox) v.findViewById(R.id.SODCheckBox); 


      v.setTag(mHolder); 
     }else { 
      mHolder = (ViewHolder) v.getTag(); 
      //mHolder.mCheckBox.setOnCheckedChangeListener(null); 
     } 
     //mHolder.mCheckBox.setFocusable(false); 

     Product product = getItem(i); 
     mHolder.mCheckBox.setText(product.getProductname()); 
     holder.mCheckBox.setTag(position); 
     holder.mCheckBox.setChecked(mCheckStates.get(position, false)); 
     holder.mCheckBox.setOnCheckedChangeListener(this); 

     return v; 
    } 

    private class ViewHolder { 
     private CheckBox mCheckBox; 

    } 

    public boolean isChecked(int position) { 
     return mCheckStates.get(position, false); 
    } 

    public void setChecked(int position, boolean isChecked) { 
     mCheckStates.put(position, isChecked); 

    } 

    public void toggle(int position) { 
     setChecked(position, !isChecked(position)); 

    } 

    @Override 
    public void onCheckedChanged(CompoundButton buttonView, 
           boolean isChecked) { 

     mCheckStates.put((Integer) buttonView.getTag(), isChecked); 

    } 

    public static HashMap<Integer, String> sendSelectedSODBrandsMap(){ 
     return selectedSODBrandsMap; 
    } 

} 

にアダプタのコードを変更し

+0

今私は間違っていることを得る。出来た! +1編集した説明のために:) – 3iL

+0

@ 3iLあなたの歓迎!あなたの問題は、チェックボックスだけでなく、他の場合でも発生します。リストビューがどのようにビューをリサイクルし、同じものと良いものを処理するかを理解してください。 – Raghunandan

+0

はい、これからはこれをメモします。 – 3iL

関連する問題