如何在android中的Listview中处理click事件?

use*_*104 43 android listview android-intent onitemclicklistener onitemclick

下面是我的测试代码,用于创建列表视图,列表视图显示成功,但是,点击事件中存在错误.我想创建一个向新活动发送硬编码消息的意图.但是,它显示该行的错误

Intent intent = new Intent(context, SendMessage.class);
Run Code Online (Sandbox Code Playgroud)

所以问题是,我应该为这门课提供什么?

另外,输出消息代替硬编码,如何捕获列表视图行中的数据并传递给新活动?例如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);
            }
        });
    }
Run Code Online (Sandbox Code Playgroud)

Bla*_*elt 100

我看不出你在哪里宣布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);
            }
        });
Run Code Online (Sandbox Code Playgroud)

要在单击后检索对象,可以使用AdapterView:

ListEntry entry = (ListEntry) parent.getItemAtPosition(position);
Run Code Online (Sandbox Code Playgroud)

  • 来自文档`这是一个抽象类,其实现由Android系统提供.它允许访问特定于应用程序的资源和类,以及对应用程序级操作的上调,例如启动活动,广播和接收意图.它具有android启动SendMessage活动所需的信息 (2认同)

Kap*_*ats 13

ListView具有Item单击侦听器回调.你应该设置onItemClickListenerListView.回调包含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);
            }
        });
Run Code Online (Sandbox Code Playgroud)


Abh*_*rya 6

正如您所说,您在此语句中的代码中会出现错误

Intent intent = new Intent(context, SendMessage.class);
Run Code Online (Sandbox Code Playgroud)

这是因为您将OnItemClickListener匿名类的上下文提供到Intent构造函数中,但是根据Intent的构造函数

android.content.Intent.Intent(Context packageContext, Class<?> cls)
Run Code Online (Sandbox Code Playgroud)

您必须提供您使用intent的活动的上下文,即MainActivity类上下文.所以你的错误陈述将被转换为

Intent intent = new Intent(MainActivity.this, SendMessage.class);
Run Code Online (Sandbox Code Playgroud)

另外,要将此消息从此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);
            }
        });
Run Code Online (Sandbox Code Playgroud)

如果这有助于您,请告诉我

编辑: - 如果你发现一些问题,以获得列表的值做一件事清除你的数组列表

ArrayList<ListEntry> members = new ArrayList<ListEntry>();
Run Code Online (Sandbox Code Playgroud)

全局,即在创建和更改您的监听器之前,如下所示

 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);
                }
            });
Run Code Online (Sandbox Code Playgroud)

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

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);
                    }
                });
    }
Run Code Online (Sandbox Code Playgroud)

其中getMessage()将是您在ListEntry类中指定的getter方法,用于获取先前设置的消息.


小智 6

首先,该类必须实现click listenener:

implements OnItemClickListener
Run Code Online (Sandbox Code Playgroud)

然后将侦听器设置为ListView

yourList.setOnItemclickListener(this);
Run Code Online (Sandbox Code Playgroud)

最后,创建clic方法:

@Override
public void onItemClick(AdapterView<?> parent, View view, int position,
long id) {
Toast.makeText(MainActivity.this, "You Clicked at ",   
 Toast.LENGTH_SHORT).show();
}
Run Code Online (Sandbox Code Playgroud)