android listview行id映射到匿名内部类中的CursorAdapter行

android listview行id映射到匿名内部类中的CursorAdapter行,android,listview,simplecursoradapter,Android,Listview,Simplecursoradapter,我有一个SimpleCursorAdapter类,它从DB中获取各种数据并显示在ListView中。它实现了一个onclicklistener,用于向另一个活动发送messageGuid字符串。这一切都很好 在ListView的行中,我添加了一个复选框,并为其设置了一个onCheckChangeListener。选中复选框时,messageGuid始终是光标中的最后一个 我需要找到一种方法来获取包含已选中复选框的行的listview行id。然后,我可以获得正确的光标行,然后依次获得正确的mess

我有一个SimpleCursorAdapter类,它从DB中获取各种数据并显示在ListView中。它实现了一个onclicklistener,用于向另一个活动发送messageGuid字符串。这一切都很好

在ListView的行中,我添加了一个复选框,并为其设置了一个onCheckChangeListener。选中复选框时,messageGuid始终是光标中的最后一个

我需要找到一种方法来获取包含已选中复选框的行的listview行id。然后,我可以获得正确的光标行,然后依次获得正确的messageGuid

我已经在onCheckedChanged方法中注释了我想要的内容

事先谢谢你,马特

private class MyAdapter extends SimpleCursorAdapter implements OnItemClickListener {


    Cursor c;
    String messageGuid;


        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;

            c = (Cursor)getItem(position);

            Log.e(TAG, "(Cursor)getItem(position) = " + c + "position = " + position);

            v.setTag(c);


            //other code removed, not relevant



            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) {

                    //i'd like to something like below where i can specify the row which contains
                    //the checkbox that has been check and map that to the row in the cursor.
                    // So if the checkbox in the 2nd row in the listview has been clicked then the messageGuid from the 2nd row in the cursor is found

                    //c.moveToPosition(the row position of the listview which holds the checkbox that has been clicked );

                    messageGuid = null; 
                    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
私有类MyAdapter扩展了SimpleCursorAdapter实现了McClickListener{
光标c;
字符串messageGuid;
公共MyAdapter(上下文上下文、int布局、游标c、字符串[]from、,
int[]至){
super(上下文、布局、c、from、to);
}
@凌驾
公众的
视图getView(int位置、视图转换视图、视图组父视图){
Log.e(标记“在myadapter getview中查看消息”);
视图v=super.getView(位置、转换视图、父级);
如果(v==null)
返回null;
c=(光标)getItem(位置);
Log.e(TAG,”(Cursor)getItem(position)=“+c+”position=“+position”);
v、 setTag(c);
//其他代码已删除,不相关
String messageSender=c.getString(c.getColumnIndex(LoginValidate.c_MESSAGE_SENDER));
String isRepliedTo=c.getString(c.getColumnIndex(LoginValidate.c_消息_回复));
String isStandAlone=c.getString(c.getColumnIndex(LoginValidate.c_MESSAGE_是独立的));
((TextView)v.findViewById(R.id.messagecreatedat)).setText(formattedmescreatedat);
((TextView)v.findViewById(R.id.messagetext)).setText(messagetext);
((TextView)v.findViewById(R.id.messagesender)).setText(messagesender);
//#003F87=蓝色
((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”);
复选框cb=((复选框)v.findViewById(R.id.list_复选框));
cb.setOnCheckedChangeListener(新的OnCheckedChangeListener(){
@凌驾
检查更改后的公共无效(复合按钮视图,布尔值已检查){
//我想在下面这样的地方指定包含
//选中的复选框并将其映射到光标中的行。
//因此,如果已单击listview第二行中的复选框,则会找到光标第二行中的messageGuid
//c、 moveToPosition(保存已单击复选框的listview的行位置);
messageGuid=null;
messageGuid=c.getString(c.getColumnIndex(LoginValidate.c_MESSAGE_GUID));
如果(isChecked==true){
Log.e(标记“复选框true和guid=“+messageGuid”);
}否则{
Log.e(标记“checkBox false和guid=“+messageGuid”);
}  
}
});
返回v;
}
@凌驾
public void onItemClick(AdapterView父级、视图、int pos、,
长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 messagerepled=itemCursor.getString(itemCursor.getColumnIndex(LoginValidate.C_MESSAGE_repled));
String messageSeen=itemCursor.getString(itemCursor.getColumnIndex(LoginValidate.C_MESSAGE_SEEN));
String isStandAlone=itemCursor.getString(itemCursor.getColumnIndex(LoginValidate.C_MESSAGE_IS_STANDALONE));
意图i=新意图(ViewMessagesActivity.this,ReplyToMessageActivity.class);
i、 putExtra(“guid”,messageGuid);
i、 putExtra(“消息”,messageText);
i、 putExtra(“createdat”,messageCreatedAt);
i、 putExtra(“发件人”,messageSender);
i、 putExtra(“messagereplied”,messagereplied);
i、 putExtra(“messageseen”,messageseen);
i、 putExtra(“ISSTANDONALE”,ISSTANDONALE);
星触觉(i);
}
}//适配器端部

确定位置
最终
并在检查更改后的
上使用该位置

使cb
final

在cb.setOnCheckedChangeListener之前添加

cb.setTag(position);
public void onCheckedChanged
中,您可以检索该职位

int pos = (Integer) cb.getTag();

嘿,非常感谢,它工作得很好;)几分钟后我会接受的。