列表视图与复选框错误android

时间:2016-10-07 03:56:08

标签: android listview checkbox

我有自定义列表视图带复选框,当我在我的小手机中执行时,如果列表视图已经有5个项目,那么当我检查项目1时,那么项目5也将被检查,如果我检查项目5然后项目也将检查1,它发生在项目(2-6,3-7,4-8等)。

但如果我的listview中有4个项目,那就不会发生。这是我的listview适配器:

http://pastebin.com/mTEiXryf

你能帮我解决一下我的错误吗?提前致谢

2 个答案:

答案 0 :(得分:3)

我建议您使用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;
 }

}

如果你想使用listview,那么最好保留Boolean数组作为复选框,试试这种方式对我有用

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

答案 1 :(得分: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);
            }
        }
    });

你的问题解决了。