【问题标题】:Listview with checkbox bug android带有复选框错误android的Listview
【发布时间】:2016-10-07 03:56:07
【问题描述】:

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

但如果我的列表视图中有 4 个项目,它就不会发生。这是我的列表视图适配器:

http://pastebin.com/mTEiXryf

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

【问题讨论】:

标签: android listview checkbox


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    这里是解决方案-您在错误的位置添加了 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);
                }
            }
        });
    

    你的问题解决了。

    【讨论】:

    • 同样的结果兄弟,在我放外面之前。检查我的编码,我给评论,然后移到convertview里面。
    猜你喜欢
    • 2011-09-15
    • 2012-12-11
    • 1970-01-01
    • 1970-01-01
    • 2017-07-09
    • 2016-02-03
    • 2014-05-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多