您的位置:首页 > 移动开发 > Android开发

android中如何让listview的item是多种布局

2014-10-13 11:05 260 查看
下面先看一下效果图:



实现的原理:

1.有几个item的样式,就创建几个ViewHolder,上图是三个item的样式。

2.然后在adapter中的   public int  getViewTypeCount() 方法中返回有几种item View的样式。

3.在getItemViewType中判断第几个item显示第几种样式

 // 每个convert view都会调用此方法,获得当前所需要的view样式  

        @Override  

        public int getItemViewType(int position) {  

            int p = position;  

            if (p %3==0)  

                return TYPE_1;  

            else if (p %3==1)  

                return TYPE_2;  

            else  

                return TYPE_3;  

        }  

 4.在getView方法中,调用    getItemViewType 方法,根据结果做switch判断。item显示相应的View

上面的语言有些不严谨,还望见谅。

下面直接贴代码:

MainActivity.java

package com.example.listviewitem;

import java.util.ArrayList;

import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;

public class MainActivity extends Activity {
private ArrayList<String> list;
private ListView listView;
ListViewAdapter listViewAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
list=new ArrayList<String>();
for(int i=0;i<20;i++){
list.add(i+"");
}
listView=(ListView) findViewById(R.id.listviewId);
listViewAdapter=new ListViewAdapter(this, list);
listView.setAdapter(listViewAdapter);
}

class ListViewAdapter extends BaseAdapter {
ArrayList<String> ls;
Context mContext;
LayoutInflater inflater;
//定义三种样式的标志位。
final int TYPE_1 = 0;
final int TYPE_2 = 1;
final int TYPE_3 = 2;

public ListViewAdapter(Context context,
ArrayList<String> list) {
ls = list;
mContext = context;
}

@Override
public int getCount() {
return ls.size();
}

@Override
public Object getItem(int position) {
return ls.get(position);
}

@Override
public long getItemId(int position) {
return 0;
}

// 每个convert view都会调用此方法,获得当前所需要的view样式
@Override
public int getItemViewType(int position) {
int p = position;
if (p %3==0)
return TYPE_1;
else if (p %3==1)
return TYPE_2;
else
return TYPE_3;
}

@Override
public int getViewTypeCount() {
return 3;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder1 holder1 = null;
ViewHolder2 holder2 = null;
ViewHolder3 holder3 = null;
int type = getItemViewType(position);
if (convertView == null) {
inflater = LayoutInflater.from(mContext);
// 按当前所需的样式,确定new的布局
switch (type) {
case TYPE_1:

convertView = inflater.inflate(R.layout.item1,
parent, false);
holder1 = new ViewHolder1();
holder1.rank1 = (TextView) convertView
.findViewById(R.id.item1_textview);
convertView.setTag(holder1);
break;
case TYPE_2:
convertView = inflater.inflate(R.layout.item2,
parent, false);
holder2 = new ViewHolder2();
holder2.rank2 = (Button) convertView
.findViewById(R.id.item2_button);
//为了使item可以被点击,所有设置button不获取焦点。
holder2.rank2.setFocusable(false);
convertView.setTag(holder2);
break;
case TYPE_3:
convertView = inflater.inflate(R.layout.item3,
parent, false);
holder3 = new ViewHolder3();
holder3.rank3 = (ImageView) convertView
.findViewById(R.id.item3_imageview);
convertView.setTag(holder3);
break;
default:
break;
}

} else {
switch (type) {
case TYPE_1:
holder1 = (ViewHolder1) convertView.getTag();
break;
case TYPE_2:
holder2 = (ViewHolder2) convertView.getTag();
break;
case TYPE_3:
holder3 = (ViewHolder3) convertView.getTag();
break;
}
}
// 设置资源
switch (type) {
case TYPE_1:
holder1.rank1.setText("textview" + (position + 1));
break;
case TYPE_2:
holder2.rank2.setText("button" + (position + 1));
break;
case TYPE_3:
holder3.rank3.setImageResource(R.drawable.ic_launcher);
break;
}

return convertView;
}
//声明三个viewHolder类。分别是三个item布局的view
public class ViewHolder1 {
TextView rank1;
}

public class ViewHolder2 {
Button rank2;
}

public class ViewHolder3 {
ImageView rank3;
}

}

}


布局文件:activity_main.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"
tools:context=".MainActivity" >

<ListView
android:id="@+id/listviewId"
android:layout_width="match_parent"
android:layout_height="match_parent" />

</RelativeLayout>

listview的item布局文件
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"
tools:context=".MainActivity" >

<TextView
android:id="@+id/item1_textview"
android:layout_width="wrap_content"
android:layout_height="50dp"
android:gravity="center_vertical"
android:textSize="25sp"
android:text="@string/hello_world" />

</RelativeLayout>


item2.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"
tools:context=".MainActivity" >

<Button
android:id="@+id/item2_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>

</RelativeLayout>


item3.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"
tools:context=".MainActivity" >

<ImageView
android:id="@+id/item3_imageview"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>

</RelativeLayout>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息