2012-05-31 3 views
1

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

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

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' - посмотрите на мой ответ. – Xeon

+0

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

ответ

3

ListActivity не требует, чтобы назначить макет через setContentView(), то есть если вы хотите, чтобы показать только список, но если добавить еще один вид, ваш 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); 
+0

Это сработало отлично! Спасибо за краткое быстрое исправление. –

0

EDIT

Ok - и где вы настройки setContentView(...)? lv

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

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


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

Так при нажатии кнопки "OK" Android Запускает (внутри) что-то вроде этого:

neutralButtonListener.onClick(...); 

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

+0

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

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 
       } 
      } 
     }); 
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 в ваших методах, чтобы увидеть, где он падает.

Смежные вопросы