Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/359.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/208.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java getView()方法和复选框_Java_Android - Fatal编程技术网

Java getView()方法和复选框

Java getView()方法和复选框,java,android,Java,Android,我是android studio的新手,正在做一个项目。我有一个列表视图,它由复选框和文本视图组成。我添加了两个按钮“添加”和“删除”。如果我选中复选框并按下删除按钮,则该项目将被删除。因此,我设计了一个自定义适配器,它有一个getView方法 此getView方法包括复选框的侦听器。当我选中复选框时,是调用getView方法还是只执行侦听器 public View getView(int position, View convertView, ViewGroup parent) { V

我是android studio的新手,正在做一个项目。我有一个列表视图,它由复选框和文本视图组成。我添加了两个按钮“添加”和“删除”。如果我选中复选框并按下删除按钮,则该项目将被删除。因此,我设计了一个自定义适配器,它有一个getView方法

此getView方法包括复选框的侦听器。当我选中复选框时,是调用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;
}
当我选中复选框时,是调用getView方法还是仅调用getView方法 监听器被执行了吗

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

if( checkBox.isChecked() )
{
   list.get(pos).setChecking(1);
}
else
{
   list.get(pos).setChecking(0);
}
每次创建或重用列表项的视图时,都会调用适配器的getView。此方法是在用户看到项目之前执行的。因此,建议保持此方法简短,避免繁重的计算

选中该复选框时,将不会调用getView,而是调用该复选框的侦听器。在这种情况下,您要实现的目标是,必须分别将oncheckedchangelister和OnClickListener设置为复选框和按钮

您的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();

                }
            }
        }
    });

这样的东西很容易用一些日志语句或调试器进行测试。这比写一个完整的SO问题要快得多。你已经写了所有与你的问题相关的代码。唯一剩下的就是添加Log.d语句并自己检查它。我必须在哪里添加Log.d?因为这段代码位于getView方法中,所以我认为整个getView都被执行了。谢谢你的回答,而不是投反对票。有些人是新手,他们可能会问一些基本的问题。不客气,但你可以相信我:如果你点击复选框,只有监听器中的代码才会被执行!