listView系列之分类显示
2016-05-21 11:14
246 查看
今天,我们继续来进行listView的深入了解,来进行一个简单的分类显示的例子,但主要是突出解决这类问题的思路与解法。 要实现的要求:是让1-100以内的奇数先显示,再显示偶数,同时奇数和偶数的显示开头有条目标记着。 步骤:1.我们首先得从1-100这类数中分开奇数和偶数,并将他们分别存储在集合中,方便后面的使用。 2.肯定是在适配器中的getView()的方法中来进行的操作。 3.在getView中对position进行操作才能实现分层的功能。 首先,我们同样得准备着前期的工作,下面能先是MainActivity的界面代码:
public class MainActivity extends Activity { private ListView mListview; // 存储奇数数据 private List<String> jiDatas; /// 存储偶数数据 private List<String> ouDatas; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); jiDatas=new ArrayList<String>(); ouDatas=new ArrayList<String>(); for (int i = 1; i <= 100; i++) { if(i%2==0) ouDatas.add(i+""); else jiDatas.add(i+""); } mListview = (ListView) findViewById(R.id.listView); mListview.setAdapter(new Myadapter()); } }
这里的布局也是十分简单,就是一个listView而已。这里我们主要就是创建了两个集合,来存储着1-100以内的奇数和偶数。
接下来是编写Myadapter适配器的代码,这里我同样因为简单就直接把这个适配器类写成MainActivity的内部类。而其中分类显示的主要代码就集中在这个类中的getView方法中:
public class Myadapter extends BaseAdapter { @Override public int getCount() { return 1+jiDatas.size()+ouDatas.size()+1; } @Override public Object getItem(int position) { return null; } @Override public long getItemId(int position) { return 0; } @Override public View getView(int position, View convertView, ViewGroup parent) { /// 优化式:在这里不仅引用上面的convertView的复用,同样利用Viewhodle来使用其中控件的findViewByID复用 ViewHodle hodler; ///这里的convertView instanceof ViewGroup是对convertView来进行 if (convertView !=null && convertView instanceof ViewGroup) { hodler = (ViewHodle) convertView.getTag(); } else { convertView = View.inflate(MainActivity.this, R.layout.my_item, null); hodler = new ViewHodle(); hodler.textview = (TextView) convertView.findViewById(R.id.item_tv); convertView.setTag(hodler); } /* * 其实对于数据的分类显示,就是对position的处理 */ ///对数据进行分类显示并且加上头目 String data; if(position==0){ TextView tv=new TextView(getApplicationContext()); tv.setText("奇数"+jiDatas.size()); tv.setTextColor(Color.GREEN); return tv; }else if(position<=jiDatas.size()){ data=jiDatas.get(position-1); }else if(position==jiDatas.size()+1){ TextView tv=new TextView(getApplicationContext()); tv.setText("偶数"+ouDatas.size()); tv.setTextColor(Color.GREEN); return tv; }else{ data=ouDatas.get(position-jiDatas.size()-1-1); } hodler.textview.setText(data); return convertView; } } static class ViewHodle { TextView textview; }
这里的我们采用的是listView优化的方法来写的Myadapter的,不懂得可以参考我前一篇listView系列之优化问题,在上面Myadpater的代码中,下面这些代码是通过处理position来进行的分类功能,现在我们来具体分析:
/* * 其实对于数据的分类显示,就是对position的处理 */ ///对数据进行分类显示并且加上头目 String data; if(position==0){ TextView tv=new TextView(getApplicationContext()); tv.setText("奇数"+jiDatas.size()); tv.setTextColor(Color.GREEN); return tv; }else if(position<=jiDatas.size()){ data=jiDatas.get(position-1); }else if(position==jiDatas.size()+1){ TextView tv=new TextView(getApplicationContext()); tv.setText("偶数"+ouDatas.size()); tv.setTextColor(Color.GREEN); return tv; }else{ data=ouDatas.get(position-jiDatas.size()-1-1); } hodler.textview.setText(data);
首先,我们来梳理一下逻辑:因为我们需要实现的要求是1-100个数中操作,那也就是说listView中的position就是0-99,而现在我们即然要让jiDatas和ouDatas这两个集合同时按顺序显示上去,那我们知道获取集合list的数据方法是jiDatas.get(X),这里的X就是集合中的序号,在这里的jiDatas集合中X也就是0-49中,那么我们就要用position来表示这个X,这样才能让数据分类显示出来。
接着,我们看listView的position等于0时,要让其有一个奇数的一头目。这里我们直接new一个TextView来显示奇数的头目;
当position<=jiDatas.size()时,我们让其显示奇数,本来没有上面的奇数头目时,position是0-49显示奇数,但现在有了一个头目,也就是当position为1-50才显示奇数,而jiDatas.size()是等于50的。而又因为现在的position是表示1-50,所以data=jiDatas.get(position-1)才会让position等于我们上述提到的X。
当positon处于51时,也就是jiDatas.size()+1的位置时,再让其增加一个偶数的条目。
当position处于52-100,也就是余下的所有位置显示偶数即可,因为我们需要position和ouDatas.get(X)中的X相等,而X是0-49,所以我们需要让position先减去jiDatas.size,再减去两个头目的个数。
当我们解决完这些逻辑代码时,基本上可以实现分类显示并带有头目的功能了,但是又出现一个问题:因为我们这里是用的convertView来进行的优化,而这里会出现两个convertView是保存视图,(如不懂convertView请参考listView系列之优化问题)一个是convertView1来保存new处理来的textView条目的视图,还有一个是convertView2来保存list集合中的item视图,这两个我convrtView是不一样的,所以当我们执行hodler = (ViewHodle) convertView.getTag()会有可能获得错误的convertView,所以我们要来区分开进行,我们这里用了convertView instanceof ViewGroup来进行与条目的convertView进行区分。这样,既可以利用convertView来优化,又不会报错当然区分的方法不只是这一种,碰到不同的情况可以使用不同的方法,但最重要的思想就是要区分开进行。
最后,来个简单点的总结,1、实现分类就是position进行处理
2、就是要区分convertView的不同。
其实。我们也可以用同样的思想来用同一个listView显示不同的布局形式,这个后面再介绍。
相关文章推荐
- 完美实现Android ListView中的TextView的跑马灯效果
- android上改变listView的选中颜色
- Delphi7中Listview的常用功能汇总
- Delphi控件ListView的属性及使用方法详解
- android中ListView数据刷新时的同步方法
- Android提高之ListView实现自适应表格的方法
- Android中实现水平滑动(横向滑动)ListView示例
- Android ListView分页功能实现方法
- C#实现ListView选中项向上或向下移动的方法
- C#下listview如何插入图片
- Listview加载的性能优化是如何实现的
- C#实现listview Group收缩扩展的方法
- C# listview添加combobox到单元格的实现代码
- ListView 百分比进度条(delphi版)
- Android listview多视图嵌套多视图
- ListView Adapter优化 实例
- Android用ListView显示SDCard文件列表的小例子
- Adapter实现ListView带多选框等状态的自定义控件的注意事项
- asp.net ListView 数据绑定
- Android之ScrollView嵌套ListView和GridView冲突的解决方法