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;
    }

 

posted @ 2025-05-17 08:21  刘宏缔的架构森林  阅读(30)  评论(0)    收藏  举报