如何在Android的ListView中处理点击事件?

以下是我的testing代码创build列表视图,列表视图显示成功,但是,在点击事件中有错误。 我想创build一个意图发送硬编码信息到一个新的活动。 但是,它显示错误的行

Intent intent = new Intent(context, SendMessage.class); 

所以,问题是,我应该为这个class级提供什么?

此外,而不是硬编码的输出消息,如何捕获列表视图行中的数据,并传递给新的活动? 例如第一行的BBB,AAA,R.drawable.tab1_hdpi

谢谢。

 public class MainActivity extends Activity { public final static String EXTRA_MESSAGE = "com.example.ListViewTest.MESSAGE"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ArrayList<ListEntry> members = new ArrayList<ListEntry>(); members.add(new ListEntry("BBB","AAA",R.drawable.tab1_hdpi)); members.add(new ListEntry("ccc","ddd",R.drawable.tab2_hdpi)); members.add(new ListEntry("assa","cxv",R.drawable.tab3_hdpi)); members.add(new ListEntry("BcxsadvBB","AcxdxvAA")); members.add(new ListEntry("BcxvadsBB","AcxzvAA")); members.add(new ListEntry("BcxvBB","AcxvAA")); members.add(new ListEntry("BvBB","AcxsvAA")); members.add(new ListEntry("BcxvBB","AcxsvzAA")); members.add(new ListEntry("Bcxadv","AcsxvAA")); members.add(new ListEntry("BcxcxB","AcxsvAA")); ListView lv = (ListView)findViewById(R.id.listView1); Log.i("testTag","before start adapter"); StringArrayAdapter ad = new StringArrayAdapter (members,this); Log.i("testTag","after start adapter"); Log.i("testTag","set adapter"); lv.setAdapter(ad); lv.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { Intent intent = new Intent(context, SendMessage.class); String message = "abc"; intent.putExtra(EXTRA_MESSAGE, message); startActivity(intent); } }); } 

我看不出你在哪里声明context 。 为了创build目的,您可以使用MainActivity.this

  lv.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { Intent intent = new Intent(MainActivity.this, SendMessage.class); String message = "abc"; intent.putExtra(EXTRA_MESSAGE, message); startActivity(intent); } }); 

点击后检索对象,可以使用AdapterView

 ListEntry entry = (ListEntry) parent.getItemAtPosition(position); 

ListView具有项目点击侦听器callback。 你应该在ListView设置onItemClickListener 。 callback包含AdapterViewposition作为参数。 哪个可以给你ListEntry

 lv.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { ListEntry entry= (ListEntry) parent.getAdapter().getItem(position); Intent intent = new Intent(MainActivity.this, SendMessage.class); String message = entry.getMessage(); intent.putExtra(EXTRA_MESSAGE, message); startActivity(intent); } }); 

正如你所说,错误来自于你的代码

 Intent intent = new Intent(context, SendMessage.class); 

这是由于您将OnItemClickListener匿名类的上下文提供给Intent构造函数,但根据Intent的构造函数

 android.content.Intent.Intent(Context packageContext, Class<?> cls) 

您必须提供您正在使用intent的活动(即MainActivity类上下文)的上下文。 所以你的错误将被转换为

 Intent intent = new Intent(MainActivity.this, SendMessage.class); 

另外为了将你的消息从这个MainActivity发送到SendMessage类,请看下面的代码

 lv.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { ListEntry entry= (ListEntry) parent.getAdapter().getItem(position); Intent intent = new Intent(MainActivity.this, SendMessage.class); intent.putExtra(EXTRA_MESSAGE, entry.getMessage()); startActivity(intent); } }); 

请让我知道这是否有助于你

编辑: –如果你正在发现一些问题,以获得列表的价值做一件事情declear你的数组列表

 ArrayList<ListEntry> members = new ArrayList<ListEntry>(); 

全局即在创build和更改您的监听器之前

  lv.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { Intent intent = new Intent(MainActivity.this, SendMessage.class); intent.putExtra(EXTRA_MESSAGE, members.get(position)); startActivity(intent); } }); 

所以你的整个代码看起来像

 public class MainActivity extends Activity { public final static String EXTRA_MESSAGE = "com.example.ListViewTest.MESSAGE"; ArrayList<ListEntry> members = new ArrayList<ListEntry>(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); members.add(new ListEntry("BBB","AAA",R.drawable.tab1_hdpi)); members.add(new ListEntry("ccc","ddd",R.drawable.tab2_hdpi)); members.add(new ListEntry("assa","cxv",R.drawable.tab3_hdpi)); members.add(new ListEntry("BcxsadvBB","AcxdxvAA")); members.add(new ListEntry("BcxvadsBB","AcxzvAA")); members.add(new ListEntry("BcxvBB","AcxvAA")); members.add(new ListEntry("BvBB","AcxsvAA")); members.add(new ListEntry("BcxvBB","AcxsvzAA")); members.add(new ListEntry("Bcxadv","AcsxvAA")); members.add(new ListEntry("BcxcxB","AcxsvAA")); ListView lv = (ListView)findViewById(R.id.listView1); Log.i("testTag","before start adapter"); StringArrayAdapter ad = new StringArrayAdapter (members,this); Log.i("testTag","after start adapter"); Log.i("testTag","set adapter"); lv.setAdapter(ad); lv.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { Intent intent = new Intent(MainActivity.this, SendMessage.class); intent.putExtra(EXTRA_MESSAGE, members.get(position).getMessage()); startActivity(intent); } }); } 

其中getMessage()将是您的ListEntry类中指定的getter方法,您正在使用它来获取之前设置的消息。

首先,类必须实现点击监听器:

 implements OnItemClickListener 

然后设置一个监听器到ListView

 yourList.setOnItemclickListener(this); 

最后,创buildclic方法:

 @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { Toast.makeText(MainActivity.this, "You Clicked at ", Toast.LENGTH_SHORT).show(); } 
  //get main activity final Activity main_activity=getActivity(); //list view click listener final ListView listView = (ListView) inflatedView.findViewById(R.id.listView_id); listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { String stringText; //in normal case stringText= ((TextView)view).getText().toString(); //in case if listview has separate item layout TextView textview=(TextView)view.findViewById(R.id.textview_id_of_listview_Item); stringText=textview.getText().toString(); //show selected Toast.makeText(main_activity, stringText, Toast.LENGTH_LONG).show(); } }); //populate listview 

根据我的testing,

  1. 实现OnItemClickListener – >工程。

  2. setOnItemClickListener – >工作。

  3. ListView默认是可点击的(API 19)

重要的是,“点击”仅适用于TextView(如果selectsimple_list_item_1.xml作为项目)。 这意味着,如果您为ListView提供文本数据,则单击文本区域时“单击”将起作用。 点击空白区域不会触发“点击事件”。