android listview 两种布局,android listview显示不同的布局(其中需要注意的问题)

直接贴代码//这个接口是用来标志类型的

public interface IType {

public static final int TYPE_1 = 0;

public static final int TYPE_2 = 1;

public int getType();

}

//类型1的model

public class Type1 implements IType {

private String text;

private int imageId;

public Type1() {

}

public Type1(String text, int imageId) {

this.text = text;

this.imageId = imageId;

}

public String getText() {

return text;

}

public void setText(String text) {

this.text = text;

}

public int getImageId() {

return imageId;

}

public void setImageId(int imageId) {

this.imageId = imageId;

}

@Override

public int getType() {

return IType.TYPE_1;

}

}

//类型2的model

public class Type2 implements IType {

private String btnStr;

private String etStr;

private int imageId;

public Type2() {

}

public Type2(String btnStr, String etStr, int imageId) {

this.btnStr = btnStr;

this.etStr = etStr;

this.imageId = imageId;

}

public String getBtnStr() {

return btnStr;

}

public void setBtnStr(String btnStr) {

this.btnStr = btnStr;

}

public String getEtStr() {

return etStr;

}

public void setEtStr(String etStr) {

this.etStr = etStr;

}

public int getImageId() {

return imageId;

}

public void setImageId(int imageId) {

this.imageId = imageId;

}

@Override

public int getType() {

return IType.TYPE_2;

}

}

//listview的adapter

public class MultipleAdapter extends BaseAdapter {

private LayoutInflater inflater;

private List types;

public MultipleAdapter(Context context, List types) {

inflater = LayoutInflater.from(context);

this.types = types;

}

@Override

public int getCount() {

return types == null ? 0 : types.size();

}

@Override

public Object getItem(int position) {

return types == null ? null : types.get(position);

}

@Override

public long getItemId(int position) {

return position;

}

@Override

public int getItemViewType(int position) {

return types.get(position).getType();

}

@Override

public int getViewTypeCount() {

return 2;//这里的返回值必须是类型最大数大1,为什么

}

@Override

public View getView(int position, View convertView, ViewGroup parent) {

ViewHolder1 holder1 = null;

ViewHolder2 holder2 = null;

int type = getItemViewType(position);

if (convertView == null) {

if (type == IType.TYPE_1) {

holder1 = new ViewHolder1();

convertView = inflater.inflate(R.layout.adapter_1, null);

holder1.tv = (TextView) convertView.findViewById(R.id.tv);

holder1.iv = (ImageView) convertView.findViewById(R.id.iv);

convertView.setTag(holder1);

} else if (type == IType.TYPE_2) {

holder2 = new ViewHolder2();

convertView = inflater.inflate(R.layout.adapter_2, null);

holder2.btn = (Button) convertView.findViewById(R.id.btn);

holder2.et = (EditText) convertView.findViewById(R.id.et);

holder2.iv = (ImageView) convertView.findViewById(R.id.iv);

convertView.setTag(holder2);

}

} else {

if (type == IType.TYPE_1) {

holder1 = (ViewHolder1) convertView.getTag();

} else {

holder2 = (ViewHolder2) convertView.getTag();

}

}

// 赋值

if (type == IType.TYPE_1) {

Type1 t = (Type1) types.get(position);

holder1.tv.setText(t.getText());

} else {

Type2 t = (Type2) types.get(position);

holder2.btn.setText(t.getBtnStr());

holder2.et.setText(t.getEtStr());

}

return convertView;

}

class ViewHolder1 {

TextView tv;

ImageView iv;

}

class ViewHolder2 {

Button btn;

EditText et;

ImageView iv;

}

}

//R.layout.adapter_1

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:orientation="horizontal" >

android:id="@+id/tv"

android:layout_width="100dp"

android:layout_height="40dp"

android:text="aaaa" />

android:id="@+id/iv"

android:layout_width="40dp"

android:layout_height="40dp"

android:layout_gravity="right|center_vertical"

android:layout_margin="10dp"

android:class="lazyload" src="https://img-blog.csdnimg.cn/2022010616564930480.png" data-original="@drawable/ic_launcher" />

//R.layout.adapter_2

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:orientation="horizontal" >

android:id="@+id/btn"

android:layout_width="80dp"

android:layout_height="wrap_content"

android:text="btn" />

android:id="@+id/et"

android:layout_width="100dp"

android:layout_height="wrap_content" />

android:id="@+id/iv"

android:layout_width="40dp"

android:layout_height="40dp"

android:layout_gravity="right|center_vertical"

android:layout_margin="10dp"

android:class="lazyload" src="https://img-blog.csdnimg.cn/2022010616564930480.png" data-original="@drawable/ic_launcher" />

//主界面-- 就只有一个listview

public class MainActivity extends Activity {

private ListView lv;

private List types;

private MultipleAdapter adapter;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

lv = (ListView) findViewById(R.id.lv);

dataInit();

adapter = new MultipleAdapter(MainActivity.this, types);

lv.setAdapter(adapter);

}

private void dataInit() {

types = new ArrayList();

Type1 type1_1 = new Type1("type1_1", R.drawable.ic_launcher);

Type2 type2_1 = new Type2("type2_1", "type2_1", R.drawable.ic_launcher);

Type1 type1_2 = new Type1("type1_2", R.drawable.ic_launcher);

Type2 type2_2 = new Type2("type2_2", "type2_2", R.drawable.ic_launcher);

Type1 type1_3 = new Type1("type1_3", R.drawable.ic_launcher);

Type1 type1_4 = new Type1("type1_4", R.drawable.ic_launcher);

Type1 type1_6 = new Type1("type1_6", R.drawable.ic_launcher);

Type2 type2_3 = new Type2("type2_3", "type2_3", R.drawable.ic_launcher);

Type2 type2_4 = new Type2("type2_4", "type2_4", R.drawable.ic_launcher);

Type2 type2_5 = new Type2("type2_5", "type2_5", R.drawable.ic_launcher);

Type2 type2_6 = new Type2("type2_6", "type2_6", R.drawable.ic_launcher);

Type1 type1_5 = new Type1("type1_5", R.drawable.ic_launcher);

types.add(type1_1);

types.add(type2_1);

types.add(type1_2);

types.add(type2_2);

types.add(type1_3);

types.add(type1_4);

types.add(type1_6);

types.add(type2_3);

types.add(type2_4);

types.add(type2_5);

types.add(type2_6);

types.add(type1_5);

}

}

//效果是能实现的,但是有个问题,没搞清楚原因,希望知道原因的朋友解释下。问题如下: //比如我的IType接口改成如下这样。

public interface IType { public static final int TYPE_1 = 0; public static final int TYPE_2 = 22;//注意,这里改成22了 public int getType(); }

/那么在adapter里面的getViewTypeCount()方法必须返回23(即是22+1),不然就会报错,但是事实上我们就只有Type类型就只有两个。 //希望用的朋友注意下,知道原因的朋友告知下。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值