Вопрос по java, android, eclipse – ListView, приводящий к nullpointerexception в setOnItemClickListener

1

Я пытаюсь поработать с помощью некоторого учебного кода и добавить слушателя OnItemClick, но продолжаю выдавать исключение, когда оно попадает в слушателя и приводит к сбою моего приложения. Это моя первая попытка работы в среде 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, но это, по-видимому, не является действительным утверждением.

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

@Xeon - Спасибо. Я на самом деле был в состоянии получить доступ к слушателю без установки setContentView. Проверьте подход zipc. Evan Dyson
Вы не настраиваетеsetContentView - посмотри на мой ответ. Xeon

Ваш Ответ

4   ответа
0

EDIT

Хорошо - и где ты сидишьsetContentView(...)?lv

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

является нулевым, потому что вы не установили contentView.

Вероятно, причина этого в том, что вы настраиваетеOnClickListener вnull вAlertDialog.Builder вsetNeutralButton("OK", null).

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

neutralButtonListener.onClick(...);

ИneutralButtonListener являетсяnull, Таким образом, вы должны просто предоставить пустой слушатель по крайней мере.

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

Activity class takes care of creating a window for you in which you can place your UI with 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() конвертировать в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
                }
            }
        });
3

setContentView() то есть если хочешь показатьonly список, но если вы добавите другое представление, ваш ListView должен содержатьandroid:id атрибут установлен в@android:id/list как этот 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);
Это сработало отлично! Спасибо за краткое быстрое решение. Evan Dyson

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