【问题标题】:selecting items in custom listView repeat选择自定义列表视图中的项目重复
【发布时间】:2018-09-27 11:43:34
【问题描述】:

我有自定义listview

    public class MisscallListAdapter extends ArrayAdapter<SmsClass>

这是viewHolder

        private static class ViewHolder {
               TextView number , name , date , count , time;
               ImageButton btnCall , btnSendsms , btnDelete;
               ImageView imageIcon;
               CheckBox checkBox;
        }

getView 方法中,我尝试获取用户单击的项目并将其放入ArrayList 中,如下所示:

        public View getView(final int position, View convertView, ViewGroup parent) {

    ViewHolder viewHolder = null;
    final SmsClass smsClass = getItem(position);

    String nameInside = smsClass.getName();
    final String numInside = smsClass.getNumberInside();

    LayoutInflater mInflater = (LayoutInflater) context
            .getSystemService( Activity.LAYOUT_INFLATER_SERVICE);

    if (convertView == null) {

        convertView = mInflater.inflate(R.layout.single_list, null);
        viewHolder = new ViewHolder();
        viewHolder.number = (TextView) convertView.findViewById(R.id.number);
        viewHolder.date =(TextView) convertView.findViewById(R.id.date);
        viewHolder.name = (TextView)convertView.findViewById(R.id.name);
        viewHolder.count = (TextView)convertView.findViewById(R.id.count);
        viewHolder.btnCall = (ImageButton) convertView.findViewById( R.id.btn_call );
        viewHolder.btnSendsms = (ImageButton)convertView.findViewById( R.id.btn_sms);
        viewHolder.imageIcon = (ImageView) convertView.findViewById(R.id.icon);
        viewHolder.checkBox = (CheckBox) convertView.findViewById( R.id.checkBox);

        convertView.setTag(viewHolder);

    } else
        viewHolder = (ViewHolder) convertView.getTag();




    viewHolder.name.setText( //text );

    viewHolder.date.setText( //text );
    viewHolder.number.setText( //text );
    viewHolder.count.setText( //text );



    viewHolder.btnSendsms.setOnClickListener( new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            try{
                TextView selected = (TextView) MainActivity.smsList.getChildAt(position).findViewById(R.id.name);
                clicked_number = selected.getText().toString();

                openSMS( numInside);
            }
            catch (Exception e){}
        }
    } );

    viewHolder.btnCall.setOnClickListener( new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            try{
                TextView selected = (TextView) MainActivity.smsList.getChildAt(position).findViewById(R.id.name);
                clicked_number = selected.getText().toString();

                dialContactPhone(numInside);
            }
            catch (Exception e){}
        }

    } );


    final ViewHolder finalViewHolder = viewHolder;
    final View finalConvertView = convertView;
    viewHolder.checkBox.setOnClickListener( new View.OnClickListener() {
        @Override
        public void onClick(View v) {


            if (finalViewHolder.checkBox.isChecked()) {
                selected.add( smsClass );

            } else {

                for(int i = 0 ; i < selected.size() ; i++){
                    if(selected.get( i ).getId() == smsClass.getId())
                        selected.remove( i );
                }
            }
        }

    } );


    if(isEnd == true) {

        for (int i = 0; i < MainActivity.smsList.getCount(); i++) {

            Log.i( "ujkac" , "count:    " + i );
            viewHolder.checkBox.setChecked( false );
        }
    }


    return convertView;

}

上面的smsClass是:

    final SmsClass smsClass = getItem(position);

问题是当我选择列表的第一行(只是第一项)并使其选中,然后第五项也被选中,第十项和... 请帮忙。

【问题讨论】:

  • 显示onBindViewHolder()方法代码
  • @Rahul Khurana 我没有这个方法
  • 好的。把整个getView方法代码
  • @Rahul Khurana 好的,我编辑问题
  • @Rahul Khurana 谢谢

标签: android listview checkbox


【解决方案1】:

您必须使用 Viewholder 模式!见RecyclerView with ViewHolder pattern 这是一种简单有效的方法!

【讨论】:

    【解决方案2】:

    如果布局存在,则在重新创建视图布局期间您恢复以下值:

    viewHolder.name.setText( //text );
    viewHolder.date.setText( //text );
    viewHolder.number.setText( //text );
    viewHolder.count.setText( //text );
    

    但是您没有恢复checkbox 的状态。有一个缺失的行:

    viewHolder.checkbox.setChecked(checkedArray[position];
    

    那是为了恢复。

    还有一个缺失的代码部分,您可以根据视图的位置保存复选框状态(我假设您的列表是静态的)。

    viewHolder.checkBox.setOnClickListener( new View.OnClickListener() {
        @Override
        public void onClick(View v) {
    
            //...
    
            checkedArray[position] = !checkBox.isChecked();
    
            //...
        }
    
    });
    

    我想指出一件事。如果你想听复选框的状态,你应该使用setOnCheckedChangeListener

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-09-16
      • 1970-01-01
      • 2019-02-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多