android:baseadapter给listview使用不同的视图布局
一,代码
线上的数据:

activity
package com.example.okdemo1.activity;
import android.graphics.Color;
import android.os.Build;
import android.os.Bundle;
import android.transition.Transition;
import android.transition.TransitionInflater;
import android.view.View;
import android.view.Window;
import android.widget.ListView;
import androidx.activity.EdgeToEdge;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import com.example.okdemo1.R;
import com.example.okdemo1.adapter.UserAdapter;
import com.example.okdemo1.model.UserListEntity;
import com.example.okdemo1.model.UserListItemEntity;
import com.google.gson.Gson;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
public class MylistActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
EdgeToEdge.enable(this);
setContentView(R.layout.activity_mylist);
doGetData();
}
//以get方式访问互联网上的页面,并返回数据
private void doGetData() {
//Toast.makeText(MainActivity.this, "按钮被点击了!", Toast.LENGTH_LONG).show();
//1.创建HttpClient对象
OkHttpClient okHttpClient = new OkHttpClient();
//2.获取request对象
Request.Builder builder = new Request.Builder().url("http://www.test.net/json.php");
Request request = builder.build();
//3.异步请求发起
okHttpClient.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(@NonNull Call call, @NonNull IOException e) {
}
@Override
public void onResponse(@NonNull Call call, @NonNull Response response) throws IOException {
try {
String result = response.body().string();
//解析json到entity对象中
Gson gson = new Gson();
UserListEntity person = gson.fromJson(result, UserListEntity.class);
List<UserListItemEntity> listUser = person.getData().getList();
runOnUiThread(new Runnable() {
@Override
public void run() {
//改用基于baseadapter的写法
MyBaseAdapter myBaseAdapter=new MyBaseAdapter(MylistActivity.this,listUser);
// 将 myBaseAdapter 设置为 ListView 的适配器
ListView listView = findViewById(R.id.list);
listView.setAdapter(myBaseAdapter);
}
});
} catch (IOException e) {
throw new RuntimeException(e);
}
}
});
}
}
MyBaseAdapter.java
package com.example.okdemo1.adapter;
import android.content.Context;
import android.util.Log;
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 com.bumptech.glide.Glide;
import com.bumptech.glide.load.engine.DiskCacheStrategy;
import com.bumptech.glide.request.RequestOptions;
import com.example.okdemo1.model.UserListItemEntity;
import java.util.List;
import com.example.okdemo1.R;
public class MyBaseAdapter extends BaseAdapter {
private Context context;
private LayoutInflater layoutInflater;//得到一个LayoutInfalter对象用来导入布局
private List<UserListItemEntity> list;//得到一个List<App>集合用来导入数据
final int XML_1 = 0;
final int XML_2 = 1;
//构造函数
public MyBaseAdapter(Context context, List<UserListItemEntity> list) {
this.layoutInflater =LayoutInflater.from(context);
this.list = list;
this.context = context;
}
@Override
public int getItemViewType(int position) {
//根据item的位置返回不同的布局,(这里是前两个返回XML1布局)
//取出item对象
UserListItemEntity user=this.list.get(position);
if(user.getId() == 2){
return XML_1;
}else {
return XML_2;
}
}
@Override
public int getViewTypeCount() {
// TODO Auto-generated method stub
return 2;
}
@Override
//return 多少就有个多少个item列表
public int getCount() {//返回ListView Item条目的总数
return list.size();
}
@Override
public Object getItem(int position) {//返回ListView Item条目代表的对象
return list.get(position);
}
@Override
public long getItemId(int position) {//返回ListView Item的id
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder = null;
ViewHolderBig holderBig = null;
//获取当前的类型
int type = getItemViewType(position);
UserListItemEntity user = this.list.get(position);
if (convertView == null) {
if (type == XML_1) {
//绑定Item布局
convertView = layoutInflater.inflate(R.layout.item_user_big, null, false);
//自定义内部类,对象holder用来存储文字和图片控件
holderBig = new ViewHolderBig();
holderBig.nameTextView = (TextView) convertView.findViewById(R.id.userName);
holderBig.idTextView = (TextView) convertView.findViewById(R.id.userId);
holderBig.imageView = (ImageView) convertView.findViewById(R.id.userImage);
//将holder放入当前视图中
convertView.setTag(holderBig);
} else {
//绑定Item布局
convertView = layoutInflater.inflate(R.layout.item_user, null, false);
//自定义内部类,对象holder用来存储文字和图片控件
holder = new ViewHolder();
holder.nameTextView = (TextView) convertView.findViewById(R.id.userName);
holder.idTextView = (TextView) convertView.findViewById(R.id.userId);
holder.imageView = (ImageView) convertView.findViewById(R.id.userImage);
//将holder放入当前视图中
convertView.setTag(holder);
}
} else {
//复用holder
if (type == XML_1) {
holderBig = (ViewHolderBig) convertView.getTag();
} else {
holder = (ViewHolder) convertView.getTag();
}
}
if (type == XML_1) {
//图片显示中间部分
RequestOptions options = RequestOptions.centerCropTransform();
holderBig.nameTextView.setText(user.getName());
holderBig.idTextView.setText(String.valueOf(user.getId()));
//设置图片
Glide.with(this.context)
.load(user.getImage())
.apply(options)
.diskCacheStrategy(DiskCacheStrategy.ALL) // 缓存原始图片和转换后的图片到磁盘
.skipMemoryCache(false) // 不跳过内存缓存
.into(holderBig.imageView);
} else {
//图片缩放显示
RequestOptions options = RequestOptions.fitCenterTransform();
holder.nameTextView.setText(user.getName());
holder.idTextView.setText(String.valueOf(user.getId()));
//设置图片
Glide.with(this.context)
.load(user.getImage())
.apply(options)
.diskCacheStrategy(DiskCacheStrategy.ALL) // 缓存原始图片和转换后的图片到磁盘
.skipMemoryCache(false) // 不跳过内存缓存
.into(holder.imageView);
}
return convertView;
}
//内部类
class ViewHolder {
TextView idTextView;
TextView nameTextView;
ImageView imageView;
}
class ViewHolderBig {
TextView idTextView;
TextView nameTextView;
ImageView imageView;
}
}
单条内容对应的xml
item_user.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:padding="10dp">
<ImageView
android:id="@+id/userImage"
android:layout_width="80dp"
android:layout_height="80dp"
android:src="@drawable/ic_launcher_foreground" />
<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:orientation="vertical"
android:paddingStart="16dp"
android:paddingEnd="16dp"
android:gravity="center_vertical">
<TextView
android:id="@+id/userId"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="商品名"
android:textSize="18sp"
android:textColor="@android:color/black" />
<TextView
android:id="@+id/userName"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="描述"
android:textSize="14sp"
android:textColor="@android:color/darker_gray" />
</LinearLayout>
</LinearLayout>
item_user_big.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:padding="10dp">
<ImageView
android:id="@+id/userImage"
android:layout_width="160dp"
android:layout_height="160dp"
android:src="@drawable/ic_launcher_foreground" />
<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:orientation="vertical"
android:paddingStart="16dp"
android:paddingEnd="16dp"
android:gravity="center_vertical">
<TextView
android:id="@+id/userId"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="商品名"
android:textSize="18sp"
android:textColor="@android:color/black" />
<TextView
android:id="@+id/userName"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="描述"
android:textSize="14sp"
android:textColor="@android:color/darker_gray" />
</LinearLayout>
</LinearLayout>
model:
package com.example.okdemo1.model;
public class UserListItemEntity {
private int id;
private String name;
private String image;
public UserListItemEntity(int id, String name) {
this.id = id;
this.name = name;
this.image = image;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getImage() {
return image;
}
public void setImage(String image) {
this.image = image;
}
}
二,测试效果

三,说明:
在baseadapter中增加的代码是关键:
@Override
public int getItemViewType(int position) {
//取出item对象
UserListItemEntity user=this.list.get(position);
//根据item的id返回不同的布局
if(user.getId() == 2){
return XML_1;
}else {
return XML_2;
}
}
@Override
public int getViewTypeCount() {
// TODO Auto-generated method stub
return 2;
}
浙公网安备 33010602011771号