2012-04-24 45 views
2

以下是我ListActivity,在同一类中的onCreate代码如何在列表活动实施onItemClickListener

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

      fakeTripBuilder(); 

      setContentView(R.layout.cutom_list_view); 

      SimpleAdapter adapter = new SimpleAdapter(this, list, R.layout.custom_row_view, 
        new String[] {"stop","distance","time","icon","mode"}, 
        new int[] {R.id.text_stop,R.id.text_distance, R.id.text_time, R.id.icon, R.id.text_mode}); 

      populateList(); 
      setListAdapter(adapter); 
} 

我有以下方法

@Override 
     protected void onListItemClick(ListView l, View v, int position, long id){ 
      super.onListItemClick(l, v, position, id); 
      Log.d("Travel","You choosed!"); 
      Object o = this.getListAdapter().getItem(position); 
      Toast.makeText(this, "You Choosed"+o.toString(), Toast.LENGTH_LONG).show(); 
     } 

这里是“custom_list_view.xml”

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:clickable="false" 
    android:gravity="center_horizontal|center_vertical" 
    android:orientation="vertical" > 
<ListView 
    android:id="@android:id/list" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:background="#000fff" 
    android:layout_weight="2" 
    android:drawSelectorOnTop="false"> 
</ListView> 
<TextView 
    android:id="@id/android:empty" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:background="#FFff00" 
    android:text="No data" 
/> 
</LinearLayout> 

问题是,onListItemClick方法在我点击它时不会调用。帮帮我 !!

+0

您能更具体地了解NullPointerException吗? – 2012-04-24 13:57:29

+0

为什么你设置一个布局,并将其设置在setContentView和列表视图 – krisDrOid 2012-04-24 14:00:04

+0

你得到空指针,因为你没有设置列表视图布局findViewByID listView – krisDrOid 2012-04-24 14:01:12

回答

6

要获得在ListActivity到ListView参考你应该叫:

ListView lv = getListView(); 

你并不需要设置一个点击监听器,它已经有一个。只需覆盖:

@Override 
public void onListItemClick(ListView l, View v, int position, long id) { 
    Object item = lv.getAdapter().getItem(position); 

} 

而且在XML文件中,ListView中应该有ID:

android:id="@android:id/list" 

编辑

您需要删除

android:clickable="false" 

布局允许任何儿童意见被点击

+0

它定义为:android:id =“@ id/android:list”,并且在同一个类中我已经实现了“onListItemClick”,但它不会调用。这就是为什么我试图在问题中做到这一点。 – dinesh707 2012-04-24 14:15:59

+1

不是android:id =“@ id/android:list,但是android:id =”@ android:id/list“ – Style 2012-04-24 14:17:28

+0

是的,它必须是”@android:id/list“,否则它将不起作用 – 2012-04-24 14:29:22

0

ListView lv =(ListView)findViewById(R.layout.cutom_list_view);

您应该使用R.id.listview_id相反,应该在R.layout.cutom_list_view

定义,像这样:

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

编辑:

R.layout。 cutom_list_view是你的布局文件的id,但是你应该通过自己的id找到listview,像android:id =“@ + id/listview_id”,所以id将会是R.id.listview_id

+0

你是什么意思的布局xml?我应该放什么? – dinesh707 2012-04-24 14:01:48

+0

在这个布局中:cutom_list_view – Style 2012-04-24 14:02:55

+0

对不起,这是针对Activity,不是针对ListActivity,请看@David Scott在XML中的回答 – Style 2012-04-24 14:12:14

0

如果要捕获列表中的单击事件,请尝试重写onListItemClick方法。

1

自2012年询问此问题以来,发生了很大变化。这是一个更新到接受的答案

要在ListActivity使用onItemClickListener,只是重写onListItemClick(...)方法是这样的:

public void onListItemClick(ListView listView, View view, int position, long id) { 
    ListView myListView = getListView(); 
    Object itemClicked = myListView.getAdapter().getItem(position); 
    Toast.makeText(getApplicationContext(), "Item Clicked: " + item + " \nPosition: " + id, 

    Toast.LENGTH_SHORT).show(); 
} 

通知的getItem()方法,而不是getItemAtPosition()在接受的答案

记住:为此工作,您需要有一个id为list否则你的应用会崩溃。

<ListView 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:id="@+id/list" 
    /> 
+0

您仍然需要将android:id =“@ android:id/list”作为ListView的id,而不仅仅是列表 – 2015-11-17 13:02:08