getView()方法和Checkbox

时间:2017-07-31 12:18:52

标签: java android

我是android studio的新手,我正在开发一个项目。我有一个ListView,它由CheckBoxTextView组成。我添加了两个按钮adddelete。如果我检查CheckBox并按删除按钮,则该项目将被删除。因此,我设计了一个自定义适配器,它有一个getView()方法。

getView()方法包含CheckBox的侦听器。当我检查CheckBox时,是否执行了getView()方法或仅执行了侦听器?

public View getView(int position, View convertView, ViewGroup parent) {
    View rowView;
    final int pos = position;

    rowView = myInflater.inflate(R.layout.row_layout, null);

    TextView textView = (TextView)rowView.findViewById(R.id.content);
    final CheckBox checkBox = (CheckBox)rowView.findViewById(R.id.check);

    textView.setText( list.get(pos).getContent() );

    checkBox.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if( checkBox.isChecked() ){
                list.get(pos).setChecking(1);
            }
            else {
                list.get(pos).setChecking(0);
            }
        }
    });
    return rowView;
}

2 个答案:

答案 0 :(得分:2)

  

当我选中复选框时,是调用getView()方法还是仅调用   监听器被执行了吗?

只会执行侦听器中的代码。在这种情况下:

if( checkBox.isChecked() )
{
   list.get(pos).setChecking(1);
}
else
{
   list.get(pos).setChecking(0);
}

答案 1 :(得分:0)

每次创建或重用列表项的视图时,都会调用适配器getView()。在用户看到项目之前执行此方法(因此建议保持此方法简短并避免繁重的计算)。

选中该复选框后,将不会调用getView(),而是调用复选框的监听器。在这种特殊情况下,您要实现的目标必须分别设置OnCheckedChangeListenerOnClickListener复选框和按钮。

您的CustomAdapter.java将如下所示:

public class CustomAdapter extends BaseAdapter {
    Context context;
    List<String> list;
    public  static List<Integer> selectedPositions;
    public CustomAdapter(Context context,List<String> list){
        this.context=context;
        this.list=list;
        this.selectedPositions=new ArrayList<>(0);
    }
    @Override
    public int getCount() {
        return list==null?0: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 position, View convertView, ViewGroup viewGroup) {


        View vi = convertView;
        ViewHolder holder;

        if(convertView==null){

            /****** Inflate rowitem.xml file for each row ( Defined below ) *******/
            vi = LayoutInflater.from(context).inflate(R.layout.row_item, null);

            /****** View Holder Object to contain rowitem.xml file elements ******/

            holder = new ViewHolder(vi);


            /************  Set holder with LayoutInflater ************/
            vi.setTag( holder );
        }
        else
            holder=(ViewHolder)vi.getTag();

       //Set listeners for checkbox and button

        holder.checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
                if(compoundButton.isChecked()){
                    selectedPositions.add(position);
                }else{
                    int count=0;
                    for(int item:selectedPositions){
                        if(item==position){
                            selectedPositions.remove(count);

                        }
                        count++;
                    }
                }

            }
        });

        return vi;



    }


    private class ViewHolder{
        CheckBox checkBox;
        TextView textView;
        ViewHolder(View itemView){

            checkBox=(CheckBox)itemView.findViewById(R.id.checkbox);
            textView=(TextView)itemView.findViewById(R.id.textView);

        }
    }
}

活动中的删除按钮将被这样处理:

button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            if(CustomAdapter.selectedPositions != null && 
 !CustomAdapter.selectedPositions.isEmpty()){
                for(int count = 0;
                        count < CustomAdapter.selectedPositions.size(); count++){
                    list.remove(CustomAdapter.selectedPositions.get(count));
                    adapter.notifyDataSetChanged();

                }
            }
        }
    });