35

以下是我的测试代码创建列表视图,列表视图显示成功,但是,点击事件中有错误。我想创建一个发送硬编码消息到新活动的意图。然而,它显示错误的线如何在Android的Listview中处理点击事件?

Intent intent = new Intent(context, SendMessage.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); 
      } 
     }); 
    } 

回答

77

我看不到你在哪里声明context。在意向创作的目的,你可以使用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); 
+0

谢谢,无论如何,背景是什么意思? – user782104

+1

你能改说吗? – Blackbelt

+0

这意味着,Intent类中的第一个参数实际表示什么? MainActivity.this是什么意思?感谢文档 – user782104

12

ListView中有项目点击侦听器回调。您应该在ListView中设置onItemClickListener。回叫包含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); 
      } 
     }); 
+1

谢谢。如果入口对象有3个项目?两个字符串和一个整数(存储的照片),如何将其暴露并传递给新活动(是否有必要)? – user782104

+0

您可以在ListEntry中实现Parceble或Serializable,并可以将整个对象传递给您的新活动。 –

6

错误是在你的代码如你所说

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

这是因为你是根据意向

的构造提供OnItemClickListener匿名类的情况下进入意向构造函数,但未来从这句话
android.content.Intent.Intent(Context packageContext, Class<?> cls) 

您必须提供您正在使用意图的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>(); 

全局即之前的OnCreate,改变你的听众如下

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方法,它使用的是得到消息这是之前设置的。

+0

对于ListEntry类型,getMessage()方法未定义? – user782104

+0

它在entry.getMessage()有错误,对不起忘了提 – user782104

+1

@ user782104请检查我编辑的代码 –

4

首先,类必须实现点击listenener:

implements OnItemClickListener 

然后设置一个监听到ListView

yourList.setOnItemclickListener(this); 

最后,创建CLIC方法:

@Override 
public void onItemClick(AdapterView<?> parent, View view, int position, 
long id) { 
Toast.makeText(MainActivity.this, "You Clicked at ", 
Toast.LENGTH_SHORT).show(); 
} 
2
//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 
2

根据我的测试,

  1. implements OnItemClickListener - > works。

  2. setOnItemClickListener - > works。

  3. ListView控件默认情况下点击(API 19)

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

相关问题