ListView, приводящий к nullpointerexception в setOnItemClickListener

1

Я пытаюсь работать с помощью некоторого учебного кода и добавлять в OnItemClick Listener, но продолжаю бросать исключение, когда он попадает на слушателя и разбивает мое приложение. Это моя первая попытка работать в среде Android, поэтому я пытаюсь узнать, как все эти вещи взаимосвязаны.

Вот что я пробовал:

import java.util.ArrayList;
import java.util.List;

import org.json.JSONObject;

import android.app.AlertDialog;
import android.app.ListActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ListView;


public class RssActivity extends ListActivity{

private RssListAdapter adapter;

private OnItemClickListener newsSelectListener = new OnItemClickListener()
    {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            AlertDialog.Builder alert=new AlertDialog.Builder(RssActivity.this);
            alert.setTitle("Clicked").setMessage("Item clicked").setNeutralButton("OK", null).show();

        }
    };

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

    List<JSONObject> jobs = new ArrayList<JSONObject>();
    try {
        jobs = RssReader.getLatestRssFeed();
    } catch (Exception e) {
        Log.e("RSS ERROR", "Error loading RSS Feed Stream >> " + e.getMessage() + " //" + e.toString());
    }   

    adapter = new RssListAdapter(this,jobs);
    setListAdapter(adapter);

    ListView lv = (ListView)findViewById(R.id.list);
    lv.setOnItemClickListener(newsSelectListener);

    }
}       

Я также попытался изменить setListAdapter на lv.setListAdapter, но это не похоже на действительный оператор.

Что мне не хватает?

  • 0
    Вы не устанавливаете setContentView - посмотрите на мой ответ.
  • 0
    @Xeon - Спасибо. Я на самом деле был в состоянии получить доступ к слушателю без установки setContentView. Проверьте подход Zipc.
Теги:
android-listview

4 ответа

3
Лучший ответ

ListActivity не требует назначения макета через setContentView(), если вы хотите показать только список, но если вы добавите другое представление, ваш ListView должен содержать атрибут android:id установленный в @android:id/list like этот xml ниже

<ListView
  android:id="@android:id/list"
  android:layout_width="match_parent"
  android:layout_height="wrap_content" >
</ListView>

попробуйте изменить свой код

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

к этому

ListView lv = getListView();
lv.setOnItemClickListener(newsSelectListener);
  • 0
    Это сработало отлично! Спасибо за краткое быстрое решение.
1

Я не вижу, где вы инициализировали свой макет... так:

Класс Activity заботится о создании окна для вас, в котором вы можете разместить свой пользовательский интерфейс с помощью setContentView(View).

Метод onCreate(Bundle) инициализирует вашу Activity. Здесь вы обычно называете setContentView(int) своим макетом xml (main.xml или xml, который определяет ваш пользовательский интерфейс). Поместите его после super.onCreate(..)


Что касается этого исключения:

java.lang.RuntimeException: Unable to start activity ComponentInfo{}:

проверьте свой AndroidManifest.xml если ваша Activity уже есть:

<activity android:name=".<ActivityName>" 
          android:label="@string/app_name">
</activity>

Если ваша проблема не была решена, используйте свой Logcat и поместите Log.d в свои методы, чтобы увидеть, где он сбой.

1

Я не уверен, что ваш код будет работать

private OnItemClickListener newsSelectListener = new OnItemClickListener()
{
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        AlertDialog.Builder alert=new AlertDialog.Builder(RssActivity.this);
        alert.setTitle("Clicked").setMessage("Item clicked").setNeutralButton("OK", null).show();

    }
};

Но, на мой взгляд, я часто добавляю setOnClickListener() в convertView в методе getView в классе Adapter

public View getView(final int position, View convertView, ViewGroup parent) {
......................
convertView.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                //Do Somethings in here
                }
            }
        });
0

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

Хорошо - и где вы устанавливаете setContentView(...)? lv

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

null, потому что вы не задали contentView.


Вероятно, причина этого заключается в следующем: вы устанавливаете OnClickListener в null в AlertDialog.Builder в setNeutralButton("OK", null).

Поэтому, когда вы нажимаете "ОК", Android вызывает (внутренне) что-то вроде этого:

neutralButtonListener.onClick(...);

И neutralButtonListener равен null. Поэтому вы должны просто предоставить пустой слушатель хотя бы.

  • 0
    Кнопка не проблема из того, что я могу сказать. Деятельность не запустится вообще. Я никогда не смогу увидеть просмотр списка. Сбой происходит во время onCreate, когда он попадает в слушателя. Вот как объясняется исключение: 05-31 17: 28: 00.527: E / AndroidRuntime (939): java.lang.RuntimeException: невозможно запустить действие ComponentInfo {... Activity}: java.lang.RuntimeException: невозможно запустить Activity ComponentInfo {... RssActivity}: java.lang.NullPointerException

Ещё вопросы

Сообщество Overcoder
Наверх
Меню