在现实的项目开发中,listView往往会加载不同类型的数据,这就要求我们要对listView进行多条目的加载,对数据类型进行判断,怎么判断呢?主要在适配器里面进行类型的判断。
结构图:
先看一下布局文件:
activity.xml:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.day9listviewmore.MainActivity" >
<ListView
android:id="@+id/lv"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</RelativeLayout>
list_item0.xml:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.day9listviewmore.MainActivity" >
<TextView
android:id="@+id/tv0"
android:layout_width="match_parent"
android:layout_height="wrap_content"
/>
</RelativeLayout>
list_item1.xml:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.day9listviewmore.MainActivity" >
<TextView
android:id="@+id/tv1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
/>
<ImageView
android:id="@+id/iv1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/tv1"
android:src="@drawable/ic_launcher"
/>
</RelativeLayout>
适配文件:
News.java:
public class News {
int type; //10001:显示新闻 10002:显示广告 20001 20002
String title;
public int getType() {
return type;
}
public void setType(int type) {
this.type = type;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public News(int type, String title) {
super();
this.type = type;
this.title = title;
}
@Override
public String toString() {
return "News [type=" + type + ", title=" + title + "]";
}
}
主要代码如下:在listView适配器重写的四个方法的基础上,再手动重写两个方法,分别是:getViewTypeCount(),getItemViewType(int position),这两个方法,第一个是确定加载条木有几种数据类型,第二个是对数据进行判断和分类的。
MainActivity.java:
import java.util.ArrayList;
import java.util.List;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
import com.example.day9listviewmore.bean.News;
public class MainActivity extends Activity {
ListView lv;
List<News> list;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
lv = (ListView) findViewById(R.id.lv);
initData();
MyAdapter adapter = new MyAdapter();
lv.setAdapter(adapter);
}
private void initData() {
list = new ArrayList<News>();
for (int i = 0; i < 100; i++) {
News news;
if(i%7 == 5){
news = new News(10002, "广告" + i);
}else{
news = new News(10001, "正文标题" + i);
}
list.add(news);
}
}
/**
* 1、需要重写两个方法
* 2、getViewTypeCount的返回值必须要大于getItemViewType的返回值
* 3、对于返回的Type类型 通常定义成 静态常量来区分
* @author Administrator
*
*/
class MyAdapter extends BaseAdapter{
public static final int TYPE_ONE = 0;
public static final int TYPE_TWO = 1;
@Override
public int getCount() {
// TODO Auto-generated method stub
return list.size();
}
//在使用多条目加载的时候 返回当前position对应的类型
//************必须满足的条件 getItemViewType的返回值 必须要小于getViewTypeCount的返回值
@Override
public int getItemViewType(int position) {
// TODO Auto-generated method stub
if(list.get(position).getType() == 10001){
return TYPE_ONE;
}else{
return TYPE_TWO;
}
}
//使用多条目加载时 一共有几种类型
//从写该方法后,listview控件会知道 当前的布局样式不止一种
//所以 当ListView发现convertview在复用时 类型不配不上时 会重写让convertView加载一遍布局
@Override
public int getViewTypeCount() {
// TODO Auto-generated method stub
return 2;
}
@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return null;
}
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder0 holder0 = null;
ViewHolder1 holder1 = null;
int type = getItemViewType(position);
if(convertView == null){
if(type == TYPE_ONE){
convertView = View.inflate(MainActivity.this, R.layout.list_item0, null);
holder0 = new ViewHolder0();
holder0.tv0 = (TextView) convertView.findViewById(R.id.tv0);
convertView.setTag(holder0);
}else{
convertView = View.inflate(MainActivity.this, R.layout.list_item1, null);
holder1 = new ViewHolder1();
holder1.tv1 = (TextView) convertView.findViewById(R.id.tv1);
convertView.setTag(holder1);
}
}else{
if(type == TYPE_ONE){
holder0 = (ViewHolder0) convertView.getTag();
}else{
holder1 = (ViewHolder1) convertView.getTag();
}
}
//根据不同的情况 把进行赋值
if(type == TYPE_ONE){
holder0.tv0.setText(list.get(position).getTitle());
}else{
holder1.tv1.setText(list.get(position).getTitle());
}
return convertView;
}
}
public static class ViewHolder0{
TextView tv0;
}
public static class ViewHolder1{
TextView tv1;
ImageView iv1;
}
}