2016-10-07 9 views
-3

小さな携帯電話で実行したときに、リストビューにすでに5つのアイテムがある場合、チェックボックス付きのカスタムリストビューがあり、アイテム1をチェックしたときにアイテム5もチェックされます。チェックされた項目5、次に項目1もチェックされ、項目(2-6,3-7,4-8、など)で発生します。チェックボックスのバグがあるリストビューandroid

私のリストビューに4つの項目があった場合、それは起こらないでしょう。ここに私のリストビューアダプタ:

http://pastebin.com/mTEiXryf

あなたは私のバグを解決するために私を助けてもらえますか?事前

+0

あなたはデータリストにCheckBoxの状態を保存せず、データに従ってCheckBoxを更新していないと思います。 https://stackoverflow.com/questions/39926388/spannable-string-only-working-for-last-item-in-listview/39950834#39950834への私の答えを見てください。 –

答えて

3

のおかげで私はあなたがlistviewを使用したい場合は、より良いあなたがチェックボックスのためにBoolean配列を維持し、これは私

のために働いていたこの方法を試してみてください、あなたが Recyclerview

public class CardViewDataAdapter extends 
    RecyclerView.Adapter<CardViewDataAdapter.ViewHolder> { 

private List<Student> stList; 

public CardViewDataAdapter(List<Student> students) { 
    this.stList = students; 

} 

// Create new views 
@Override 
public CardViewDataAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, 
    int viewType) { 
    // create a new view 
    View itemLayoutView = LayoutInflater.from(parent.getContext()).inflate(
    R.layout.cardview_row, null); 

    // create ViewHolder 

    ViewHolder viewHolder = new ViewHolder(itemLayoutView); 

    return viewHolder; 
} 

@Override 
public void onBindViewHolder(ViewHolder viewHolder, int position) { 

    final int pos = position; 

    viewHolder.tvName.setText(stList.get(position).getName()); 

    viewHolder.tvEmailId.setText(stList.get(position).getEmailId()); 

    viewHolder.chkSelected.setChecked(stList.get(position).isSelected()); 

    viewHolder.chkSelected.setTag(stList.get(position)); 


    viewHolder.chkSelected.setOnClickListener(new View.OnClickListener() { 
    public void onClick(View v) { 
    CheckBox cb = (CheckBox) v; 
    Student contact = (Student) cb.getTag(); 

    contact.setSelected(cb.isChecked()); 
    stList.get(pos).setSelected(cb.isChecked()); 

    Toast.makeText(
     v.getContext(), 
     "Clicked on Checkbox: " + cb.getText() + " is " 
     + cb.isChecked(), Toast.LENGTH_LONG).show(); 
    } 
    }); 

} 

// Return the size arraylist 
@Override 
public int getItemCount() { 
    return stList.size(); 
} 

public static class ViewHolder extends RecyclerView.ViewHolder { 

    public TextView tvName; 
    public TextView tvEmailId; 

    public CheckBox chkSelected; 

    public Student singlestudent; 

    public ViewHolder(View itemLayoutView) { 
    super(itemLayoutView); 

    tvName = (TextView) itemLayoutView.findViewById(R.id.tvName); 

    tvEmailId = (TextView) itemLayoutView.findViewById(R.id.tvEmailId); 
    chkSelected = (CheckBox) itemLayoutView 
    .findViewById(R.id.chkSelected); 

    } 

} 

// method to access in activity after updating selection 
public List<Student> getStudentist() { 
    return stList; 
} 

} 

OR を使用することをお勧め

public class CustomAdapter extends BaseAdapter { 
    private final LayoutInflater inflater; 
    private final Context context; 
    private List<ModelPooja> listData; 

    public CustomAdapter(Context mainActivity, List<ModelPooja> listData) { 
     context = mainActivity; 
     this.listData = listData; 
     inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    } 

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

    @Override 
    public Object getItem(int position) { 
     return listData.get(position); 
    } 

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

    @Override 
    public View getView(final int position, View convertView, ViewGroup parent) { 
     final ViewHolder holder; 

     if (convertView == null) { 
      holder = new ViewHolder(); 
      convertView = inflater.inflate(R.layout.list_item_poojaselection, null); 
      holder.tv = (TextView) convertView.findViewById(R.id.list_item_poojaname); 
      holder.checks = (CheckBox) convertView.findViewById(R.id.list_item_poojacheck); 
      convertView.setTag(holder); 
     }else { 
      holder = (ViewHolder) convertView.getTag(); 
     } 
     holder.checks.setOnCheckedChangeListener(null); 
     holder.checks.setFocusable(false); 

     if (listData.get(position).isselected) { 
      holder.checks.setChecked(true); 
     } else { 
      holder.checks.setChecked(false); 
     } 

     holder.checks.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 
      @Override 
      public void onCheckedChanged(CompoundButton cb, boolean b) { 

       if (checkMaxLimit()) { 

        if (listData.get(position).isselected && b) { 
         holder.checks.setChecked(false); 
         listData.get(position).isselected = false; 

        } else { 
         holder.checks.setChecked(false); 
         listData.get(position).isselected = false; 
         Toast.makeText(context, "Max limit reached", Toast.LENGTH_SHORT).show(); 
        } 
       } else { 
        if (b) { 
         listData.get(position).isselected = true; 
        } else { 
         listData.get(position).isselected = false; 
        } 
       } 
      } 
     }); 

     holder.tv.setText(listData.get(position).getPOOJA_LISTING_NAME()); 
     return convertView; 
    } 

    public boolean checkMaxLimit() { 
     int countermax = 0; 
     for(ModelPooja item : listData){ 
      if(item.isselected){ 
       countermax++; 
      } 
     } 
     return countermax >= 5; 
    } 

    public class ViewHolder { 
     TextView tv; 
     public CheckBox checks; 
    } 
} 
0

解決方法 - 正しい場所にholder.chkbox.setOnClickListenerを間違った場所に追加しました。コードをこのコードに置き換えてください

if(convertView == null) { 
     convertView = myInflater.inflate(R.layout.customviewitemcashier, null); 
     holder = new ViewHolder(); 
     holder.tvitemcode = (TextView) convertView.findViewById(R.id.tvitemcode); 
     holder.tvitemname = (TextView) convertView.findViewById(R.id.tvitemname); 
     holder.tvprice = (TextView) convertView.findViewById(R.id.tvprice); 
     holder.tvsubtotal = (TextView) convertView.findViewById(R.id.tvsubtotal); 
     holder.edtqty = (EditText) convertView.findViewById(R.id.edtqty); 
     holder.imgincrease = (TextView) convertView.findViewById(R.id.imgincrease); 
     holder.imgdecrease = (TextView) convertView.findViewById(R.id.imgdecrease); 
     holder.imgitem= (ImageView) convertView.findViewById(R.id.imgitem); 
     holder.chkbox = (CheckBox) convertView.findViewById(R.id.checkbox); 

     convertView.setTag(holder); 
    }else{ 
     holder = (ViewHolder) convertView.getTag(); 
    } 

    holder.chkbox.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      if (holder.chkbox.isChecked()) { 
       SQLiteDatabase dbinsert = dbHelper.getWritableDatabase(); 
       String SQLinsert = "INSERT INTO itemcheckedcontainer (`item_code`) VALUES (" + 
         "'" + DataProcessorResult.get(position).getItemCode() + "')"; 
       dbinsert.execSQL(SQLinsert); 
      } else { 
       SQLiteDatabase dbdelete = dbHelper.getWritableDatabase(); 
       String SQLdelete = "DELETE FROM itemcheckedcontainer WHERE item_code=" + 
         "'" + DataProcessorResult.get(position).getItemCode() + "'"; 
       dbdelete.execSQL(SQLdelete); 
      } 
     } 
    }); 

問題が解決しました。

+0

同じ結果の弟、私は外に置く前に私のコーディングを確認して、私は発言をし、内部convertviewに移動しました。 –

+0

は、更新されたアダプタコードを共有します。 – Shane

関連する問題