android ListView和带下拉列表的BaseExpandableListAdapter

197 阅读2分钟
1.  核心代码
//获取一个自定义的带下拉列表的适配器,构造方法传参自己定义,参数不固定
        searchAdapter = new EnterpriseExpandableListAdapter(searchEnterpriseList,MainActivity.this,showMeasureItem);
        //给控件放入指定的适配器
        search_list_view.setAdapter(searchAdapter);
        //隐藏箭头图标
        search_list_view.setGroupIndicator(null);
        //测量项列表的单击事件
        search_list_view.setOnChildClickListener(new ExpandableListView.OnChildClickListener() {
            @Override
            public boolean onChildClick(ExpandableListView parent, View v, int groupPosition, int childPosition, long id) {
                //单机产生要执行的代码
                return true;
            }
        });
2.  列表布局文件
<!-- 用于下拉刷新 -->
<android.support.v4.widget.SwipeRefreshLayout
            android:id="@+id/main_srl"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content">
            <!-- 主listView -->
            <ExpandableListView
                android:id="@+id/enterprise_list"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:childDivider="#e4e4e4"
                />
</android.support.v4.widget.SwipeRefreshLayout>
3.  列表填充布局文件
    <?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="horizontal"
        android:padding="5dp"
        android:background="#6BBA79">
        <!-- 点击展开的每一行的界面布局,例如qq的分组点开之后的每一个好友的行显示 -->
    </LinearLayout>
4. 重写适配器
/**
 * Created by hanzh on 2017/12/5.
 */

public class EnterpriseExpandableListAdapter extends BaseExpandableListAdapter {
    private ArrayList<String> gData = new ArrayList ();
    private ArrayList<ArrayList<String>> iData = new ArrayList<ArrayList<String>> ();
    private Context mContext;
    private Handler handler;
    private Map<String,String> showMeasureItem;

    @SuppressLint("HandlerLeak")
    public EnterpriseExpandableListAdapter(ArrayList<T> data, Context mContext,Map<String,String> showMeasureItem) {
        this.mContext = mContext;
        this.showMeasureItem=showMeasureItem;
        format(data);
        handler = new Handler(){
            @Override
            public void handleMessage(Message msg) {
                notifyDataSetChanged();
                super.handleMessage(msg);
            }
        };
    }
    //对外暴露的方法,用于更新数据
    public void refresh(ArrayList aData , ArrayList<ArrayList<String>> iData){
        //传入新的数列表,清空原数据渲染页面,如果数据没变则不更新,数据变了则在底部加载
        gData.clear();
        iData.clear();
        this.gData = gData;
        this.iData = iData;
        handler.sendMessage(new Message());
    }
    //返还有多少分组
    @Override
    public int getGroupCount() {
        return gData.size();
    }
    //返还指定的组有多少行显示
    @Override
    public int getChildrenCount(int groupPosition) {
        return iData.get(groupPosition).size();
    }
    //返还指定组页面布局中的数据(不是组内的所有行的所有组数据)
    @Override
    public String getGroup(int groupPosition) {
        return gData.get(groupPosition);
    }
    //返还指定组页面布局中指定行的数据
    @Override
    public Measure getChild(int groupPosition, int childPosition) {
        return iData.get(groupPosition).get(childPosition);
    }
    //获取指定组的排序id
    @Override
    public long getGroupId(int groupPosition) {
        return groupPosition;
    }

    @Override
    public boolean hasStableIds() {
        return false;
    }

    //取得显示给定分组给定子位置的数据用的视图
    @Override
    public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {
        ViewHolderItem itemHolder;
        if(convertView == null){
            convertView = LayoutInflater.from(mContext).inflate(
                    R.layout.item_exlist_item, parent, false);
            itemHolder = new ViewHolderItem();
            itemHolder.img_icon = (ImageView) convertView.findViewById(R.id.img_icon);
            itemHolder.tv_name = (TextView) convertView.findViewById(R.id.tv_name);
            convertView.setTag(itemHolder);
        }else{
            itemHolder = (ViewHolderItem) convertView.getTag();
        }
        itemHolder.img_icon.setImageResource(iData.get(groupPosition).get(childPosition).getiId());
        itemHolder.tv_name.setText(iData.get(groupPosition).get(childPosition).getiName());
        return convertView;
    }

    //设置子列表是否可选中
    @Override
    public boolean isChildSelectable(int groupPosition, int childPosition) {
        return true;
    }


    private static class ViewHolderGroup{
        private TextView tv_group_name;
    }

    private static class ViewHolderItem{
        private ImageView img_icon;
        private TextView tv_name;
    }

}

    //组织下拉子菜单的数据,并显示
    @Override
    public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {
        ViewHolderItem itemHolder;
        if(convertView == null){
            convertView = LayoutInflater.from(mContext).inflate(
                    R.layout.check_data_show, parent, false);
            itemHolder = new ViewHolderItem();
            itemHolder.tv_name = (TextView) convertView.findViewById(R.id.name);
            itemHolder.tv_time = (TextView) convertView.findViewById(R.id.time);
            itemHolder.tv_data = (TextView) convertView.findViewById(R.id.data);
            convertView.setTag(itemHolder);
        }else{
            itemHolder = (ViewHolderItem) convertView.getTag();
        }
        /*设置下拉菜单的值
       <!--这里执行自己的代码逻辑-->
        return convertView;
    }

    //设置子列表是否可选中
    @Override
    public boolean isChildSelectable(int groupPosition, int childPosition) {
        return true;
    }


    private static class ViewHolderGroup{
        private TextView enterpriseName;
        private ImageView warningImg;
    }

    private static class ViewHolderItem{
        private TextView tv_time;
        private TextView tv_data;
        private TextView tv_name;
    }

    public ArrayList<ArrayList<Measure>> getiData() {
        return iData;
    }
}

//我选择的方式是一个组列表,代表着一个个的组信息,然后通过下标组下标和子列表List对应
组列表是list ,子列表是list这种方式加载界面,如果有更好的方式不必拘泥细节,完成就好