Я пытаюсь работать с помощью некоторого учебного кода и добавлять в 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, но это не похоже на действительный оператор.
Что мне не хватает?
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);
Я не вижу, где вы инициализировали свой макет... так:
Класс
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
в свои методы, чтобы увидеть, где он сбой.
Я не уверен, что ваш код будет работать
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
}
}
});
РЕДАКТИРОВАТЬ
Хорошо - и где вы устанавливаете setContentView(...)
? lv
ListView lv = (ListView) findViewById(R.id.list);
null, потому что вы не задали contentView.
Вероятно, причина этого заключается в следующем: вы устанавливаете OnClickListener
в null
в AlertDialog.Builder
в setNeutralButton("OK", null)
.
Поэтому, когда вы нажимаете "ОК", Android вызывает (внутренне) что-то вроде этого:
neutralButtonListener.onClick(...);
И neutralButtonListener
равен null
. Поэтому вы должны просто предоставить пустой слушатель хотя бы.
setContentView
- посмотрите на мой ответ.