【问题标题】:Android: OnClick listener on a button in a listview populated with an adapterAndroid:在填充有适配器的列表视图中的按钮上的 OnClick 侦听器
【发布时间】:2026-01-06 07:15:01
【问题描述】:

所以我有一个ListView,它通过自定义适配器从对象的ArrayList<> 填充。

ListView 中的每一行都是一个水平布局,其中包含一个TextView 小部件和一个按钮小部件。在这个ListView 中可以有02 之间的行。

我希望能够在Button 上有一个onClick 方法,它允许我将Button 在列表中单击的位置传递给onClick 中的方法(即它在第一排还是第二排?)

这是带有ListView 的页面的XML(此处列出的按钮与此问题无关)

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:orientation="vertical"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
>

<TextView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:paddingBottom="20dp"
    android:text="Saved Offer Leaflets"
    android:textStyle="bold"
    android:textSize="30dp"/>

<ListView
    android:id="@+id/listViewPdfs"
    android:layout_width="match_parent"
    android:layout_height="100dp" />

<Button
    android:layout_height="100dp"
    android:layout_width="match_parent"
    android:text="Check for latest offers"
    android:textSize="20dp"
    android:id="@+id/buttonCheckLatestOffers"
    />

这是我的适配器列表项

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal">
<TextView
    android:id="@+id/date"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:paddingBottom="20dp"
    android:textSize="20dp"
    android:text="date" />

<Button
    android:layout_height="match_parent"
    android:id="@+id/buttonOpenPdf"
    android:layout_width="wrap_content"
    android:text="Open"
     />
  </LinearLayout>
  </LinearLayout>

【问题讨论】:

  • 你还没有真正问过问题——你能更新你的问题吗?另外,添加您的 java 代码。我不确定你是怎么做的,但是如果你还没有查过,viewholder 模式可能对你有用
  • 这个问题的重复次数太多了,我花了更多时间选择其中一个而不是阅读帖子..

标签: android listview


【解决方案1】:

很遗憾,如果您需要某个项目的位置。不建议将onClick 功能放在XML 中,而是在将适配器设置为ListViewActivity 中声明它。

一个通用的例子是:

listview.setOnItemClickListener(new OnItemClickListener(){   
    @Override
    public void onItemClick(AdapterView<?>adapter,View v, int position){
        ItemClicked item = adapter.getItemAtPosition(position);
        //Logic for click of ItemView
    }
});

因此,对于像您这样的情况,您需要确定单击实例是否位于按钮顶部,因此要应用正确的逻辑,您需要使用 Switch 语句来确定您的 @在onItemClickListener 中选择了987654327@。

所以,它看起来像这样:

listview.setOnItemClickListener(new OnItemClickListener(){   
        @Override
        public void onItemClick(AdapterView<?>adapter,View v, int position){
            ItemClicked item = adapter.getItemAtPosition(position);
            switch (v.getId()) {
            case R.id.buttonid: 
             //button click logic here
                 break;

             }
    });

注意:确保您的适配器中的getItem 函数能够正常工作。

public ItemClicked getItem(int position){
    return arraylist.get(position);
}

【讨论】:

    【解决方案2】:

    一个小例子:

    int selectedItemPos = -1;
    
    public void initUI(){
        ListView myListView = (ListView)findViewById(R.id.listViewPdfs);
        myListView.setAdapter(/*provide the data to the adapter*/);
        myListView.setOnItemClickListener(new OnItemClickListener() {
                @Override
                public void onItemClick(AdapterView<?> adpterView, View view, 
                                    int position, long id) {
                        selectedItemPos = position;
                }
        });
    
        [...]
        myButton.setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View v) {
                    if (selectedItemPos != -1){
                        //selectedItemPos = 0 means first row of listview 
                        //has been selected and so on, do what you want with it
                    }
                }
        });
    }
    

    顺便说一句,正如其他人所说,那里有很多重复项。

    【讨论】:

      最近更新 更多