使用ArrayAdapter为ListView设置OnItemClickListener

29

我想为使用ArrayAdapter创建的ListView添加OnItemClickListener。

这是我用来创建它的代码:

List<Comment> values = datasource.some_search("Wednesday","11");
        ArrayAdapter<Comment> adapter = new ArrayAdapter<Comment>(this,
                android.R.layout.simple_list_item_1, values);
        setListAdapter(adapter);

我该如何实现onItemClickListener?

谢谢!

编辑:我在ArrayAdapter和ListView中使用了一个对象的字符串。

编辑2:更多代码:

public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);



        datasource = new CommentsDataSource(this);
        datasource.open();
        //check if database is populated if NOT, populate with txtToDb();

        if (!datasource.isPopulated()) {
            // Database is not populated so copy it from assets here
            try {
                txtToDb();
                Log.i("Database", "Was not Populated");
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
                Log.i("Database", "Was not populated: txtToDb(); failed");

            }

        } else {
            Log.i("Database", "Populated");
        }

        //wat to show on screen:
        List<Comment> values = datasource.search("Wednesday","11");


        // Use the SimpleCursorAdapter to show the
        // elements in a ListView
        ArrayAdapter<Comment> adapter = new ArrayAdapter<Comment>(this,
                android.R.layout.simple_list_item_1, values);
        setListAdapter(adapter);

    }

编辑3:XML:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <LinearLayout
        android:id="@+id/group"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" >

        <Button
            android:id="@+id/add"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Add New" 
            android:onClick="onClick"/>

        <Button
            android:id="@+id/delete"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Delete First" 
            android:onClick="onClick"/>

    </LinearLayout>

    <ListView
        android:id="@android:id/list"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@string/hello" />

</LinearLayout> 

你可以调用 setOnItemClickListener 方法来实现这个功能。 - Piyush
@piyush- 你能告诉我怎么做吗?我该如何创建将其与上面给出的ArrayAdapter链接的方法? - Ahmed Zafar
4个回答

69

使用 OnItemClickListener

   ListView lv = getListView();
   lv.setOnItemClickListener(new OnItemClickListener()
   {
      @Override
      public void onItemClick(AdapterView<?> adapter, View v, int position,
            long arg3) 
      {
            String value = (String)adapter.getItemAtPosition(position); 
            // assuming string and if you want to get the value on click of list item
            // do what you intend to do on click of listview row
      }
   });

当您单击一行时,将触发一个侦听器。因此,您需要在ListView上使用setOnClickListener并使用匿名内部类OnItemClickListener

您还需要覆盖onItemClick。第一个参数是适配器,第二个参数是视图,第三个参数是位置(listview项的索引)。

使用位置可以获取该项。

编辑:根据您的评论,我假设您需要设置ListView的适配器。

因此,假设您的活动扩展了ListActivtiy

     setListAdapter(adapter); 

或者,如果您的活动类扩展自Activity

     ListView lv = (ListView) findViewById(R.id.listview1);
     //initialize adapter 
     lv.setAdapter(adapter); 

@AhmedZafar,你可以按照你的意图去做,而不是在单击行时获取该项。 - Raghunandan
1
@AhmedZafar,不需要链接任何东西。请展示更多的代码,您的活动代码。 - Raghunandan
“ListView lv = getListView();” 这句代码会自动链接到该活动中的 ListView 吗? - Ahmed Zafar
哇,好的这个可以工作,但是在 String value = (String)adapter.getItemAtPosition(position); 这一行会崩溃,所以我注释掉了它并放置了 Log.i("Database", "ITEM CLICKED"); 然后它似乎可以工作,但问题是,我如何从点击中检索数据。它里面存储了一个数字,我想要调用它。所以问题是,我想要自定义这个而不是每个项目都发生同样的事情。谢谢。 - Ahmed Zafar
@AhmedZafar请展示你所说的数字字符串,并发布更新的logcat,无需自定义或其他任何内容。 - Raghunandan
显示剩余6条评论

7
您可以使用这种方法...
listView.setOnItemClickListener(new OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> parent, View view,
                final int position, long id) {

          String main = listView.getSelectedItem().toString();
        }
    });

1
我不明白这个方法如何知道它与上面的ArrayAdapter相关联? - Ahmed Zafar
你的意思是想从适配器中获取值吗? - Piyush
我有一个显示在ArrayAdapter中的列表。当我点击列表中的某个项目时,我想让它执行某些操作。具体来说,我想拨打一个电话号码。我该如何使用这个方法来实现呢?listView不是我在代码中指定的东西,你能否告诉我更多关于这个函数的工作原理以及我将如何使用它。我感到困惑。 - Ahmed Zafar
如果你要为不同的项目调用不同的东西,则还可以使用switch case。 - Piyush
非常感谢您的回复,但我仍然感到困惑。抱歉。我已经声明了一个数组适配器,而不是listView。在使用您的方法之前,我需要做些什么来将数组适配器链接到您展示的“listView”吗? - Ahmed Zafar
显示剩余3条评论

2

好的,既然你的Activity扩展了ListActivity,这里有一种实现OnItemClickListener的方法:

public class newListView extends ListView {

    public newListView(Context context) {
        super(context);
    }

    @Override
    public void setOnItemClickListener(
            android.widget.AdapterView.OnItemClickListener listener) {
        super.setOnItemClickListener(listener);
        //do something when item is clicked

    }

}

你的Activity是否继承自ListActivity? - Hsnbrg
是的,它可以!那么我接下来该去哪里? - Ahmed Zafar
我使用setListAdapter而不是list.setAdapter(-)。我应该同时使用两者吗? - Ahmed Zafar
@toddx- 非常感谢。我需要为此创建一个新类吗?如果我这样做,我仍然不明白这个类如何与我的原始列表视图链接?请澄清一下。感谢您的所有帮助。 - Ahmed Zafar

1
我正在使用ArrayAdapter,使用以下代码可以获取项目:

String value = (String)adapter.getItemAtPosition(position);

listView.setOnItemClickListener(new OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> parent, View view,
                int position, long id) {
             String string=adapter.getItem(position);
             Log.d("**********", string);

        }
    });

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接