ListView分组实现方案(一)

分组的效果如下表格item列所示:

listView分组思路:在item.xml配置文件里面定义一个显示组名的TextView,该TextView只在当前分组的第一个时显示,其它的默认不显示(即View.GONE);

上面其余列的说明:

position列:对应getView方法里面的position参数;

groupIndex:当然position对应的item属于第几个分组,或者说当前分组的索引号。

group_position:当前分组组名所在的item在listView中所处的位置position,比如分组A在listView中的position位置为0,分组B在listView中对应的position为4

item.xml类似如下效果:

//上下布局的linearLayout
<LinearLayout>
   //用来显示组名比如A
   <TextView  id="group_name"/ >
   //用来显示item的具体信息比如a1
   <TextView id="item_info"/>
</LinearLayout>

具体实现思路以及伪代码(getView里面进行处理判断:

1.判断当前position对应的item属于哪一个或者第几个分组;并获取该分组的索引groupIndex

2.根据groupIndex来获取group_position的值,如果group_position==position那么就让group_name对应的textView 显示否则设置为View.GONE;

综上所述整体上getView的伪代码如下:

假设用一个String[]  group_names = {"A","B","C",...}来保存分组的名称

int[]  group_positions = {0,4}用来保存当前分组在listView中的位置

Int groupIndex = getGroupIndex(position);
Int group_position = getGroup_Position(groupIndex);
If(group_position==position){
  group_name.setVisiable(true);
  group_name.setText(group_names(groupIndex));
}else{
 group_name.setVisiable(false);
}

获取当前item属于哪一个分组getGroupIndex(position)的伪代码如下

//获取当前position 对应的item
Item item = getItem(position);
//获取groupIndex
Int groupIndex = Arrays.binarySearch(group_names,item.getXXX())
return groupIndex>=0? index:-index-2;

item.getXXX()是获取item中显示字符串第一个首字母的大写字母

//那么获取当前分组在ListView中对应位置的getGroupPosition(groupIndex)的代码就如下所
return group_positions.get(groupIndex)

关于ListView分组,Android提供了SectionIndexer接口,该接口提供了三个方法,实现分组的思路大体上跟上面讲的差不多,就不在赘述(吐槽,个人感觉SectionIndexer的名字不如GroupIndexer好)

下面贴上自己的测试代码:

activity_main.xml

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

    <ListView
        android:id="@+id/myListView"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent" />
</RelativeLayout>

item.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical" >
    <!-- 分组名 -->
    <TextView
        android:id="@+id/group_name"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:background="@android:color/darker_gray"/>
    <!-- 显示信息 -->
    <TextView
        android:id="@+id/item_info"
        android:layout_width="wrap_content"
        android:layout_height="80sp"
        android:textSize="45sp" />

</LinearLayout>
public class MainActivity extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ListView list = (ListView) findViewById(R.id.myListView);
        ArrayList<String> stringList = InitListData();
        MyAdapter adapter = new MyAdapter(this, stringList);
        list.setAdapter(adapter);  

    }
    private ArrayList<String> InitListData() {
        ArrayList<String> stringList = new ArrayList<String>();
        stringList.add("aenegli");
        stringList.add("abddaf");
        stringList.add("are");
        stringList.add("care");
        stringList.add("ahow");
        stringList.add("abide");
        stringList.add("bandidate");
        stringList.add("bapture");
        stringList.add("catch");
        stringList.add("call");
        stringList.add("abuse");
        stringList.add("cow");
        //排个序
        Collections.sort(stringList);
        return stringList;
    }
}
public class MyAdapter extends BaseAdapter {

	    //分组名
	    private char groupNames[] = {
	    		'A','B','C'
	    };

	    private List<Integer> groupPositions;

	    private List<String> stringArray;  

	    //初始化groupPositions
	    private void initGroupPositions(){
	    	groupPositions = new ArrayList<Integer>();
	    	for (int i = 0; i < stringArray.size(); i++) {
				if(i==0){//第一条数据
					groupPositions.add(0);
					continue;
				}

				if(i != groupPositions.size()){
					String currentStr = stringArray.get(i);
					String preStr = stringArray.get(i-1);
					char firstCharOfCurrentStr = currentStr.charAt(0);
					char firstCharOfPreStr = preStr.charAt(0);
					if(firstCharOfCurrentStr!=firstCharOfPreStr){
						groupPositions.add(i);
					}
				}
			}
	    }
	    private Context context;
	    public MyAdapter(Context context, ArrayList<String> arr) {
	        stringArray = arr;
	        this.context = context;
	        initGroupPositions();
	       Log.e("groupPositions== ",groupPositions.size()+"");
	    }
	    public int getCount() {
	        return stringArray.size();
	    }
	    public String getItem(int position) {
	        return stringArray.get(position);
	    }
	    public long getItemId(int position) {
	        return position;
	    }
	    public View getView(int position, View view, ViewGroup parent) {
	    	LayoutInflater inflate = ((Activity) context).getLayoutInflater();
	        view = (View) inflate.inflate(R.layout.item, null);
	        TextView groupNameView = (TextView) view.findViewById(R.id.group_name);
	        String itemStr = stringArray.get(position);
	        //分组处理
	        int groupIndex = getGroupIndex(position);
	        int groupPosition = getGroupPosition(groupIndex);
	        if(position==groupPosition){
	        	groupNameView.setText(groupNames[groupIndex]+"");
	        	groupNameView.setVisibility(View.VISIBLE);
	        }else{
	        	groupNameView.setVisibility(View.GONE);
	        }
	        TextView textView = (TextView) view.findViewById(R.id.item_info);
	        textView.setText(itemStr);
	        return view;
	    }  

	    //根据position获取当前item属于第几个group,也就是获取group的索引
	    public int getGroupIndex(int position) {
	    	String itemStr = getItem(position);
	    	char firstChar = itemStr.toUpperCase().charAt(0);

	    	int groupIndex = Arrays.binarySearch(groupNames, firstChar);
	    	Log.e("firstChar--groupIndex",firstChar+"---"+groupIndex);
	        return groupIndex>=0?groupIndex:-groupIndex-2;
	    }  

	    //根据groupIndex来获取当前分组对应于ListView中的position
	    public int getGroupPosition(int groupIndex){
	    	return groupPositions.get(groupIndex);
	    }
}
时间: 2024-10-05 05:31:36

ListView分组实现方案(一)的相关文章

Anroid ListView分组和悬浮Header实现

Anroid ListView分组和悬浮Header实现 分类: Android2014-01-27 12:26 6585人阅读 评论(13) 收藏 举报 listviewheadersection分组悬浮 目录(?)[+] 之前在使用iOS时,看到过一种分组的View,每一组都有一个Header,在上下滑动的时候,会有一个悬浮的Header,这种体验觉得很不错,请看下图: 上图中标红的1,2,3,4四张图中,当向上滑动时,仔细观察灰色条的Header变化,当第二组向上滑动时,会把第一组的悬浮H

android的listview分组显示的时候layout_marginTop失效的解决办法

在使用android的ListView组件做类似于通讯录这样的功能时,需要根据A.B.C这样的标题来区来分组显示通讯录中的姓名,本人在做实验过程中遇到了这样一个问题,比如,想让标题item和上边的用户名item中间有个间隙,而组(同个标题下)用户名之间不能有间隙,原本以为很简单,我认为在标题item的最外层LinearLayout中增加一个layout_marginTop属性即可,结果发现一只无效,最后请教了个高手告诉我需要在标题item的顶层LinearLayout中再嵌套一层,然后在第二层中

android之ListView分组及字母索引导航(2)重构-接口

上篇文章对listView 分组和字母索引导航的实现思路做了分析,并依照思路一步步实现,到最后已经较好的实现了全部功能.但是仔细研究就会发现其实现不够好,主要问题: 1.               对于一个使用范围比较广泛的布局,以上实现不够通用,尤其是Bo中需加上一些多余的字段,这些字字段本身并没有意义. 2.               代码都糅合在activity中. 针对以上两点做一些代码重构.首先我们把其优化为一个通用的activity.这样做成通用的View就很容易:然后对代码进行

ListView 的 优化方案

ListView 的 优化方案 (1),如果自定义适配器,那么在 getView 方法中要考虑方法传进来的参数 contentView 是否 为 null,如果为 null 就创建 contentView 并返回,如果不为 null 则直接使用.在这个方法中,尽可能少创建 view. (2),给 contentView 设置 tag(setTag()),传入一个 viewHolder 对象,用于缓存要显示的数 据,可以达到图像数据异步加载的效果 (3),如果 listview 需要显示的 ite

ListView 分组 显示网络数据

最近项目中需要使用到 分组展示数据的形式,借鉴了网上前辈们的 精华,现写一点总结,留作个人查看. 首先 为了给ListView 中填充数据定义 List<BaseInfo> datas  = new ArrayList<BaseInfo>(); BaseInfo 中首先需要定义一个className 来区别 类别,以便进行展示 在每组 数据存放之前,先往datas 中存放一个  只有 className 不为空的 BaseInfo对象,然后再把该组数据存放到datas中 然后按照

WPF ListView 分组 Grouping

在Resource里定义数据源和分组字段: <CollectionViewSource x:Key="listData" Source="{Binding CategoryItemsView}"> <CollectionViewSource.GroupDescriptions> <PropertyGroupDescription PropertyName="CategoryType"></Property

Android ListView分组显示

ListView的实现方法也是普通的实现方法.只不过在list列表中加入groupkey信息.在渲染的时候要判断是否是分组的标题. 就是在使用不同的两个View的时候存在这种情况,convertView不为空但是由于它渲染到别的layout的关系.它里面内容的view是为空的经常会出现空指针的错误. 我这里使用了一个非常低效的方法,下次应该会改进一下. 先贴上自己实现的adapter 1 import java.util.ArrayList; 2 import java.util.HashMap

ListView 的优化方案

1.在自定义的适配器里,判断getView方法里的参数contentView是否为null,如果为null就创建contentView并返回,如果不为null就直接使用,这样就尽可能少的创建view. 2.给 contentView 设置 tag(setTag()),传入一个 viewHolder 对象,用于缓存要显示的数据,可以达到图像数据异步加载的效果 3.如果 listview 需要显示的 item 很多,就要考虑分页加载.比如一共要显示100条或者更多的时候,我们可以考虑先加载20条,等

仿照支付宝账单界面--listview分组显示 用来做!发!财树充值交易明细

QQ图片20150430155638.png (151.65 KB, 下载次数: 32) 下载链接: http://pan.baidu.com/s/1kVMY1SV 密码: i8ta