OnClick с пользовательским адаптером и Listview

#android #listview #onclick #adapter

#Android #listview #onclick #адаптер

Вопрос:

Просмотрел множество других сообщений и попробовал несколько вариантов, но пока безуспешно…

Получение NPE со следующим адаптером пользовательского списка, определенным как so:

 public ListView tripList;
....
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    ....

        // build a listView adapter
        Log.i(LOGTAG,"About to create listView...");
        tripList = (ListView) findViewById(android.R.id.list);
        Log.i(LOGTAG,"ListView created...");

        Log.i(LOGTAG,"About to create adapter...");
        tripAdapter = new tripListAdapter(this, tripCur);
        setListAdapter(tripAdapter);

    }

    setContentView(R.layout.activity_trip_display);
  

… и адаптер имеет это:

 // custom list adaptor class
private class tripListAdapter extends CursorAdapter {

    //private final Cursor dataC;
    private final LayoutInflater vi;

    public tripListAdapter(Context con, Cursor c) {
        // super constructor thingy
        super(con, c);
        //dataC = c;
        vi = LayoutInflater.from(con);

    }

@Override
    public View getView (int position, View tripView, ViewGroup parent){

        Log.i(LOGTAG,"In getView...");
        // Create a message handling object as an anonymous class.
        //mTripClickHandler = new OnItemClickListener() {

// NPE ERROR ON THIS NEXT LINE (line 228):
        tripList.setOnItemClickListener(new OnItemClickListener() {
            public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
                // Do something in response to the click
                // Enable other buttons
                togBtns(true);
  

LogCat:

 06-13 09:47:49.195: I/WIBBLE(864): ListView created...
06-13 09:47:49.195: I/WIBBLE(864): About to create adapter...
06-13 09:47:49.285: I/WIBBLE(864): OnResume with this many rows returned by cursor: 3
06-13 09:47:49.285: I/WIBBLE(864): In the loop, so cursor is not null....
06-13 09:47:49.375: I/WIBBLE(864): In getView...
06-13 09:47:49.387: D/AndroidRuntime(864): Shutting down VM
06-13 09:47:49.387: W/dalvikvm(864): threadid=1: thread exiting with uncaught exception (group=0x414c4700)
06-13 09:47:49.505: E/AndroidRuntime(864): FATAL EXCEPTION: main
06-13 09:47:49.505: E/AndroidRuntime(864): java.lang.NullPointerException
06-13 09:47:49.505: E/AndroidRuntime(864):  at  com.example.myfirstapp.DisplayTripsActivity$tripListAdapter.getView(DisplayTripsActivity.java:228)
06-13 09:47:49.505: E/AndroidRuntime(864):  at android.widget.AbsListView.obtainView(AbsListView.java:2177)
06-13 09:47:49.505: E/AndroidRuntime(864):  at android.widget.ListView.measureHeightOfChildren(ListView.java:1247)
06-13 09:47:49.505: E/AndroidRuntime(864):  at android.widget.ListView.onMeasure(ListView.java:1159)
06-13 09:47:49.505: E/AndroidRuntime(864):  at android.view.View.measure(View.java:15848)
06-13 09:47:49.505: E/AndroidRuntime(864):  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5008)
  

Любой совет с благодарностью получен.

РЕДАКТИРОВАТЬ: если я заменю:

 //tripList = (ListView) findViewById(android.R.id.list);
  

с:

 tripList = getListView();
  

… Я двигаюсь дальше (см. Сообщения WIBBLE), но получаю другой NPE, хотя, похоже, это какая-то системная процедура:

 06-13 10:26:49.825: I/WIBBLE(934): About to create listView...
06-13 10:26:49.865: I/WIBBLE(934): ListView created...
06-13 10:26:49.865: I/WIBBLE(934): About to create adapter...
06-13 10:26:49.945: I/WIBBLE(934): OnResume with this many rows returned by cursor: 3
06-13 10:26:49.945: I/WIBBLE(934): In the loop, so cursor is not null....
06-13 10:26:50.035: I/WIBBLE(934): In getView...
06-13 10:26:50.035: I/WIBBLE(934): Leaving getView...
06-13 10:26:50.035: D/AndroidRuntime(934): Shutting down VM
06-13 10:26:50.035: W/dalvikvm(934): threadid=1: thread exiting with uncaught exception (group=0x414c4700)
06-13 10:26:50.185: E/AndroidRuntime(934): FATAL EXCEPTION: main
06-13 10:26:50.185: E/AndroidRuntime(934): java.lang.NullPointerException
06-13 10:26:50.185: E/AndroidRuntime(934):  at android.widget.AbsListView.obtainView(AbsListView.java:2179)
06-13 10:26:50.185: E/AndroidRuntime(934):  at  android.widget.ListView.measureHeightOfChildren(ListView.java:1247)
06-13 10:26:50.185: E/AndroidRuntime(934):  at android.widget.ListView.onMeasure(ListView.java:1159)
06-13 10:26:50.185: E/AndroidRuntime(934):  at android.view.View.measure(View.java:15848)
06-13 10:26:50.185: E/AndroidRuntime(934):  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5008)
06-13 10:26:50.185: E/AndroidRuntime(934):  at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1404)
06-13 10:26:50.185: E/AndroidRuntime(934):  at android.widget.LinearLayout.measureHorizontal(LinearLayout.java:1052)
06-13 10:26:50.185: E/AndroidRuntime(934):  at android.widget.LinearLayout.onMeasure(LinearLayout.java:590)
06-13 10:26:50.185: E/AndroidRuntime(934):  at android.view.View.measure(View.java:15848)
  

… и множество других строк, ни одна из которых не ссылается на мой код.

Ответ №1:

Вы не должны устанавливать onItemClickListener из Adapter . Речь Adapter идет только о создании отдельных представлений элементов списка. Установите значение onItemClickListener из вашего Activity (или Fragment ) после увеличения представления.

Похоже, что в настоящее время вы не настраиваете представление Activities, поэтому TripList ListView имеет значение NULL. Используется setContentView(R.layout.your_layout) для настройки представления в формате xml.

Возможно, вы захотите опубликовать большую часть своего кода. Это действие или фрагмент? Вы расширяете базовую активность / фрагмент или что-то еще, например, ListActivity / ListFragment. Интересно, потому что вы обращаетесь к R-файлу Android вместо своего собственного (android.R.id.list против R.id.list)

Обновить

Хорошо, я ответил на свой собственный вопрос. Вы используете ListActivity (или ListFragment), поэтому вы используете R-файл Android. Я бы изменил это на getListView() вместо findViewById . И все же я бы переместил setOnItemClickListener и опубликовал новые исключения NPE, поскольку это правильный способ сделать это.

Комментарии:

1. В предыдущем ответе специально говорилось, чтобы поместить onClick внутри getView адаптера для пользовательского адаптера. Я уже пробовал использовать onClick в activity и получил другие ошибки NPE. Существует вызов setContentView — это просто следующая строка, но я не стал ее вставлять…

2. Я написал множество пользовательских адаптеров, и мне никогда не нужно было устанавливать прослушиватель щелчков в адаптере. Вы расширяете ArrayAdapter, BaseAdapter, … ?

3. CursorAdapter — по общему признанию, когда у меня был onClick в activity, я, по крайней мере, заполнил список, но ответа на щелчок не последовало, как будто onClick не существовал. Именно тогда я начал искать здесь и увидел предложение использовать getView…

4. Добавлено немного больше кода — не нравится вводить слишком много, иначе становится слишком сложно следовать…

5. Если вы расширяете ListActivity, вы не можете (или, по крайней мере, не должны) setContentView

Ответ №2:

При назначении переменной tripView для ListView вы используете:

 tripList = (ListView) findViewById(android.R.id.list);
  

Попробуйте изменить эту строку на:

 tripList = (ListView) findViewById(R.id.list);
  

Вместо android.R поиска нужного элемента (где он, вероятно, не завершается), найдите свой элемент ListView в R-файле, сгенерированном при создании вашего проекта.

Обязательно перестройте свой проект перед его запуском.

Комментарии:

1. Если я это сделаю, я получу ошибку компиляции «список не может быть разрешен или не является полем».

2. Это ListActivity или просто обычный Activity класс с ListView добавленным к нему представлением??