上一篇文章中,只对listview进行了分页,本文将在上一篇代码的基础上,增加过滤的功能,过滤首先要给listview增加一个属性android:textFilterEnabled="true",然后BaseAdapter要继承Filterable的接口。废话少说,上代码:
DsznzActivity代码,大部分代码和上一篇文章中的代码相同,就不重复写了,只写有改动和增加的
//增加了两个属性 private ArrayList<HashMap<String, String>> tmpListItem; private EditText inputSearch; MyAdapter myAdapter; inputSearch=(EditText) findViewById(R.id.inputSearch); inputSearch.addTextChangedListener(new TextWatcher() { //监听文本框的改变 @Override public void onTextChanged(CharSequence s, int start, int before, int count) { myAdapter.getFilter().filter(s); } @Override public void beforeTextChanged(CharSequence s, int start, int count,int after) { } @Override public void afterTextChanged(Editable s) { } }); //tmpListItem是用来存储从数据库中获取到的所有记录,当listItem发生变化时,可以从tmpListItem中过滤取得需要的值 tmpListItem = new ArrayList<HashMap<String, String>>(); //在给listItem赋值的同时,也给tmpListItem赋值 JSONArray array = new JSONArray(URLDecoder.decode(json, "utf-8")); for (int i = 0; i < array.length(); i++) { HashMap<String, String> map = new HashMap<String, String>(); map.put("ylfn_did", array.getJSONObject(i).getString("did")); map.put("ylfn_name", array.getJSONObject(i).getString("name")); map.put("gmsfz", array.getJSONObject(i).getString("gmsfz")); listItem.add(map); tmpListItem.add(map); } //MyAdapter // ListView的Adapter,这个是关键的导致可以分页的根本原因。 public class MyAdapter extends BaseAdapter implements Filterable{ Activity activity; private MyFilter filter; public MyAdapter(Activity a) { activity = a; } // 设置每一页的长度,默认的是View_Count的值。 @Override public int getCount() { // TODO Auto-generated method stub // return data.length; // ori表示到目前为止的前几页的总共的个数。 int ori = VIEW_COUNT * index; // 值的总个数-前几页的个数就是这一页要显示的个数,如果比默认的值小,说明这是最后一页,只需显示这么多就可以了 if (listItem.size() - ori < VIEW_COUNT) { return listItem.size() - ori; } // 如果比默认的值还要大,说明一页显示不完,还要用换一页显示,这一页用默认的值显示满就可以了。 else { return VIEW_COUNT; } } @Override public Object getItem(int position) { // TODO Auto-generated method stub return position; } @Override public long getItemId(int position) { // TODO Auto-generated method stub return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { // TODO Auto-generated method stub // return addTestView(position); convertView = LayoutInflater.from(getApplicationContext()).inflate(R.layout.ylfn,null); TextView ylfn_did_view = (TextView)convertView.findViewById(R.id.ylfn_did); TextView ylfn_name_view = (TextView)convertView.findViewById(R.id.ylfn_name); TextView ylfn_gmsfz_view = (TextView)convertView.findViewById(R.id.gmsfz); ylfn_did_view.setText(listItem.get(position + index * VIEW_COUNT).get("ylfn_did")); ylfn_name_view.setText(listItem.get(position + index * VIEW_COUNT).get("ylfn_name")); ylfn_gmsfz_view.setText(listItem.get(position + index * VIEW_COUNT).get("gmsfz")); return convertView; } @Override public Filter getFilter() { if(filter == null){ filter = new MyFilter(); } return filter; } } //MyFilter private class MyFilter extends Filter{ @Override protected FilterResults performFiltering(CharSequence constraint) { //存储过滤的值 FilterResults retval = new FilterResults(); retval.values = tmpListItem; retval.count = tmpListItem.size(); //有筛选条件时,显示被筛选的内容; 没有筛选条件时,显示所有内容 if(constraint != null && constraint.toString().length() > 0) { constraint = constraint.toString().toUpperCase(); ArrayList<HashMap<String, String>> filt = new ArrayList<HashMap<String, String>>(); for(int i = 0; i < tmpListItem.size(); i++) { HashMap<String, String> ylfn_i = tmpListItem.get(i); if( ylfn_i.get("ylfn_did").toUpperCase().contains(constraint) || ylfn_i.get("ylfn_name").toUpperCase().contains(constraint) || ylfn_i.get("gmsfz").toUpperCase().contains(constraint)) { filt.add(ylfn_i); } } retval.count = filt.size(); retval.values = filt; } return retval; } @Override protected void publishResults(CharSequence constraint, FilterResults retval) { //先清空旧数据 listItem.clear(); myAdapter.notifyDataSetChanged(); //再添加新数据 index=0; //过滤后重新分页,当前为第一页 listItem.addAll((ArrayList<HashMap<String, String>>)retval.values); myAdapter.notifyDataSetChanged(); checkButton(); } }
相关推荐
这可以通过绑定到视图模型的属性实现,如页码文本框和“上一页”、“下一页”按钮的命令。按钮的样式可以通过模板进行自定义,以匹配应用程序的外观。 5. 更新数据: 当用户点击分页按钮时,视图模型中的...
在网页或桌面应用程序中,常见的分页控件通常包含“上一页”、“下一页”按钮,以及显示当前页数和总页数的选项。 "灵活的分页控件"意味着该控件具有高度可配置性,可以适应各种场景。它可能支持动态改变每页显示的...
5. **导航链接生成**:根据总页数,生成用于导航的链接,通常包括“上一页”、“下一页”和页码跳转等。 6. **事件处理**:处理用户点击分页链接时的事件,更新页面参数并重新加载数据。 7. **性能优化**:为了...
在Windows Forms(Winform)开发中,为了处理大量数据并提高用户界面的可操作性,分页控件是一个必不可少的组件。"winform分页控件"是专门为Winform应用程序设计的一种工具,它允许用户以分页的方式查看数据,而不是...
5. 用户界面:在页面设计(例如`default.aspx`)中,你需要创建分页导航元素,如页码链接或下一页/上一页按钮。这些元素的点击事件会触发后台的分页逻辑,更新分页参数并重新加载数据。 6. 回调和异步处理:为了...
分页技术将大数据集分割成较小、更易管理的部分,每次只加载一页的数据,用户可以通过页码或导航按钮在不同页面间切换。这样既能保持应用的流畅性,又能提供足够的信息供用户查看和操作。 在VC++(Visual C++)环境...
考虑到用户体验,可以添加“首页”、“上一页”、“下一页”和“末页”按钮,以及显示总页数和当前页的功能。百度风格的分页通常还包括快速跳转到特定页的功能,用户可以直接输入页码并跳转。 6. **动态调整分页...
上一页 {% endif %} 第 {{ page_obj.number }} 页 / 共 {{ paginator.num_pages }} 页 {% if page_obj.has_next %} 下一页 {% endif %} ``` 通过以上讲解,你应该对Django ListView有了深入的理解...
本文将深入探讨如何在Android平台上实现分页读取手机通讯录联系人信息,并将其展示给用户。 首先,我们需要了解Android系统中的联系人API。Android提供了ContentProvider接口来访问系统的联系人数据,通过...
在Android平台上,开发一款应用来实现从SDCard中读取TXT文件并展示为翻书效果,需要涉及到多个技术层面。以下将详细介绍这个过程中的关键知识点: 1. **Android权限管理**: 在Android中,访问外部存储(如SDCard...