Android: добавьте прослушиватели событий для каждого элемента в ListView - PullRequest
3 голосов
/ 04 октября 2010

У меня есть приложение Android с ListView, и у каждой строки в списке есть TextView и кнопка. Что я хочу сделать, это добавить OnClickListener к каждой кнопке в ListView, но я не могу понять, как получить какую-то ссылку на каждую кнопку ... Может кто-нибудь дать мне подсказку?

Вот мой XML, связанный с ListAdapter:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content">
<TextView 
    android:id="@+id/row_text"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentLeft="true"
    android:textSize="18sp">
</TextView>
<Button
    android:id="@+id/row_button"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentRight="true" />
</RelativeLayout>

И я попробовал что-то подобное, но это не работает:

SimpleCursorAdapter rows = new SimpleCursorAdapter(this, R.layout.row_layout, cursor, from, to);
setListAdapter(rows);
Button button = (Button) getListAdapter().getView(0, null, getListAdapter()).findViewById(R.id.row_button);
button.setOnClickListener(new View.OnClickListener() {
    @Override public void onClick(View v) {
        Log.i(TAG, "clicked");
    }
}); 

Ответы [ 2 ]

11 голосов
/ 04 октября 2010

Невозможно использовать SimpleCursorAdapter ... вам придется создать свой собственный адаптер.Если вы не хотите писать собственный адаптер, по крайней мере, попробуйте расширить SimpleCursorAdapter новыми возможностями.Например:

public class YourAdapter extends SimpleCursorAdapter{

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

    public View getView(int position, View convertView, ViewGroup parent){
        View view = super.getView(position, convertView, parent);
        Button button = (Button)view.findViewById(R.id.row_button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override public void onClick(View v) {
                Log.i(TAG, "clicked");
            }
        }); 
        return view;
    }
}

Затем вы можете сделать:

SimpleCursorAdapter rows = new YourAdapter(this, R.layout.row_layout, cursor, from, to);
setListAdapter(rows);
0 голосов
/ 05 ноября 2012

Что касается ответа Кристиана, я обнаружил, что getView вызывается много раз, а не только при создании представления. Таким образом, вы будете выполнять код getView чаще, чем вы думаете.

Если добавляемые вами атрибуты (например, прослушиватель OnClick) являются инвариантными для всех элементов в списке, вы можете вместо этого переопределить newView. Он будет вызываться ровно один раз для каждой отображаемой строки в ListView. Однако имейте в виду, что ListView перезаписывает представления, поэтому при прокрутке те, которые выпадают с одного конца представления, повторно используются с другого, но с новыми данными из курсора. Опять же, пока ваши атрибуты инвариантны, это будет прекрасно работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...