Идентификатор строки списка Android, сопоставленный со строкой CursorAdapter во внутреннем классе Anonymous

У меня есть класс SimpleCursorAdapter, он получает различные данные из БД и отображает их в ListView. Он реализует onclicklistener, который отправляет строку messageGuid другому действию. Все это прекрасно работает.

В строке ListView я добавил CheckBox и установил для него onCheckChangeListener. В момент, когда флажок установлен, messageGuid всегда находится последним в курсоре.

Мне нужно найти способ получить идентификатор строки списка для строки, в которой установлен флажок, который был отмечен. Затем я могу получить правильную строку курсора, а затем, в свою очередь, правильный 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

person turtleboy    schedule 10.01.2014    source источник


Ответы (1)


Займите позицию final и используйте ее на onCheckedChanged

or

сделать КБ final

Добавить перед cb.setOnCheckedChangeListener

cb.setTag(position);

И в public void onCheckedChanged вы можете получить позицию

int pos = (Integer) cb.getTag();
person Niko    schedule 10.01.2014
comment
Эй, большое спасибо, это работает отлично;) Я приму, когда смогу, через несколько минут. - person turtleboy; 10.01.2014