ListView的多布局是通过重写 getItemViewType(int position)和 getViewTypeCount() 来实现的。
getItemViewType(int position):获取position位置数据的类型。
getViewTypeCount():获取共有几种类型的数据。
实现效果:
我这里是通过ImageView和TextView实现了2种简单的布局,对于复杂的或者是更多的布局效果,实现方法也是类似的。
一、Activity的XML代码
二、Activity代码
public class RecentStudyActivity extends Activity {
private Listlist;
private RecentStydyAdapter adapter;
private ListView listView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_recent_study);
init();
loadData();
}
private void init() {
listView = (ListView) findViewById(R.id.listview_study);
list = new ArrayList<>();
adapter = new RecentStydyAdapter(this, list);
listView.setAdapter(adapter);
}
private void loadData() {
int[] image = {
R.mipmap.ic_today_gaokao,
R.mipmap.ic_yesterday,
R.mipmap.ic_week,
R.mipmap.ic_earlier
};
list.add(image[0]);
list.add("Android高级1");
list.add("Android高级2");
list.add("Android高级3");
list.add("Android高级4");
list.add(image[1]);
list.add("Android基础2");
list.add("Android基础3");
list.add("Android基础4");
list.add(image[2]);
list.add("Android基础1");
list.add(image[3]);
list.add("Java基础1");
list.add("Java基础2");
list.add("Java基础3");
adapter.notifyDataSetChanged();
}
}
三、适配器代码
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;
import java.util.List;
public class RecentStydyAdapter extends BaseAdapter {
private Context context;
private Listlist;
public RecentStydyAdapter(Context context, Listlist) {
this.context = context;
this.list = list;
}
@Override
public int getCount() {
int ret = 0;
if (list != null) {
ret = list.size();
}
return ret;
}
@Override
public int getItemViewType(int position) {
int ret = 0;
Object object = list.get(position);
//通过数据类型的不同类来设置item的类型
if (object instanceof String) {
ret = 0;
} else if (object instanceof Integer) {
ret = 1;
}
return ret;
}
@Override
public int getViewTypeCount() {
return 2;
}
@Override
public Object getItem(int position) {
return list.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
//通过item的类型不同类来设置不同的布局
if (getItemViewType(position) == 0) {
convertView = bindTv(position, convertView, parent);
} else if (getItemViewType(position) == 1) {
convertView = bindImg(position, convertView, parent);
}
return convertView;
}
private View bindImg(int position, View convertView, ViewGroup parent) {
ViewHolder holder = null;
if (convertView == null) {
convertView = LayoutInflater.from(context).inflate(R.layout.item_recent_img, null);
holder = new ViewHolder();
holder.img = (ImageView) convertView.findViewById(R.id.img_recent);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
Object object = list.get(position);
if (object instanceof Integer) {
int img = (int) object;
holder.img.setImageResource(img);
}
return convertView;
}
private View bindTv(int position, View convertView, ViewGroup parent) {
ViewHolder holder = null;
if (convertView == null) {
convertView = LayoutInflater.from(context).inflate(R.layout.item_recent_tv, null);
holder = new ViewHolder();
holder.tv = (TextView) convertView.findViewById(R.id.tv_recent);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
Object object = list.get(position);
if (object instanceof String) {
String ret = (String) object;
holder.tv.setText(ret);
}
return convertView;
}
class ViewHolder {
TextView tv;
ImageView img;
}
}