您的位置:首页 > 其它

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显示不同的布局形式,这个后面再介绍。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息