Как запустить onListItemClick в Listactivity с кнопками в списке?

У меня есть простой ListActivity, который использует пользовательский ListAdapter для генерации представлений в списке. Обычно ListAdapter просто заполнил бы представления TextViews, но теперь я хочу поместить кнопку там также.

Именно мое понимание и опыт однако помещение focusable представления в элементе списка предотвращает увольнение onListItemClick () в ListActivity, когда элемент списка нажат. Кнопка все еще функционирует обычно в элементе списка, но когда что-то помимо кнопки нажимается, я хочу, чтобы onListItemClick был инициирован.

Как я могу сделать эту работу?

89
задан Dan Hulme 30 March 2013 в 12:52
поделиться

1 ответ

Надеюсь, я смогу здесь помочь. Я предполагаю, что у вас есть собственный макет для элементов listView, и этот макет состоит из кнопки и некоторых других представлений, таких как TextView, ImageView или что-то еще. Теперь вы хотите, чтобы при нажатии кнопки запускалось другое событие, а при нажатии на все остальные события запускалось другое событие.

Вы можете добиться этого, не используя onListItemClick () вашего ListActivity.
Вот что вам нужно сделать:

Вы используете настраиваемый макет, поэтому, вероятно, вы переопределяете метод getView () своего настраиваемого адаптера. Хитрость заключается в том, чтобы установить разных слушателей для вашей кнопки и разных для всего представления (вашей строки). Взгляните на пример:

private class MyAdapter extends ArrayAdapter<String> implements OnClickListener {

    public MyAdapter(Context context, int resource, int textViewResourceId,
            List<String> objects) {
        super(context, resource, textViewResourceId, objects);
    }


    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        String text = getItem(position);
        if (null == convertView) {
            convertView = mInflater.inflate(R.layout.custom_row, null);
        }
        //take the Button and set listener. It will be invoked when you click the button.
        Button btn = (Button) convertView.findViewById(R.id.button);
        btn.setOnClickListener(this);
        //set the text... not important     
        TextView tv = (TextView) convertView.findViewById(R.id.text);
        tv.setText(text);
        //!!! and this is the most important part: you are settin listener for the whole row
        convertView.setOnClickListener(new OnItemClickListener(position));
        return convertView;
    }

    @Override
    public void onClick(View v) {
        Log.v(TAG, "Row button clicked");
    }
}

Ваш класс OnItemClickListener можно объявить, как здесь:

private class OnItemClickListener implements OnClickListener{       
    private int mPosition;
    OnItemClickListener(int position){
        mPosition = position;
    }
    @Override
    public void onClick(View arg0) {
        Log.v(TAG, "onItemClick at position" + mPosition);          
    }       
}

Конечно, вы, вероятно, добавите еще несколько параметров в конструктор OnItemClickListener.
И одна важная вещь - реализация getView, показанная выше, довольно уродлива, обычно вы должны использовать шаблон ViewHolder, чтобы избежать вызовов findViewById ... но вы, вероятно, уже это знаете.
Мой файл custom_row.xml - это RelativeLayout с кнопкой с идентификатором «кнопка», TextView с идентификатором «текст» и ImageView с идентификатором «изображение» - просто чтобы прояснить ситуацию.
С уважением!

59
ответ дан 24 November 2019 в 07:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: