android 在activity 监听自定义adapter

android 在activity 监听自定义adapter

1概述

在activity中会使用到adapter,adapter一般为自定义一个MyAdapter继承BaseAdapter类,有时使用场景就是在activity中监听adapter中按钮的点击事件,但是在activity中直接获取adapter的控件使用setOnClickListener方法不能生效,在网上找了下没找到解决方式,最后换种方式成功了,在此记录一下。

2.各个文件

tab.xml文件 activity关联的视图xml文件
tab_item.xml文件 adapter关联的视图xml文件
MyActivity文件 activity文件
MyAdapter文件 Adapter文件
首先说一下:按钮的点击事件可以在activity中设置(即MyActivity获取tab的button进行设置),也可以在Adapter中设置(即MyAdapter获取tab_item的button进行设置),在activity中设置的只能设置Adapter组件外的按钮(例如activity获取tab_item的button进行设置会不生效)。
下列将会使用3种方式交互,使用处有注解标示需要可自取使用
1.在adapter中获取activity传递的值并显示
2.在activity获取adapter中选中的值,进行提交
3.在activity中监听adapter中的点击事件,并作出相应的操作

tab.xml文件

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:id="@+id/tab"
    android:layout_height="match_parent"
    tools:ignore="MissingDefaultResource">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <TextView
            android:id="@+id/time"
            android:layout_width="125dp"
            android:layout_height="match_parent"
            android:text="日期"
            android:textSize="22sp" />

        <TextView
            android:id="@+id/name"
            android:layout_width="125dp"
            android:layout_height="match_parent"
            android:text="名称"
            android:textSize="22sp" />

        <TextView
            android:id="@+id/operating"
            android:layout_width="125dp"
            android:layout_height="match_parent"
            android:text="操作"
            android:textSize="22sp" />

    </LinearLayout>

    <Button
        android:id="@+id/submit"
        android:layout_width="80dp"
        android:layout_height="35dp"
        android:layout_weight="1"
        android:text="提交"
        android:layout_alignParentRight="true"
        android:textSize="14sp"/>

    <ListView
        android:id="@+id/tab4_list"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/text"
        android:layout_weight="1"
        android:paddingTop="36dp"></ListView>
</RelativeLayout>

tab_item.xml文件

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

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:ignore="Orientation">

        <TextView
            android:id="@+id/time_item"
            android:layout_width="125dp"
            android:layout_height="match_parent"
            android:text="日期"
            android:textSize="22sp" />

        <TextView
            android:id="@+id/name_item"
            android:layout_width="125dp"
            android:layout_height="match_parent"
            android:text="名称"
            android:textSize="22sp" />

        <TextView
            android:id="@+id/operating_item"
            android:layout_width="125dp"
            android:layout_height="match_parent"
            android:text="操作"
            android:textSize="22sp" />

        <Button
            android:id="@+id/start"
            android:layout_width="52dp"
            android:layout_height="wrap_content"
            android:text="开始"/>

        <CheckBox
            android:id="@+id/option"
            android:layout_width="30dp"
            android:scaleX="3"
            android:scaleY="1.5"
            android:layout_height="23dp"
            android:focusable="false"
            android:visibility="visible"
            android:clickable="true"/>

    </LinearLayout>

</LinearLaxyout>

MyAdapter文件

package com.example.zscj_app_hexin.com.example;
import com.example.zscj_app_hexin.R;


import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.TextView;



import java.text.SimpleDateFormat;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class MyAdapter extends BaseAdapter {

    List<HashMap<String, Object>> listItem ;//用于设置各个列的值
    private Context context;//必传 用于关联tab_item
    private Map<Integer,Boolean> map=new HashMap<>();//创建map 用于存储按钮列是否被点击的布尔值,checkBox用,可无需要可不用
    private Map<Integer,String> map2=new HashMap<>();//创建map列 用于存储点击了的数组,checkBox用,可无需要可不用
    private String id;//返回给activity用,可无需要可不用
    private OnButtonClickListener listener;//设置监听

    //构造方法
    public MyAdapter2(List<HashMap<String, Object>> listItem, Context context, OnButtonClickListener listener) {
        this.listItem = listItem;
        this.context = context;
        this.listener=listener;
    }

    public int getCount() {
        return listItem.size();
    }

    public Object getItem(int i) {
        return listItem.get(i);
    }

    public long getItemId(int i) {
        return i;
    }

    public Map<Integer, String> getMap2() {
        return map2;
    }


    public View getView(final int i, View view, ViewGroup viewGroup) {
        ViewHoder hd = new ViewHoder();
        if (view == null) {
            LayoutInflater layoutInflater = LayoutInflater.from(context);
            view = layoutInflater.inflate(R.layout.tab_item, null);
            hd.name=view.findViewById(R.id.name);//进行关联
            view.setTag(hd);
        }
        final HashMap<String, Object> mlistItem=listItem.get(i);
        hd = (ViewHoder) view.getTag();
        hd.name.setText((String)mlistItem.get("name"));//获取activity传入的值并进行设置  即第一种 在adapter中获取activity传递的值并显示
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        if (mlistItem.get("time") != null){
            hd.time.setText(sdf.format(mlistItem.get("time")));//由于传过来的 mlistItem.get("time") 是日期格式所以转为string
        }else {
            hd.time.setText("");
        }
        final ViewHoder finalHd = hd;
        hd.start.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                AlertDialog.Builder builder = new AlertDialog.Builder(context);
                builder.setTitle("确定要开始吗?").
                        setNegativeButton("取消", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialogInterface, int i) {
                        id=null;
                        dialogInterface.dismiss();
                    }
                });
                builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialogInterface, int i) {
                        id=(String) mlistItem.get("id");
                        listener.onButtonClick(finalHd.start,id);
                    }
                });
                builder.show();
            }
        });

        hd.checkBox.setChecked((Boolean) mlistItem.get("checkBox"));
        final CheckBox checkBox=view.findViewById(R.id.option);
        checkBox.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                if (checkBox.isChecked()){
                    map.put(i,true);
                    map2.put(i,String.valueOf(mlistItem.get("id")));
                }else {
                    map.remove(i);
                    map2.remove(i);
                }
            }
        });
        if(map!=null&&map.containsKey(i)){
            checkBox.setChecked(true);
        }else {
            checkBox.setChecked(false);
        }
        return view;
    }


    class ViewHoder{
        TextView time;
        TextView name;
        CheckBox checkBox;
        Button start;
    }

    public interface OnButtonClickListener{
        void onButtonClick(View view, String id);
    }
}

MyActivity文件(部分)

android 在activity 监听自定义adapter

3.结尾

个人使用安卓不多,有错误欢迎指正,会更正在文中,本次梳理总结是从原有项目中摘抄所需部分出来,MyActivity文件太多只摘取使用部分,可能会有所遗漏,有需要可私信。

上一篇:设计模式 结构型模式 -- 适配器模式(概述、类适配器模式、对象适配器模式、适配器模式适用场景)


下一篇:C#获取 mac