Android中使用自界说适配器完成对ListView的使用方法,附带可修改模板 ...

张裕  金牌会员 | 2025-1-15 03:06:10 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 677|帖子 677|积分 2031

         本代码使用的Android版本:android-studio-2024.2.1.11-windows        
              本篇文章先介绍自定适配器的如何界说,如何使用,如果赶时间,请直接点击下述目录中项目完备代码部门,可直接跳转:
目录
一、自界说适配器应该如何界说?
二、界说ViewHolder的作用以及用处:
1.setTag(Object tag)方法
2.getTag()方法
三、项目完备代码:
1.Store主页面:
2. ProductAdapter适配器代码:
3.item_commodity模板界面:
四、结语

     本文章仅在基础适配器那一篇博客的基础上,更改了适配器为自定适配器的写法,基础适配器那一片文章博客链接如下:
Android基础的ListView适配器SimpleAdapter的使用方法以及可更改模板----yeyeye的椰子
https://blog.csdn.net/rawmeat/article/details/144249899?spm=1001.2014.3001.5501

实现效果图


一、自界说适配器应该如何界说?

           自界说适配器需要实现一个适配器接口,即BaseAdapter接口,重写其中的getCount()、getItem(int position)、getItemId(int position)、getView(int position,View convertView,ViewGroup parent)方法
  
重写方法
getCount()返回适配器中数据的总数
getItem(int position)根据指定的位置(索引)获取适配器中的数据项。
getItemId(int position)返回指定位置数据项的ID。
getView(int position,View convertView,ViewGroup parent)返回已经填充好数据的视图
        下面为示例自界说适配部门的代码:
  1. package com.example.test03.AllAdapter;
  2. import android.content.Context;
  3. import android.view.LayoutInflater;
  4. import android.view.View;
  5. import android.view.ViewGroup;
  6. import android.widget.BaseAdapter;
  7. import android.widget.ImageView;
  8. import android.widget.TextView;
  9. import com.example.test03.R;
  10. import java.util.List;
  11. import java.util.Map;
  12. public class ProductAdapter extends BaseAdapter {
  13.     private Context context;
  14.     private List<Map<String, Object>> productData;
  15.     private LayoutInflater inflater;
  16.     //初始化
  17.     public ProductAdapter(Context context, List<Map<String, Object>> productData) {
  18.         this.context = context;
  19.         this.productData = productData;
  20.         this.inflater = LayoutInflater.from(context);
  21.     }
  22.     @Override
  23.     public int getCount() {
  24.         //获取数量
  25.         return productData.size();
  26.     }
  27.     @Override
  28.     public Object getItem(int position) {
  29.         //获取对象
  30.         return productData.get(position);
  31.     }
  32.     @Override
  33.     public long getItemId(int position) {
  34.         //获取Item模板
  35.         return position;
  36.     }
  37.     @Override
  38.     public View getView(int position, View convertView, ViewGroup parent) {
  39.         //position是选中的ViewList中list的列中的索引
  40.         //convertView是用于展示在页面中空白item,最后需要返回一个已填充的convertView返回
  41.         //定义一个ViewHolder类
  42.         ViewHolder holder;
  43.         if (convertView == null) {
  44.             //根据获取的item创建一个视图
  45.             convertView = inflater.inflate(R.layout.item_commodity, parent, false);
  46.             //绑定item中的控件到ViewHolder身上
  47.             holder = new ViewHolder();
  48.             holder.productName = convertView.findViewById(R.id.productName);
  49.             holder.productDescription = convertView.findViewById(R.id.productDescription);
  50.             holder.productImage = convertView.findViewById(R.id.productImage);
  51.             convertView.setTag(holder);
  52.         } else {
  53.             //如果已经存在视图
  54.             holder = (ViewHolder) convertView.getTag();
  55.         }
  56.         //根据点击获取的list索引寻找对应的Map
  57.         Map<String, Object> product = productData.get(position);
  58.         //根据Map中的信息,以键找值的形式一一赋值給每一个控件,以做到对控件的数据的填充
  59.         holder.productName.setText((String) product.get("name"));
  60.         holder.productDescription.setText((String) product.get("description"));
  61.         int imageResId = (int) product.get("image"); // 图片资源ID是以整型存储的
  62.         holder.productImage.setImageResource(imageResId);
  63.         return convertView;
  64.     }
  65.     //定义ViewHolder,将item中所有的控件都列一个变量
  66.     private static class ViewHolder {
  67.         TextView productName;
  68.         TextView productDescription;
  69.         ImageView productImage;
  70.     }
  71. }
复制代码

二、界说ViewHolder的作用以及用处:

        下面具体介绍以下关于界说ViewHolder的作用以及目的:
           在列表的每一项(item)中,通常会有多个视图元素(如 TextView、ImageView 等)。如果不使用 ViewHolder,每次滚动到新的列表项时,体系都需要重新通过 findViewById 方法来查找这些视图元素。这是一个非常耗时的操作,特别是在列表项很多或视图元素复杂的环境下。
          使用 ViewHolder 后,每个列表项都会有一个对应的 ViewHolder 对象,该对象在列表项初次被创建时初始化,并缓存了全部视图元素的引用。如许,在滚动到该列表项时,就可以直接通过 ViewHolder 获取视图元素的引用,而无需再次调用 findViewById。
  1.setTag(Object tag)方法

    setTag(Object tag) 方法答应你为视图设置一个标签(Tag),这个标签可以是任何类型的对象。标签通常用于存储与视图相关的额外信息,这些信息在视图的生命周期内大概需要被访问或修改。比方,你大概会在列表项的视图中使用 setTag 存储与该列表项相关的数据对象,以便在后续的点击变乱处理中能够轻松访问这些数据。
  2.getTag()方法

    getTag() 方法用于检索之前通过 setTag(Object tag) 方法设置的标签。如果之前没有为视图设置标签,则 getTag() 方法将返回 null。
  三、项目完备代码:

1.Store主页面:

页面代码:
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3.     xmlns:app="http://schemas.android.com/apk/res-auto"
  4.     xmlns:tools="http://schemas.android.com/tools"
  5.     android:id="@+id/main"
  6.     android:layout_width="match_parent"
  7.     android:layout_height="match_parent"
  8.     android:fitsSystemWindows="true"
  9.     tools:context=".Store">
  10.     <ListView
  11.         android:id="@+id/listView"
  12.         android:layout_width="409dp"
  13.         android:layout_height="729dp"
  14.         tools:layout_editor_absoluteX="1dp"
  15.         tools:layout_editor_absoluteY="1dp"
  16.         tools:ignore="MissingConstraints" />
  17. </androidx.constraintlayout.widget.ConstraintLayout>
复制代码
Java代码:
  1. package com.example.test03;
  2. import android.os.Bundle;
  3. import android.view.View;
  4. import android.widget.AdapterView;
  5. import android.widget.ListView;
  6. import android.widget.SimpleAdapter;
  7. import android.widget.Toast;
  8. import androidx.activity.EdgeToEdge;
  9. import androidx.appcompat.app.AppCompatActivity;
  10. import com.example.test03.AllAdapter.ProductAdapter;
  11. import java.util.ArrayList;
  12. import java.util.HashMap;
  13. import java.util.List;
  14. import java.util.Map;
  15. public class Store extends AppCompatActivity {
  16.     @Override
  17.     protected void onCreate(Bundle savedInstanceState) {
  18.         super.onCreate(savedInstanceState);
  19.         EdgeToEdge.enable(this);
  20.         setContentView(R.layout.activity_store);
  21.         //获取数据
  22.         List<Map<String, Object>> productData = GetDate();
  23. //        //装配适配器
  24. //        SimpleAdapter adapter = new SimpleAdapter(
  25. //                this, // 上下文
  26. //                productData, // 数据源
  27. //                R.layout.item_commodity, // 自定义布局资源 item
  28. //                new String[]{"name", "description", "image"}, // 数据源中的键数组
  29. //                new int[]{R.id.productName, R.id.productDescription, R.id.productImage} // 布局文件中的视图 ID 数组
  30. //        );
  31.         ProductAdapter productAdapter = new ProductAdapter(this,productData);
  32.         ListView listView = findViewById(R.id.listView);
  33.         listView.setAdapter(productAdapter);
  34.         //如果想要得到效果图中的功能的话,需要为他设置一个监听器,如下
  35.         listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
  36.             @Override
  37.             public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
  38.                 // 获取被点击项目的数据
  39.                 Map<String, Object> clickedItem = (Map<String, Object>) parent.getItemAtPosition(position);
  40.                 String productName = (String) clickedItem.get("name");
  41.                 String productDescription = (String) clickedItem.get("description");
  42.                 // 在这里处理点击事件,比如显示一个 Toast 消息
  43.                 Toast.makeText(Store.this, "你点击了 " + productName + "\n" + productDescription, Toast.LENGTH_LONG).show();
  44.             }
  45.         });
  46.     }
  47.     private List<Map<String, Object>> GetDate() {
  48.         List<Map<String, Object>> productData = new ArrayList<>();
  49.         //根据数据源中的键数组来填充数据
  50.         //new String[]{"name", "description", "image"},
  51.         // 创建巧克力商品数据
  52.         Map<String, Object> chocolate = new HashMap<>();
  53.         chocolate.put("name", "巧克力");
  54.         chocolate.put("description", "好吃的巧克力");
  55.         chocolate.put("image", R.drawable.chocolate);
  56.         productData.add(chocolate);
  57.         // 创建薯片商品数据
  58.         Map<String, Object> chips = new HashMap<>();
  59.         chips.put("name", "薯片");
  60.         chips.put("description", "薯片真好吃");
  61.         chips.put("image", R.drawable.chips);
  62.         productData.add(chips);
  63.         // 创建饼干商品数据
  64.         Map<String, Object> cookies = new HashMap<>();
  65.         cookies.put("name", "曲奇");
  66.         cookies.put("description", "哪里有曲奇");
  67.         cookies.put("image", R.drawable.cookies);
  68.         productData.add(cookies);
  69.         // 可以继续添加更多商品数据...
  70.         return productData;
  71.     }
  72. }
复制代码
2. ProductAdapter适配器代码:

  1. package com.example.test03.AllAdapter;
  2. import android.content.Context;
  3. import android.view.LayoutInflater;
  4. import android.view.View;
  5. import android.view.ViewGroup;
  6. import android.widget.BaseAdapter;
  7. import android.widget.ImageView;
  8. import android.widget.TextView;
  9. import com.example.test03.R;
  10. import java.util.List;
  11. import java.util.Map;
  12. public class ProductAdapter extends BaseAdapter {
  13.     private Context context;
  14.     private List<Map<String, Object>> productData;
  15.     private LayoutInflater inflater;
  16.     //初始化
  17.     public ProductAdapter(Context context, List<Map<String, Object>> productData) {
  18.         this.context = context;
  19.         this.productData = productData;
  20.         this.inflater = LayoutInflater.from(context);
  21.     }
  22.     @Override
  23.     public int getCount() {
  24.         //获取数量
  25.         return productData.size();
  26.     }
  27.     @Override
  28.     public Object getItem(int position) {
  29.         //获取对象
  30.         return productData.get(position);
  31.     }
  32.     @Override
  33.     public long getItemId(int position) {
  34.         //获取Item模板
  35.         return position;
  36.     }
  37.     @Override
  38.     public View getView(int position, View convertView, ViewGroup parent) {
  39.         //position是选中的ViewList中list的列中的索引
  40.         //convertView是用于展示在页面中空白item,最后需要返回一个已填充的convertView返回
  41.         //定义一个ViewHolder类
  42.         ViewHolder holder;
  43.         if (convertView == null) {
  44.             //根据获取的item创建一个视图
  45.             convertView = inflater.inflate(R.layout.item_commodity, parent, false);
  46.             //绑定item中的控件到ViewHolder身上
  47.             holder = new ViewHolder();
  48.             holder.productName = convertView.findViewById(R.id.productName);
  49.             holder.productDescription = convertView.findViewById(R.id.productDescription);
  50.             holder.productImage = convertView.findViewById(R.id.productImage);
  51.             convertView.setTag(holder);
  52.         } else {
  53.             //如果已经存在视图
  54.             holder = (ViewHolder) convertView.getTag();
  55.         }
  56.         //根据点击获取的list索引寻找对应的Map
  57.         Map<String, Object> product = productData.get(position);
  58.         //根据Map中的信息,以键找值的形式一一赋值給每一个控件,以做到对控件的数据的填充
  59.         holder.productName.setText((String) product.get("name"));
  60.         holder.productDescription.setText((String) product.get("description"));
  61.         int imageResId = (int) product.get("image"); // 图片资源ID是以整型存储的
  62.         holder.productImage.setImageResource(imageResId);
  63.         return convertView;
  64.     }
  65.     //定义ViewHolder,将item中所有的控件都列一个变量
  66.     private static class ViewHolder {
  67.         TextView productName;
  68.         TextView productDescription;
  69.         ImageView productImage;
  70.     }
  71. }
复制代码
3.item_commodity模板界面:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3.     android:layout_width="match_parent"
  4.     android:layout_height="wrap_content"
  5.     android:orientation="horizontal"
  6.     android:padding="10dp">
  7.     <ImageView
  8.         android:id="@+id/productImage"
  9.         android:layout_width="80dp"
  10.         android:layout_height="80dp"
  11.         android:src="@drawable/ic_launcher_foreground" />
  12.     <LinearLayout
  13.         android:layout_width="0dp"
  14.         android:layout_height="wrap_content"
  15.         android:layout_weight="1"
  16.         android:orientation="vertical"
  17.         android:paddingStart="16dp"
  18.         android:paddingEnd="16dp"
  19.         android:gravity="center_vertical">
  20.         <TextView
  21.             android:id="@+id/productName"
  22.             android:layout_width="wrap_content"
  23.             android:layout_height="wrap_content"
  24.             android:text="商品名"
  25.             android:textSize="18sp"
  26.             android:textColor="@android:color/black" />
  27.         <TextView
  28.             android:id="@+id/productDescription"
  29.             android:layout_width="wrap_content"
  30.             android:layout_height="wrap_content"
  31.             android:text="描述"
  32.             android:textSize="14sp"
  33.             android:textColor="@android:color/darker_gray" />
  34.     </LinearLayout>
  35. </LinearLayout>
复制代码
四、结语

        本账号共为介绍适配器写了4篇文章(包罗本文在内),相信你看完这几篇文章,你基本学会了适配器90%的使用了。其余三篇文章链接如下:
Android基础的ListView适配器SimpleAdapter的使用方法,附带可修改模板
https://blog.csdn.net/rawmeat/article/details/144249899?sharetype=blogdetail&sharerId=144249899&sharerefer=PC&sharesource=rawmeat&spm=1011.2480.3001.8118Android中在自界说适配器中使用多个item展示在ListView中,附带代码实现、框架模板
https://blog.csdn.net/rawmeat/article/details/144284315?spm=1001.2014.3001.5501Android中在适配器中item部门举行监听,并且时时刷新,商品购买为案例
https://blog.csdn.net/rawmeat/article/details/144305330?spm=1001.2014.3001.5501
        本篇文章的分享就到这里了,制作不易,觉得实用的就点个收藏吧!

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

张裕

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表