如何在列表视图中使项目可点击?

8

我一直在尝试寻找解决方案,但是几乎没有什么进展。

我需要显示一个弹出窗口,其中包含一系列项目。

我已经成功显示了窗口,但是onitemclicklistener在点击列表视图中的项目时未被调用。希望有人能够帮助解决这个问题。

谢谢。

编辑1:

public class PopUpWindowActivity extends Activity {

    /** Called when the activity is first created. */
    String[] countries = new String[] {
        "India", "USA", "Canada"
    };

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        LinearLayout ll = new LinearLayout(this);
        ListView lv = new ListView(this);
        lv.setAdapter(new ArrayAdapter < String > (this, android.R.layout.simple_list_item_1, countries));
        lv.setOnItemClickListener(new OnItemClickListener() {

                public void onItemClick(AdapterView <? > arg0, View arg1, int arg2,
                    long arg3) {
                    Log.v("clicked", (String)((TextView) arg1).getText());
                }

            });
        ll.addView(lv);
        setContentView(ll);
    }
}

在上述代码中,我尝试创建一个布局,在其中添加了一个列表视图。这使得列表视图不再可点击。我必须这样做是因为,我正在尝试实现一个弹出窗口,在其中应该有多个项目以及一个列表视图。


1
默认情况下,ListView 是可点击的。 - Android Killer
4个回答

14

列表和列表项是否可以被点击?无论是通过程序还是...

ListView myList = (ListView) findViewById(R.id.list_view_id);
myList.setClickable(true);

或者在 XML 中...

   <ListView xmlns:android="http://schemas.android.com/apk/res/android"
       android:clickable="true">
   ...
   </ListView>
我猜你已经这样做了,但有时候我们会错过显而易见的事情 :) 编辑:Android教程中,这是如何以编程方式设置onItemClickListener。
 ListView lv = getListView();
 lv.setOnItemClickListener(new OnItemClickListener() {

   public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
       // When clicked perform some action...
   }
 });

编辑2:

这是我的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="fill_parent"
    android:orientation="vertical" >

    <ListView xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:id="@+id/list" />

</LinearLayout>

这是我的代码:

 public class HelloAndroidActivity extends Activity {

     /** Called when the activity is first created. */
     @Override
     public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.main);
         String[] countries = getResources().getStringArray(R.array.countries_array);

         ListView lv = (ListView) findViewById(R.id.list);
         lv.setAdapter(new ArrayAdapter < String > (this, R.layout.list_item, countries));
         lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                 public void onItemClick(AdapterView <? > arg0, View view, int position, long id) {
                     // When clicked, show a toast with the TextView text
                     Toast.makeText(getApplicationContext(), ((TextView) view).getText(),
                         Toast.LENGTH_SHORT).show();

                 }

             });
     }
 }

列表中的项目是字符串,是否可以设置这些项目可点击。如果我漏掉了什么,请见谅。我是Android的初学者。 - user1253887
如果你还没有看过的话,这里有一个Android教程。你可以使用setOnItemClickListener来实现你想要的行为,我相信这会对你有帮助。 - Mike Welsh
你是正确的,但这只适用于显示仅包含listview的情况。尝试创建一个linearlayout并将listview添加到该linearlayout中。然后onitem click listener就不起作用了。 - user1253887
我创建了一个LinearLayout并将ListView放在其中。使用onItemClickListener时没有任何问题。我已经添加了EDIT 2以显示我的确切内容。 - Mike Welsh
感谢您的回复。我已经添加了我一直在尝试的代码。我还没有尝试以XML方式实现GUI,但如果我以编程方式实现它,它就无法工作。 - user1253887
在xml文件中,listview的高度和宽度被设置为占据整个屏幕。如果我们使用wrap_content来容纳其他视图,而不是使用fill_parent,那么onclicklistener将无法工作。我猜这与焦点有关。我会看看是否能找到解决这个问题的方法。 - user1253887

2
ListView myList;
myList = (ListView)findViewById(list_vew_id_in_xml)
myList.setOnItemClickListener(new OnItemClickListener()
{
@Override
public void onItemClick(AdapterView<?> parent, View  view, int position, long id) 
        {
      //Toast.makeText(BritishCouncilActivity.this, "" + position, 2).show();
         }
 });

1

编辑后的答案

请应用此示例,它适用于您,我已经测试过这段代码

//ListviewActivity.java

 package com.anl.lk;

 public class ListviewActivity extends ListActivity { 

     static final String[] COUNTRIES = new String[] {

         "Afghanistan", "Albania", "Algeria", "American Samoa",
             "Andorra", "Angola", "Anguilla", "Antarctica",
             "Antigua and Barbuda", "Argentina", "Armenia", "Aruba",
             "Australia", "Austria", "Azerbaijan", "Bahrain",
             "Bangladesh", "Barbados", "Belarus", "Belgium", "Belize",
             "Benin", "Bermuda", "Bhutan", "Bolivia",
             "Bosnia and Herzegovina", "Botswana", "Bouvet Island",
             "Brazil", "British Indian Ocean Territory"
     };

     /** Called when the activity is first created. */
     @Override
     public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         setListAdapter(new ArrayAdapter < String > (this,
                 android.R.layout.simple_list_item_1, COUNTRIES));
         getListView().setTextFilterEnabled(true);
     }

     @Override
     protected void onListItemClick(ListView l, View v, int position, long id) {
         // TODO Auto-generated method stub
         super.onListItemClick(l, v, position, id);

         new AlertDialog.Builder(this)
             .setTitle("Hello")
             .setMessage("from " + getListView().getItemAtPosition(position))
             .setPositiveButton("OK",
             new DialogInterface.OnClickListener() {
                 public void onClick(DialogInterface dialog, int which) {}
             })
             .show();

         Toast.makeText(ListviewActivity.this,
             "ListView: " + l.toString() + "\n" +
             "View: " + v.toString() + "\n" +
             "position: " + String.valueOf(position) + "\n" +
             "id: " + String.valueOf(id),
             Toast.LENGTH_LONG).show();
     }

 }

//第一页

package com.anl.lk;

public class FirstPage extends Activity {

    @override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        Button b = (Button) findViewById(R.id.button1);
        b.setOnClickListener(new OnClickListener() {

                public void onClick(View v) {
                    // TODO Auto-generated method stub
                    Intent sam = new Intent(FirstPage.this, ListviewActivity.class);
                    startActivity(sam);

                }
            });
    }
}

//清单文件

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.anl.lk"
android:versionCode="1"
android:versionName="1.0" >

<uses-sdk android:minSdkVersion="8" />

<application
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name" >
    <activity
        android:label="@string/app_name"
        android:name=".FirstPage" >
        <intent-filter >
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <activity android:name=".ListviewActivity"    android:theme="@android:style/Theme.Dialog"></activity>
</application>

请使用这段代码,它包含了您的解决方案。

我是指要在Activity中显示弹出窗口,我们应该在相应的Activity的清单文件中使用android:theme="@android:style/Theme.Dialog",这样它就可以加载任何Activity,甚至是在弹出窗口上的listview。 - Ramz
只有当我们扩展ListActivity类时,才能覆盖OnListItemClick。但是我想在弹出窗口中显示列表。 - user1253887
请使用此已更新和测试过的代码(可运行的代码)。 - Ramz
是的,我能够得到解决方案。 - user1253887
给这个点了踩。没有对代码进行解释。非常不建设性。 - Namphibian

1

在任何ListView项中插入此属性

android:onClick="buttonClicked"

然后在你的代码中

public void buttonClicked(View view)
{
    //Do what you want to do..
}

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