Android:使用适配器填充的listview中的按钮上的OnClick侦听器

时间:2016-12-21 10:48:12

标签: android listview

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

ListView中的每一行都是一个水平布局,其中包含TextView小部件和Button小部件。此0中可以有2ListView行。

我希望能够在onClick上使用Button方法,这样我就可以转到onClick点击Button位置的方法列表(即它是在第1行还是第2行?)

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

<?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>

2 个答案:

答案 0 :(得分:1)

不幸的是,如果您需要物品的位置。建议不要将onClick功能放在XML中,而是将Activity声明在您将适配器设置为ListView的{​​{1}}范围内。

一个通用的例子是:

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语句来确定是否您已在Button内选择了onItemClickListener

所以,它看起来像这样:

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);
}

答案 1 :(得分:0)

一个小例子:

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
                }
            }
    });
}
正如其他人所说的那样,它有很多重复的东西。