#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
добавленным к нему представлением??