Java 在列表视图中保存复选框的状态,可以';t使光标为最终值

Java 在列表视图中保存复选框的状态,可以';t使光标为最终值,java,android,Java,Android,以下是我如何实现bindView的: @Override public void bindView(View view, Context context, Cursor cursor) { final ViewHolder holder = (ViewHolder) view.getTag(); String name = (cursor.getString(cursor.getColumnIndexOrThrow("NotificationDateFor")));

以下是我如何实现bindView的:

@Override
public void bindView(View view, Context context, Cursor cursor) 
{
    final ViewHolder holder = (ViewHolder) view.getTag();

    String name = (cursor.getString(cursor.getColumnIndexOrThrow("NotificationDateFor")));
    String image = cursor.getString(cursor.getColumnIndexOrThrow("imageUri"));

     System.out.println("cursor.getPosition(test): "+cursor.getPosition());

     holder.nametext.setText(name);
     // setImage(image, holder.iv); 

     holder.chk.setOnClickListener(new OnClickListener(){
         @Override
         public void onClick(View v) 
         {
             if (holder.chk.isChecked()) 
             {
                 itemChecked.set(cursor.getPosition(), true);
                 System.out.println("cursor.getPosition(true): "+cursor.getPosition());
             }
             else if (!holder.chk.isChecked()) 
             {
                 itemChecked.set(cursor.getPosition(), false);
                 System.out.println("cursor.getPosition(false): "+cursor.getPosition());
                 // AddDelete
             }  
         }              
     });

     holder.chk.setChecked(itemChecked.get(cursor.getPosition()));
} 
问题发生在
itemChecked.set(cursor.getPosition(),true)

对问题的描述让我想到:

无法在其他方法中定义的内部类中引用非final变量游标,请将游标的修饰符更改为final


但是,如果我执行
最终光标
,onClick中的位置值不会在滚动时刷新。如果执行
System.out.println(“cursor.getPosition(true):”+cursor.getPosition()),我总是得到值5和我的复选框检查再次出错

正如错误所说。。。在监听器内部,您无法修改某些变量,因为它是内部类,所以请声明变量final:

public void bindView(View view, Context context, final Cursor cursor) {
如果需要修改光标,请使用所需的值作为最终值:

final int position = cursor.getPosition();

缺点是,如果我将其设置为最终值,则不会刷新我的值。如果我执行
System.out.println(“cursor.getPosition(true):”+cursor.getPosition())在onCLick侦听器中,我总是得到5如果是这样,请使用位置,
final int position=cursor.getPosition()并在侦听器中使用它来允许更改光标。您刚刚重新定义了性别!但是,如果你能解释一个是如何工作的,另一个是如何不工作的,那就太好了。据我所知,final只是让线程知道编写变量需要同步的一种方法。如果我错了,请纠正我?然后这是BindView方法中的一个设计问题,因为在很多时候我需要获取光标在onCLickListener中的位置。final意味着您不能更改值,这就是为什么它是线程安全的,但它也可以用于其他类似情况。这是一个复杂的解释,因此您可以检查其他答案,如
    @Override
    public void bindView(View view, Context context, Cursor cursor) {

        final ViewHolder holder = (ViewHolder) view.getTag();
        final int position = cursor.getPosition();

        String name = (cursor.getString(cursor.getColumnIndexOrThrow("NotificationDateFor")));
        String image = cursor.getString(cursor.getColumnIndexOrThrow("imageUri"));

         System.out.println("cursor.getPosition(test): "+position);

        holder.nametext.setText(name);
    //  setImage(image, holder.iv); 

        holder.chk.setOnClickListener(new OnClickListener(){

            @Override
            public void onClick(View v) {

                    if (holder.chk.isChecked()) {
                        itemChecked.set(position, true);
                       System.out.println("cursor.getPosition(true): "+position);
                    } else if (!holder.chk.isChecked()) {
                        itemChecked.set(position, false);
                        System.out.println("cursor.getPosition(false): "+position);
                        // AddDelete
                    }   
            }               
        });

        holder.chk.setChecked(itemChecked.get(position));

    }