`

ListView实现简单的过滤,排序等控制

阅读更多
ArrayAdapter实际上已经实现了过滤,排序等功能,只是ArrayAdapter太弱了,我们通常不去用它。
本人参考了ArrayAdapter源码写的一个adpater,可以有以下功能:
1,排序(最普通的String排序)
2,过滤(头匹配过滤,尾匹配过滤,任意位置匹配过滤)
3,指定返回需要的项数
3,可以指定其中不允许操作的Item

虽然该类功能也不算强(事实上也没办法强,很多东西都得自定义,无法涵盖所有情况),但总算实现了基本的功能,大家可以根据自己的实际情况在此基础上改。
ArrayAdapter源码:http://gundumw100.iteye.com/admin/blogs/1023902
package com.ql.app;

import java.text.Collator;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.BaseAdapter;
import android.widget.Filter;
import android.widget.Filterable;
import android.widget.ListView;
import android.widget.TextView;

public class App extends Activity {
	List<String> dataList;
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        dataList=Array2List(mStrings);
//        ArrayAdapter<String> adapter=new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1, dataList);
        //用法
        ControllableSimpleAdapter adapter=new ControllableSimpleAdapter(this,dataList);
        adapter.getFilter().filter("!");
        adapter.setMax(ControllableSimpleAdapter.ALL);
        adapter.setNeedSort(true);
        adapter.setFilterType(ControllableSimpleAdapter.FILTER_BODY);
        ListView listview=(ListView)findViewById(R.id.listview);
        listview.setAdapter(adapter);
        
    }
    
    /**
     * 数组转成List
     * @param <T>
     * @param tArray
     * @return
     */
    public static <T extends Object> List<T> Array2List(T[] tArray) {     
        List<T> tList = Arrays.asList(tArray);     
        // List<T> tList = new ArrayList<T>(Arrays.asList(tArray));     
        return tList;     
    }
    
    /**
     * 可控制的简单Adapter
     * @author admin
     *
     */
    private class ControllableSimpleAdapter extends BaseAdapter implements Filterable{
		
		public static final int ALL=-1; //全部需要
		public static final int FILTER_HEAD=0;//从头开始过滤
		public static final int FILTER_FOOT=1;//从后开始过滤
		public static final int FILTER_BODY=2;//任意过滤
		
		private Context context;
		private List<String> list;
		private boolean needSort=false;//是否需要排序
		private ArrayFilter filter;//过滤器
		private int max=ALL;//最多需要的项,默认全部需要
		private int filterType = FILTER_HEAD;//过滤类别,默认从头开始过滤
		
		public ControllableSimpleAdapter(Context context,List<String> list) {
			this.context = context;
            this.list=list;
        }

		//返回false后Item间的分割线消失
        @Override
        public boolean areAllItemsEnabled() {
        	return false;
        }
        
        //带有“-”的不可操作,通常和areAllItemsEnabled一起使用。
        @Override
        public boolean isEnabled(int position) {
        	return !list.get(position).startsWith("-");//此处根据需求灵活处理
        }
        
        public int getCount() {
            return list.size();
        }

        public Object getItem(int position) {
            return list.get(position);
        }

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

        public View getView(int position, View convertView, ViewGroup parent) {
            TextView tv;
            if (convertView == null) {
                tv = (TextView) LayoutInflater.from(context).inflate(
                        android.R.layout.simple_expandable_list_item_1, parent, false);
            } else {
                tv = (TextView) convertView;
            }
            tv.setText(list.get(position));
            return tv;
        }
        
        public List<String> getList() {
			return list;
		}

		public void setList(List<String> list) {
			this.list = list;
		}

        public boolean isNeedSort() {
			return needSort;
		}

		public void setNeedSort(boolean needSort) {
			this.needSort = needSort;
		}

		private List<String> dosort(List<String> list) {
            Collections.sort(list, comparator);
            return list;
        }
        private Comparator<String> comparator = new Comparator<String>() {
            private final Collator   collator = Collator.getInstance();

            public int compare(String s1, String s2) {
                return collator.compare(s1, s2);
            }
        };
        
		@Override
		public Filter getFilter() {
			// TODO Auto-generated method stub
			if (filter == null) {  
				filter = new ArrayFilter();  
	        }  
	        return filter;
		}
		
		public int getFilterType() {
			return filterType;
		}

		public void setFilterType(int filterType) {
			this.filterType = filterType;
		}
		
		public int getMax() {
			return max;
		}

		public void setMax(int max) {
			this.max = max;
		}
		private class ArrayFilter extends Filter {

			@Override
			protected FilterResults performFiltering(CharSequence prefix) {
				// TODO Auto-generated method stub
				FilterResults results = new FilterResults();
				if (prefix == null || prefix.length() == 0) {//没有过滤符就不过滤
     //new ArrayList<String>()表示让ListView一开始的时候什么都没有,而不是全部显示到ListView中
					//new ArrayList<String>(list)表示一开始就让Item全部显示到ListView中
					ArrayList<String> l = new ArrayList<String>(list);
					results.values = l;
					results.count = l.size();
				} else {
			if(needSort&&!list.isEmpty()){//如果需要过滤的话,需要先排序,后过滤,可能会影响性能。
		            	dosort(list);
		            }
					
					String prefixString = prefix.toString().toLowerCase();

					final ArrayList<String> values = new ArrayList<String>(list);
							
					final int count = values.size();

					final ArrayList<String> newValues = new ArrayList<String>(count);
							
					for (int i = 0; i < count; i++) {
						final String value = values.get(i);//原始字符串
						final String valueText = value.toString().toLowerCase();

						// 匹配核心代码,需要自己实现,这里只提供了基本的过滤类型
						switch (filterType) {
						case FILTER_HEAD:
							if (!valueText.startsWith(prefixString)) {//过滤掉不需要的项
								newValues.add(value);
							}
							break;
						case FILTER_FOOT:
							if (!valueText.endsWith(prefixString)) {//过滤掉不需要的项
								newValues.add(value);
							}
							break;
						case FILTER_BODY:
							if (valueText.indexOf(prefixString)==-1) {//过滤掉不需要的项
								newValues.add(value);
							}
							break;

						default:
							break;
						}
						
						if(max>ALL){//不是全部
							if(newValues.size()>max-1){//超过了就舍去
								break;
							}
						}
					}
					
					results.values = newValues;
					results.count = newValues.size();
				}

				return results;
			}

			@Override
			protected void publishResults(CharSequence constraint,
					FilterResults results) {
				// TODO Auto-generated method stub
				list = (List<String>) results.values;  
	            if (results.count > 0) {  
	                notifyDataSetChanged();  
	            } else {  
	                notifyDataSetInvalidated();  
	            }
			}
			
		}
    }
    
    //test data
    private String[] mStrings = {
    		"----------",
    		"Doppelrhamstufel",
    		"Dorset Blue Vinney",
    		"----------",
    		"Babybel",
    		"----------",
    		"Caerphilly",
    		"----------",
            "Abbaye de Belloc",
            "Abbaye du Mont des Cats",
            "Abertam",
            "Abondance",
            "Ackawi",
            "Acorn",
            "Adelost",
            "Affidelice au Chablis",
            "!Afuega'l Pitu",
            "!Airag",
            "!Airedale",
            "!Aisy Cendre",
            "!Allgauer Emmentaler",
            "!Alverca",
            "Ambert",
            "American Cheese!",
            "Ami du Chambertin!",
            "Anejo Enchilado!",
            "Anneau du Vic-Bilh",
            "Anthoriro",
    };
}

分享到:
评论
3 楼 sunshaoqun 2013-05-08  
过滤后再做排序或许性能就提高了些吧。
2 楼 bdstudyhard 2012-12-18  
1 楼 kikier 2012-07-26  
文章的代码是过滤出不符合条件的?

相关推荐

    ListView实现字母过滤排序及搜索功能

    本教程将深入讲解如何在ListView中实现字母过滤排序以及搜索功能,这在构建应用的用户界面时非常重要,可以提升用户体验,使得用户能够更方便地查找和操作数据。 首先,我们需要了解ListView的基本结构。ListView是...

    listview按字母过滤排序封装好的。

    在这个封装好的示例中,我们主要关注如何实现ListView的字母过滤和排序功能。这个功能对于应用中的联系人列表、商品目录或者其他需要按照字母顺序展示的数据集合非常有用。以下是关于这个主题的详细解释: 1. **...

    Android ListView字母排序过滤搜索

    Android ListView字母排序过滤搜索,注释详细,可下载使用!

    Android 仿联系人列表 实现ListView的A-Z字母排序和过滤搜索功能

    总结来说,实现"Android 仿联系人列表 实现ListView的A-Z字母排序和过滤搜索功能"涉及到以下关键知识点: 1. ListView的使用和Adapter机制 2. 数据排序与Comparator 3. 字母导航栏的创建与点击事件处理 4. EditText...

    Android ListView实现A-Z字母排序

    下面是一个简单的Activity示例,展示了如何在ListView中实现A-Z排序: ```java public class MainActivity extends AppCompatActivity { private ListView listView; private ArrayList&lt;String&gt; dataList = ...

    WPF ListView控件添加排序功能

    例如,你可以使用`ObservableCollection&lt;T&gt;`,这是一个可观察的集合,它继承自`ICollectionView`,这个接口包含了排序、过滤等功能。 - 在ListView的XAML代码中,为GridView的每列添加一个HeaderTemplate,用于显示...

    Android实现ListView的A-Z字母排序和过滤搜索功能完整实例源码

    Android实现ListView的A-Z字母排序和过滤搜索功能,完整源码,小伙伴需要的来CSDN下载吧!项目详情http://blog.csdn.net/xiaanming/article/details/12684155

    实现ListView的字母排序和过滤搜索功能(完整实例源码)

    本教程将详细介绍如何在ListView中实现字母排序和过滤搜索功能,提供一个完整的实例源码供参考。首先,我们来理解这两个功能的核心概念。 **一、字母排序** 1. **SectionIndexer接口**:在ListView中实现字母排序...

    ListView的字母排序和过滤搜索功能第三种效果

    在这个特定的案例中,我们关注的是ListView的两种增强功能:字母排序(Alphabetical Indexing)和过滤搜索(Filter Search)。这两种特性使得用户能够更方便地浏览和查找列表中的项目。 首先,让我们详细了解一下...

    WPF ListView排序功能

    - **ICollectionView接口**:WPF为ListView提供了一个间接的数据接口——ICollectionView,它提供了排序、过滤和分页等功能。当ListView的ItemsSource是ICollectionView时,可以通过调用其SortDescriptions和Filter...

    Android 实现ListView的A-Z字母排序和过滤搜索功能

    本文将深入探讨如何在Android Studio环境下实现ListView的A-Z字母排序以及过滤搜索功能。 首先,我们需要创建一个包含字母索引的ListView。这通常涉及到两部分:数据源的处理和ListView的适配器。数据源可以是...

    ListView的字母排序和过滤搜索功能第四种效果

    本教程将深入探讨如何实现ListView的字母排序和过滤搜索功能,以创建类似通讯录的效果。我们参考的项目是"SortedContactUI-master",它展示了如何实现这一第四种效果。 首先,理解ListView的基本原理至关重要。...

    Android 使用ListView的A-Z字母排序功能实现联系人模块

    综上所述,实现Android的ListView A-Z字母排序功能和搜索过滤,主要涉及数据排序、拼音转换、适配器的自定义、事件监听和用户交互设计等多个方面。通过合理的代码结构和优化,可以提供一个高效、友好的联系人管理...

    ListView的字母排序和过滤搜索功能

    本篇文章将深入探讨如何为ListView实现字母排序和过滤搜索功能,以提供更好的用户体验。 首先,我们要了解ListView的基本结构。ListView通常与Adapter结合使用,Adapter负责填充数据并将其显示在ListView的各个Item...

    Android 实现ListView的A-Z字母排序和过滤搜索功能,实现汉字转成拼音

    本教程将深入探讨如何实现ListView的A-Z字母排序和过滤搜索功能,并介绍如何将汉字转换为拼音,以支持按拼音首字母进行快速定位和筛选。 一、ListView基础 ListView是Android中的一个视图容器,它可以动态加载和...

    Android 实现ListView的A-Z字母排序和过滤搜索功能,实现汉字转成拼音 demo

    本教程将详细讲解如何在ListView中实现A-Z字母排序以及过滤搜索功能,并演示如何将汉字转换为拼音,以便进行字母索引导航。 首先,我们需要理解ListView的基本结构。ListView通常结合Adapter使用,Adapter负责填充...

    ListView的字母排序和过滤搜索功能第二种效果

    在这个特定的案例中,我们关注的是ListView的字母排序和过滤搜索功能。这两种特性对于提升用户体验至关重要,特别是当应用程序需要处理大量可分类的数据时。 首先,让我们详细了解一下字母排序功能。在Android中,...

    wpf listView分组排序

    `CollectionView`是数据源的一个视图,它可以提供排序、过滤和分组等功能。例如: ```csharp ICollectionView view = CollectionViewSource.GetDefaultView(listView.ItemsSource); view.SortDescriptions.Add(new ...

    实现ListView汉字拼音首字母排序

    本篇将详细介绍如何利用拼音库来实现ListView的汉字拼音首字母排序。 首先,我们需要一个能够将汉字转换为拼音的库。在给定的压缩包`PinyinPaixun`中,可能包含了这样的jar包。这类库通常提供API,可以将汉字转化为...

Global site tag (gtag.js) - Google Analytics