用ExpandableListView实现类似QQ好友列表

网友投稿 556 2022-11-07

用ExpandableListView实现类似QQ好友列表

用ExpandableListView实现类似QQ好友列表

ExpandableListView是一个用来显示二级节点的listview。

qq好友列表中子列表上下移动时,父节点在顶端会始终显示,这里我们可以自定义一个view来充当这个父节点。

主布局文件qq_listview如下,其中当我们拖动列表时,系统默认拖动过程中列表背景是黑的,我们可以通过android:cacheColorHint="#00000000"将其设置为透明,其中前两位是透明效果参数(00-99),后六位是颜色的设置。

Xml代码

1. 2. 8. 16. 19. 21. 22. 24. 27. 28.

如果我们想更换父节点打开和关闭时的箭头,可以先设置一个selector.xml

Java代码

然后在代码中调用

Java代码

elistview = (ExpandableListView)findViewById(R.id.qq_listview); //替换ExpandableListView的打开关闭时的箭头图标 elistview.setGroupIndicator(this.getResources().getDrawable(R.drawable.expand_list_selector));

此外,我们还要设置父节点和子节点item的布局文件

父节点qq_list_parent.xml如下

Java代码

子节点qq_listview_child.xml

Java代码

java代码如下

Java代码

package com.sy.android.qqlistview;import java.util.ArrayList;import java.util.HashMap;import java.util.Map;import android.app.Activity;import android.os.Bundle;import android.view.View;import android.view.View.OnClickListener;import android.widget.AbsListView;import android.widget.AbsListView.OnScrollListener;import android.widget.ExpandableListView;import android.widget.ExpandableListView.OnGroupCollapseListener;import android.widget.ExpandableListView.OnGroupExpandListener;import android.widget.LinearLayout;import android.widget.SimpleExpandableListAdapter;import android.widget.TextView;import com.sy.android.testAndroid.R;public class QQListView extends Activity { private static ArrayList> parentData = new ArrayList>(); private static ArrayList>> childData = new ArrayList>>(); private ExpandableListView elistview; private TextView tv; /** *当前打开的父节点 */ private int the_group_expand_position=-1; /** * 打开的父节点所与的子节点数 */ private int position_child_count=0; /** * 是否有打开的父节点 */ private boolean isExpanding=false; public void getData(){ for(int i=0; i<20;i++){ Map map = new HashMap(); map.put("parend", i+""); parentData.add(map); } for(int i=0;i<20;i++){ ArrayList> child = new ArrayList>(); for(int j=0; j<20;j++){ Map map = new HashMap(); map.put("child", i+""+j); child.add(map); } childData.add(child); } } public void onCreate(Bundle saveBundle){ super.onCreate(saveBundle); setContentView(R.layout.qq_listview); elistview = (ExpandableListView)findViewById(R.id.qq_listview); //替换ExpandableListView的打开关闭时的箭头图标 elistview.setGroupIndicator(this.getResources().getDrawable(R.drawable.expand_list_selector)); tv = (TextView)findViewById(R.id.qq_list_textview); /** * 滑动子列表时在上方显示父节点的view */ final LinearLayout linear = (LinearLayout)findViewById(R.id.gone_linear); /** * 监听父节点打开的事件 */ elistview.setOnGroupExpandListener(new OnGroupExpandListener(){ @Override public void onGroupExpand(int groupPosition) { the_group_expand_position=groupPosition; position_child_count=childData.get(groupPosition).size(); isExpanding=true; } }); /** * 监听父节点关闭的事件 */ elistview.setOnGroupCollapseListener(new OnGroupCollapseListener(){ @Override public void onGroupCollapse(int groupPosition) { if(linear.getVisibility()==View.VISIBLE){ linear.setVisibility(View.GONE); } isExpanding=false; } }); linear.setOnClickListener(new OnClickListener(){ @Override public void onClick(View v) { linear.setVisibility(View.GONE); elistview.collapseGroup(the_group_expand_position); } }); /** * 通过setOnScrollListener来监听列表上下滑动时item显示和消失的事件 */ elistview.setOnScrollListener(new OnScrollListener(){ @Override public void onScrollStateChanged(AbsListView view, int scrollState) { } @Override public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { if(isExpanding){ // 当当前第一个item id小于打开的父节点id 或大于打开的父节点id和它的子节点总数之和时 if(firstVisibleItem(the_group_expand_position+position_child_count)){ linear.setVisibility(View.GONE); }else{ linear.setVisibility(View.VISIBLE); tv.setText(((Map)parentData.get(the_group_expand_position)).get("parend").toString()); } } } }); getData(); SimpleExpandableListAdapter selAdapter = new SimpleExpandableListAdapter(this, parentData, R.layout.qq_listview_parend_item, new String[]{"parend"}, new int[]{R.id.parend}, childData, R.layout.qq_liatview_child_item, new String[]{"child"}, new int[]{R.id.child} ); elistview.setAdapter(selAdapter); }}

实现的思路是通过setOnScrollListener来监听listview,从而获得显示在视图中的item的id,通过id的判断来决定显示在顶端的自定义的view是否显示

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:spring boot项目没有mainClass如何实现打包运行
下一篇:android ListView中Checkbox实现单选,全选,全不选功能
相关文章

 发表评论

暂时没有评论,来抢沙发吧~