использовать события щелчка в адаптере курсора

У меня есть список элементов, отображаемых адаптером курсора, когда я использую onItemClick, я получаю правильную строку и могу делать то, что мне нужно (моя цель - добавить представление к этому элементу при щелчке. теперь мне нужно это действие t происходит при нажатии кнопки в ячейке listView, однако события нажатия кнопки возвращают не правильную ячейку, а скорее случайные другие ячейки в списке, вот пример из моего кода:

public class CustumAdapter extends CursorAdapter implements OnClickListener{
    
    private Context context;
    
    private Button btn_maybe;

    private String name;

    public CustumAdapter(Context context, Cursor c, LatLng position) {
        super(context, c);
        
        this.position = position;
        this.context = context;
        
    }

    @Override
    public void bindView(View view, final Context context, Cursor c) {
    
        name = c.getString(c.getColumnIndex(ContractPlaces.PLACE_NAME));
        btn_maybe = (Button) view.findViewById(R.id.cursor_layout_maybe);
        btn_maybe.setOnClickListener(new OnClickListener() {
            
            @Override
            public void onClick(View v) {
                
                //i need to use the correct view from BindView here
                
            }
        });
        
        
        
        nameView.setText(name);

В этом примере кода я хочу, чтобы щелчок по кнопке в ячейке позволил мне получить доступ к представлению, в котором кнопка действительно находится, однако я получаю обратно представления из случайных ячеек списка, как я могу получить правильную информацию о ячейке в моем прослушивателе кликов?

РЕДАКТИРОВАТЬ:

поэтому благодаря @darnmason я понял это, чтобы получить представление для элемента списка с помощью события щелчка в адаптере курсора, установите для рассматриваемой кнопки тег, который будет cursor.getPosition(), поэтому тег является правильным позиция элемента, в истинной сущности жизненного цикла списка, если я хочу просмотреть элемент в определенной позиции, я позвоню

  //where lv is the ListView (you can pass it to the adapter as a parameter).
//getChildAt returns a view in a position
//value is the value of cursor.getPosition() so its the correct position of the item where //the button was clicked.
//lv.getFirstVisiblePosition() is the first position that is actually on screen,
    View view = lv.getChildAt(value - lv.getFirstVisiblePosition());

когда вы вычтете это из фактической позиции, вы получите нужную позицию, не забудьте добавить

 if(view == null)
               return;

чтобы избежать исключений.


person Ziv Kesten    schedule 05.06.2014    source источник


Ответы (3)


name объявлен в классе и перезаписывается каждый раз, когда выполняется bindView, когда вы нажимаете кнопку, последнее связанное представление отображается в Toast.

Шаблон, которому я предпочитаю следовать, состоит в том, чтобы хранить индекс кликабельного представления в его теге. Затем в onClick вы получаете индекс из представления и данные для этого индекса из адаптера.

person darnmason    schedule 05.06.2014
comment
моя проблема в том, что в onClickListener я получаю только представление кнопки, и мне нужно представление всей ячейки, как в bindView - person Ziv Kesten; 05.06.2014
comment
Я имею в виду установить тег на кнопку в bindView, поэтому в onClick вы получите индекс из тега - person darnmason; 06.06.2014

Вы можете использовать setTag и getTag

btn_maybe.setTag(name);

Затем в onClick

String value = (String) v.getTag();

Используйте значение для отображения всплывающего уведомления

Toast.makeText(context, value, Toast.LENGTH_SHORT).show();
person Raghunandan    schedule 05.06.2014
comment
извините, я не был более конкретным, но имя String было просто примером, мне действительно нужно представление. - person Ziv Kesten; 05.06.2014
comment
@ZivKesten, о каком взгляде ты говоришь. - person Raghunandan; 05.06.2014
comment
вид ячейки, над которой я работаю в то время, вид из bindView - person Ziv Kesten; 05.06.2014
comment
@ZivKesten использует тот же метод, вы можете установить тег и получить тег вместо имени, это будет представление - person Raghunandan; 05.06.2014
comment
я пытался, но в onClickLIstener я получаю представление для кнопки, а не представление для ячейки, и это то, с чем мне нужно работать - person Ziv Kesten; 05.06.2014
comment
попробовал это в том же тосте, получил правильную информацию из представления кнопки и случайную информацию из представления, которое я пометил из представления привязки, можете ли вы опубликовать пример кода о том, как использовать эту кнопку, чтобы что-то изменить в представлении, пожалуйста? спасибо за всю помощь. - person Ziv Kesten; 05.06.2014
comment
Давайте продолжим это обсуждение в чате. - person Raghunandan; 05.06.2014

Вы можете создать свой собственный класс, реализующий onClickListener, и предоставить объект конструктору:

private static MyOnClickListener implements OnClickListener {
        Context mContext;
        String mName;
        public MyOnClickListener(Context context, String name) {
           mContext = context; 
           mName = name;
         }

        @Override
        public void onClick(View v) {
            Toast.makeText(mContext, mName, Toast.LENGTH_SHORT).show();
        }
}

@Override
public void bindView(View view, final Context context, Cursor c) {

   name = c.getString(c.getColumnIndex(ContractPlaces.PLACE_NAME));
   btn_maybe = (Button) view.findViewById(R.id.cursor_layout_maybe);
   btn_maybe.setOnClickListener(new MyOnClickListener(context, name));  
person Blackbelt    schedule 05.06.2014