参考:http://blog.youkuaiyun.com/bill_ming/article/details/8817172
需要了解的知识点:
ViewHolder的作用
convertView是什么
getItemViewType方法
这些知识点可以百度搜索,多看一些人的解释。
实例图如下:
在一个listView中,每行显示一个Item。其中有两种布局格式,一个是只含有一个TextView的,一种是含有两个TextView的。例子很简单。
代码部分:
1、完成三种布局
左边的:
<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="wrap_content" >
<TextView
android:id="@+id/il_tv_left"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:text="XXXXXXXXXXX"/>
</RelativeLayout>
中间的<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="wrap_content" >
<TextView
android:id="@+id/il_tv_middle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:text="XXXXXXXXXXX"/>
<TextView
android:id="@+id/il_tv_tip"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_toLeftOf="@+id/il_tv_middle"
android:textColor="#C0FF3E"
android:textStyle="bold"
android:text="show" />
</RelativeLayout>
右边的<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="wrap_content" >
<TextView
android:id="@+id/il_tv_right"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:text="XXXXXXXXXXX"/>
</RelativeLayout>
每个Item有两个属性,一个是显示的字,一个是所属类型,这里的类型是所处位置
public class StringItem {
private String txt;
private Type type;
public StringItem(String txt,Type type) {
this.txt = txt;
this.type = type;
}
public String getTxt() {
return txt;
}
public void setTxt(String txt) {
this.txt = txt;
}
public Type getType() {
return type;
}
public void setType(Type type) {
this.type = type;
}
public enum Type{
LEFT,MIDDLE,RIGHT
}
}
3、实现适配器的编写
public class StringAdapter extends BaseAdapter {
private List<StringItem> datasItems;
private LayoutInflater mInflater;
private Context mContext;
public StringAdapter(Context mContext,List<StringItem> datas) {
this.mContext = mContext;
this.datasItems = datas;
mInflater = LayoutInflater.from(mContext);
}
@Override
public int getItemViewType(int position) {
if (datasItems.get(position).getType() == Type.LEFT) {
return 0;
} else if (datasItems.get(position).getType() == Type.MIDDLE) {
return 1;
} else {
return 2;
}
}
@Override
public int getCount() {
return datasItems.size();
}
@Override
public Object getItem(int position) {
return datasItems.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder viewHolder = null;
ViewHolderMore viewHolderMore = null;
int type = getItemViewType(position);
//如果没有convertView,new出控件
if(convertView == null ){
if(getItemViewType(position) == 0){
convertView = mInflater.inflate(R.layout.item_left, parent,false);
viewHolder = new ViewHolder();
viewHolder.textView = (TextView)convertView.findViewById(R.id.il_tv_left);
convertView.setTag(viewHolder);
}else if(getItemViewType(position)==1){
convertView = mInflater.inflate(R.layout.item_middle, parent,false);
viewHolderMore = new ViewHolderMore();
viewHolderMore.textView = (TextView)convertView.findViewById(R.id.il_tv_middle);
viewHolderMore.showTV = (TextView)convertView.findViewById(R.id.il_tv_tip);
convertView.setTag(viewHolderMore);
}else {
convertView = mInflater.inflate(R.layout.item_right, parent,false);
viewHolder = new ViewHolder();
viewHolder.textView = (TextView)convertView.findViewById(R.id.il_tv_right);
convertView.setTag(viewHolder);
}
//如果有convertView,按照样式取得不同的布局
}else{
if(getItemViewType(position) == 0 || getItemViewType(position)==2){
viewHolder = (ViewHolder)convertView.getTag();
try {
Log.e("", "getView方法中-------->:(ViewHolder)convertView.getTag()为:" + (ViewHolder)convertView.getTag());
} catch (Exception e) {
e.printStackTrace();
}
}else{
viewHolderMore = (ViewHolderMore)convertView.getTag();
}
}
//根据类型设置显示
switch (type) {
case 0:
viewHolder.textView.setText(datasItems.get(position).getTxt());
break;
case 1:
viewHolderMore.textView.setText(datasItems.get(position).getTxt());
viewHolderMore.showTV.setText("SHOW:");
break;
case 2:
viewHolder.textView.setText(datasItems.get(position).getTxt());
break;
default:
break;
}
return convertView;
}
public static class ViewHolder{
TextView textView;
}
public static class ViewHolderMore{
TextView textView;
TextView showTV;
}
}
4、页面调用public class MainActivity extends ListActivity {
private LayoutInflater mLayoutInflater = null;
private StringAdapter adapter;
private List<StringItem> mDatas = new ArrayList<StringItem>();
private Context mContext;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mLayoutInflater = LayoutInflater.from(this);//初始化界面
mContext = this;
initData();
adapter = new StringAdapter(mContext,mDatas);//初始化适配器,并为其赋值
setListAdapter(adapter);//设置适配器
}
//初始化显示在ListView中的数据
private void initData() {
StringItem item= null;
for(int i = 0;i<20;i++){
if(i%3==0){
item = new StringItem("No"+i, Type.LEFT);
}else if(i%3==1){
item = new StringItem("Mid"+i, Type.MIDDLE);
}else{
item = new StringItem("Last"+i, Type.RIGHT);
}
mDatas.add(item);
}
}
}