安卓 ExpandableList应用(QQ联系人列表界面) (几种图片循环滚动)(36)

安卓官方给我们提供了一个制作列表的功能(类似于qq联系人中的,点击一个会弹出列表),使用控件ExpandableList,下面是具体使用:

首先,ExpandableList需要两个部分,Group以及Item,就是需要自己设定分组中的界面样式以及数据格式,同时之后需要设定每个联系人中的界面样式和数据格式。

每个分组的样式的布局文件如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:padding="5dp">

    <TextView
        android:id="@+id/expand_group_name"
        android:layout_width="match_parent"
        android:layout_height="56dp"
        android:gravity="center_vertical"
        android:paddingLeft="30dp"
        android:text="AP"
        android:textStyle="bold"
        android:textSize="20sp"/>

</LinearLayout>

每个分组中的元素的布局文件如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:padding="5dp"
    android:background="#6BBA79">

    <ImageView
        android:id="@+id/expand_img_icon"
        android:layout_width="48dp"
        android:layout_height="48dp"
        android:src="@drawable/bottom_1"
        android:focusable="false"/>

    <TextView
        android:id="@+id/expand_item_name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginLeft="15dp"
        android:layout_marginTop="15dp"
        android:focusable="false"
        android:text="timo"
        android:textSize="18sp"/>

</LinearLayout>

在Activity中加入Expandable的布局如下:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:padding="5dp" >

    <!--android:childDivider="#E02D2F" 设置每个子list的分割线颜色-->
    <ExpandableListView
        android:id="@+id/expand_list_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:childDivider="#E02D2F"/>

</RelativeLayout>

我们需要设计两个实体,来作为Group和Item的数据格式:

public class ExpandableGroup {
    private String gName;

    public ExpandableGroup(){

    }

    public ExpandableGroup(String gName){
        this.gName = gName;
    }

    public String getgName(){
        return gName;
    }

    public void setgName(String gName){
        this.gName = gName;
    }
}
public class ExpandableItem {

    private int iId;
    private String iName;

    public ExpandableItem(int iId, String iName){
        this.iId = iId;
        this.iName = iName;
    }

    public int getiId(){
        return iId;
    }

    public String getiName(){
        return iName;
    }

    public void setiId(int iId){
        this.iId = iId;
    }

    public void setiName(String iName){
        this.iName = iName;
    }

}

接着对于我们需要对数据进行设计一个适配器进行实现逻辑:

public class MyBaseExpandableListAdapter extends BaseExpandableListAdapter {

    private ArrayList<ExpandableGroup> gData;
    private ArrayList<ArrayList<ExpandableItem>> iData;
    private Context mContext;

    //给ExpandableList创建一个适配器,重写一个构造方法
    public MyBaseExpandableListAdapter(ArrayList<ExpandableGroup> gData, ArrayList<ArrayList<ExpandableItem>> iData, Context mContext){
        this.gData = gData;
        this.iData = iData;
        this.mContext = mContext;
    }

    //获取组的数量
    @Override
    public int getGroupCount() {
        return gData.size();
    }

    //获取某个位置的组中的单元数量
    @Override
    public int getChildrenCount(int groupPosition) {
        return iData.get(groupPosition).size();
    }

    //通过位置来获取组对象
    @Override
    public Object getGroup(int groupPosition) {
        return gData.get(groupPosition);
    }

    //通过组位置以及在组中单元位置获取单元对象
    @Override
    public Object getChild(int groupPosition, int childPosition) {
        return iData.get(groupPosition).get(childPosition);
    }

    //通过位置获取组id
    @Override
    public long getGroupId(int groupPosition) {
        return groupPosition;
    }

    //通过组位置以及在组中单元位置获取单元id
    @Override
    public long getChildId(int groupPosition, int childPosition) {
        return childPosition;
    }

    // 如果hasStableIds返回false的话 每次调用notifyDataSetChanged方法时 adapter就会判断getItemId
    // 并且在只调用那些Item发生变化的getView方法
    // 说白了就是通过getItemId来判断那些需要getView从而达到局部刷新的效果,在getView比较耗时的情况下起到优化的效果。
    @Override
    public boolean hasStableIds() {
        return false;
    }

    //获取组的视图
    @Override
    public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {

        ViewHolderGroup groupHolder;
        if(convertView == null){
            //导入组的布局
            convertView = LayoutInflater.from(mContext).inflate(R.layout.expandable_group, parent, false);
            //这里是组的Holder (下面定义了)
            groupHolder = new ViewHolderGroup();
            //绑定Holder中各元素
            groupHolder.tv_group_name = convertView.findViewById(R.id.expand_group_name);
            //设置holder
            convertView.setTag(groupHolder);
        }else {
            groupHolder = (ViewHolderGroup) convertView.getTag();
        }
        //设置输出
        groupHolder.tv_group_name.setText(gData.get(groupPosition).getgName());
        return convertView;
    }

    //设置组中元素的视图
    @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.expandable_list_item, parent, false);
            itemHolder = new ViewHolderItem();
            itemHolder.img_icon = convertView.findViewById(R.id.expand_img_icon);
            itemHolder.tv_name = convertView.findViewById(R.id.expand_item_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;
    }
}

然后在Activity中实现:

public class ExpandableListViewActivity extends AppCompatActivity {

    private ArrayList<ExpandableGroup> gData = null;
    private ArrayList<ArrayList<ExpandableItem>> iData = null;
    private ArrayList<ExpandableItem> lData = null;
    private Context mContext;
    private ExpandableListView expandableListView;
    private MyBaseExpandableListAdapter myAdapter = null;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.expandablelist_layout);
        mContext = ExpandableListViewActivity.this;
        expandableListView = findViewById(R.id.expand_list_view);

        //初始化数据
        initData();

        //新建一个expandableList的Adapter
        myAdapter = new MyBaseExpandableListAdapter(gData, iData, mContext);
        expandableListView.setAdapter(myAdapter);

        expandableListView.setOnChildClickListener(new ExpandableListView.OnChildClickListener() {
            @Override
            public boolean onChildClick(ExpandableListView parent, View v, int groupPosition, int childPosition, long id) {
                Toast.makeText(mContext, "you click:" + iData.get(groupPosition).get(childPosition).getiName(),
                        Toast.LENGTH_SHORT).show();
                return true;
            }
        });
    }

    private void initData() {
        gData = new ArrayList<ExpandableGroup>();
        iData = new ArrayList<ArrayList<ExpandableItem>>();
        gData.add(new ExpandableGroup("AD"));
        gData.add(new ExpandableGroup("AP"));
        gData.add(new ExpandableGroup("TANK"));

        lData = new ArrayList<ExpandableItem>();

        lData.add(new ExpandableItem(R.drawable.bottom_1, "VN"));
        lData.add(new ExpandableItem(R.drawable.bottom_2, "VLS"));
        lData.add(new ExpandableItem(R.drawable.bottom_3, "KS"));
        lData.add(new ExpandableItem(R.drawable.bottom_1, "LS"));
        iData.add(lData);

        lData = new ArrayList<ExpandableItem>();
        lData.add(new ExpandableItem(R.drawable.bottom_1, "AN"));
        lData.add(new ExpandableItem(R.drawable.bottom_2, "TS"));
        lData.add(new ExpandableItem(R.drawable.bottom_3, "ZLS"));
        lData.add(new ExpandableItem(R.drawable.bottom_1, "HL"));
        iData.add(lData);

        lData = new ArrayList<ExpandableItem>();
        lData.add(new ExpandableItem(R.drawable.bottom_1, "SE"));
        lData.add(new ExpandableItem(R.drawable.bottom_2, "JT"));
        lData.add(new ExpandableItem(R.drawable.bottom_3, "LV"));
        lData.add(new ExpandableItem(R.drawable.bottom_1, "GX"));
        iData.add(lData);
    }
}


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值