视图中的android光标必须是最终的?

视图中的android光标必须是最终的?,android,view,cursor,Android,View,Cursor,我有一个活动,它在ListView中显示数据库中的用户消息。ListView正确显示有关消息的各种信息,并且ListView中的每一行都有一个onClickListener,它启动另一个活动以显示有关消息的更多信息 这一切都很好。我在列表行中添加了一个复选框。选中该复选框以标记已选择要删除的邮件。每条消息都有一个唯一的guid标识符,该标识符存储在DB中,因此可通过视图中的光标和适配器使用。单击一行时,该quid将通过onclicklistener传递给下一个活动 这一切都很好。我现在在复选框中

我有一个活动,它在ListView中显示数据库中的用户消息。ListView正确显示有关消息的各种信息,并且ListView中的每一行都有一个onClickListener,它启动另一个活动以显示有关消息的更多信息

这一切都很好。我在列表行中添加了一个复选框。选中该复选框以标记已选择要删除的邮件。每条消息都有一个唯一的guid标识符,该标识符存储在DB中,因此可通过视图中的光标和适配器使用。单击一行时,该quid将通过onclicklistener传递给下一个活动

这一切都很好。我现在在复选框中添加了一个onCheckedChanged侦听器。当我选中该复选框时,我想从getView中的光标获取这个唯一的guid标识符

当复选框设置了它的onCheckedChanged侦听器时,它使用一个无注释的内部类,这就是为什么游标nedds是最终的

不幸的是,这意味着如果数据库中有5条消息,并且我选中了所有要删除的消息,那么所有消息都具有相同的guid,因为一旦将其设置为第一个值,就无法更改(为最终值)

我理解为什么它必须是final,就好像annonymous内部类的持续时间比创建游标的位置长,那么监听器将具有对不存在的对象的引用

我怎样才能解决这个问题?基本上,我如何使光标中的数据在复选框的onCheckedChanged方法中可用,而不使光标成为最终的

提前谢谢

public class ViewMessagesActivity extends Activity{

    private static final String TAG = ViewMessagesActivity.class.getSimpleName(); 
    final String               BACKPRESS_ACTION = "com.carefreegroup.rr3.BACKPRESS_ACTION";

    NfcScannerApplication nfcscannerapplication;
    Cursor cursorMessages;
    ListView listView;
    SimpleCursorAdapter adapter;
    MyAdapter myAdapter;
    TextView noMessages;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.viewmessages);

        nfcscannerapplication = (NfcScannerApplication) getApplication();





            //transactionCount = (TextView)findViewById(R.id.textviewtransactionsfordaycount);
            listView = (ListView) findViewById(R.id.listviewmessages);

            noMessages = (TextView)findViewById(R.id.textviewnomessageslabel);

            // get data
            cursorMessages = nfcscannerapplication.loginValidate.queryAllFromMessage();
            cursorMessages.moveToLast();
            startManagingCursor(cursorMessages);

            // setup adapter and show the data





            if(cursorMessages.getCount() == 0){


                noMessages.setVisibility(View.VISIBLE);
                listView.setVisibility(View.GONE);

            }else{

                listView.setVisibility(View.VISIBLE);
                noMessages.setVisibility(View.GONE);

            }




            String[] from = { 
                    LoginValidate.C_MESSAGE_CREATED_AT, LoginValidate.C_MESSAGE_TEXT, LoginValidate.C_MESSAGE_SENDER};
            int[] to = { R.id.messagecreatedat, R.id.messagetext, R.id.messagesender};

            myAdapter = new MyAdapter(nfcscannerapplication, R.layout.rowmessages, cursorMessages, from, to);
            listView.setAdapter(myAdapter);
            listView.setOnItemClickListener(myAdapter);



    }//end of onCreate







@Override
    protected void onResume() {
        super.onResume();


    }




private class MyAdapter extends SimpleCursorAdapter implements OnItemClickListener {

        public MyAdapter(Context context, int layout, Cursor c, String[] from,
                int[] to) {
            super(context, layout, c, from, to);


        }

        @Override
        public
        View getView(int position, View convertView, ViewGroup parent) {
            Log.e(TAG, "inside myadapter getview for messages");
            View v = super.getView(position, convertView, parent);
            if(v == null)
                return null;

            Cursor c = (Cursor)getItem(position);

            v.setTag(c);








            String messageSender = c.getString(c.getColumnIndex(LoginValidate.C_MESSAGE_SENDER));
            String isRepliedTo = c.getString(c.getColumnIndex(LoginValidate.C_MESSAGE_REPLIED));
            String isStandAlone = c.getString(c.getColumnIndex(LoginValidate.C_MESSAGE_IS_STANDALONE));




            ((TextView)v.findViewById(R.id.messagecreatedat)).setText(formattedMessCreatedAt );
            ((TextView)v.findViewById(R.id.messagetext)).setText(messageText);
            ((TextView)v.findViewById(R.id.messagesender)).setText(messageSender);

            //#003F87 = blue

            ((TextView)v.findViewById(R.id.messagecreatedat)).setTextColor(Color.parseColor("#003F87"));
            ((TextView)v.findViewById(R.id.messagesender)).setTextColor(Color.parseColor("#003F87"));
            ((TextView)v.findViewById(R.id.messagetext)).setTextColor(Color.parseColor("#FF0000"));




            CheckBox cb = ((CheckBox)v.findViewById(R.id.list_checkbox));
            cb.setOnCheckedChangeListener(new OnCheckedChangeListener() {

                @Override
                public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {


                    String messageGuid = c.getString(c.getColumnIndex(LoginValidate.C_MESSAGE_GUID));

                    if(isChecked == true){

                        Log.e(TAG, "checkBox true and guid = " + messageGuid);
                    }else{
                        Log.e(TAG, "checkBox false and guid = " + messageGuid);
                    }

                }
            });


            return v;
        }

        @Override
        public void onItemClick(AdapterView<?> parent, View view, int pos,
                long id) {

            Cursor itemCursor = (Cursor) view.getTag();

            String messageGuid = itemCursor.getString(itemCursor.getColumnIndex(LoginValidate.C_MESSAGE_GUID));



            String messageText = itemCursor.getString(itemCursor.getColumnIndex(LoginValidate.C_MESSAGE_TEXT));
            String messageCreatedAt = itemCursor.getString(itemCursor.getColumnIndex(LoginValidate.C_MESSAGE_CREATED_AT));
            String messageSender = itemCursor.getString(itemCursor.getColumnIndex(LoginValidate.C_MESSAGE_SENDER));
            String messageReplied = itemCursor.getString(itemCursor.getColumnIndex(LoginValidate.C_MESSAGE_REPLIED));
            String messageSeen = itemCursor.getString(itemCursor.getColumnIndex(LoginValidate.C_MESSAGE_SEEN));
            String isStandAlone = itemCursor.getString(itemCursor.getColumnIndex(LoginValidate.C_MESSAGE_IS_STANDALONE));

            Intent i = new Intent(ViewMessagesActivity.this, ReplyToMessageActivity.class);
            i.putExtra("guid", messageGuid);
            i.putExtra("message", messageText);
            i.putExtra("createdat", messageCreatedAt);
            i.putExtra("sender",  messageSender);
            i.putExtra("messagereplied", messageReplied);
            i.putExtra("messageseen", messageSeen);
            i.putExtra("isstandalone", isStandAlone);

            startActivity(i);



        }



    }// end of adapter




}
你有这个

Cursor c = (Cursor)getItem(position);
然后

因为它的内部类是匿名的,所以它要求游标是
final
。看看这些文件

为了避免这种情况,请将其声明为实例变量

private class MyAdapter extends SimpleCursorAdapter implements OnItemClickListener {
Cursor c;
然后在
getView

c = (Cursor)getItem(position);

你也应该考虑使用<代码> ViewHolder <代码>模式


另外,您可以在xml中使用1来代替2个布局
LinearLayout
RelativeLayout
,使光标成为全局的,并在需要在一个光标变量中执行不同类型的操作时使用布尔变量。@Ragunandan感谢您的回复。我现在不需要最后的修饰符,但是onCheckedChanged中的变量messageGuid对于每一行总是相同的值。有什么想法吗?@ TurtLoBOY,你还需要考虑ListVIEW视图回收。检查这个,如果它有帮助@Ragunandan好的,谢谢,我会看看你的建议,当我让它工作。我已经用Log.e(TAG,”(cursor)getItem(position)=“+c)注销了游标;我在[edit1]上发布的结果。@turtleboy在
getView
中,你在哪里膨胀版面,我看不到any@Ragunandan对不起,你什么意思?我的所有视图都从v变量中膨胀,例如CheckBox cb=((CheckBox)v.findViewById(R.id.list_CheckBox));对不起,我没听清你的意思。
CheckBox cb = ((CheckBox)v.findViewById(R.id.list_checkbox));
cb.setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
String messageGuid = c.getString(c.getColumnIndex(LoginValidate.C_MESSAGE_GUID));
private class MyAdapter extends SimpleCursorAdapter implements OnItemClickListener {
Cursor c;
c = (Cursor)getItem(position);