Android ListView绑定数据

本文介绍了一种自定义适配器实现List视图的方法,通过继承BaseAdapter并结合具体的业务逻辑,展示了如何将数据绑定到ListView上,并实现了商品信息的展示及删除操作。

List服务一般有4种绑定方法:

本文使用自定义适配器继承BaseAdapter来实现数据绑定,废话不说,直接上代码:

1.自定义适配器:ShoppingProductAdapter

package com.example.msh.ModelInfo.Adapter;

import android.app.Activity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageButton;
import android.widget.TextView;

import com.example.msh.mshaliapp.ProductCartActivity;
import com.example.msh.mshaliapp.R;

import java.util.List;

/**
 * 购物商品Adapter容器数据适配器
 * Author:William(徐威)
 * Create Time:2018-07-25
 */
public class ShoppingProductAdapter extends BaseAdapter {
    //公共对象
    List<ShoppingProductAdapterInfo> productList;
    Activity Con;
    private LayoutInflater mInflater;

    //构造函数
    public ShoppingProductAdapter(Activity context, List<ShoppingProductAdapterInfo> list) {
        this.productList = list;//获取传过来的数据
        this.Con = context;
        this.mInflater =context.getLayoutInflater();  //LayoutInflater.from(context);
    }

    //获取数量
    @Override
    public int getCount() {
        return productList.size();
    }

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

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

    /**
     * 视图标签赋值
     * Author:William(徐威)
     * Create Time:2018-07-25
     */
    @Override
    public View getView(int i, View view, ViewGroup viewGroup) {
        View row = view;
        ShoopingProductWrapper wrapper;
        if (row == null) {
            //我们要适配的控件所在的视图
            row=mInflater.inflate(R.layout.adapter_shopping_product, viewGroup, false);
            wrapper  = new ShoopingProductWrapper(row);
            row.setTag(wrapper);
        } else {
            wrapper = (ShoopingProductWrapper) row.getTag();
        }

        //商品系统号
        TextView ProductSysNo=wrapper.getProductSysNo();
        //商品编号
        TextView ProductID=wrapper.getProductID();
        //商品名称
        TextView ProductName=wrapper.getProductName();
        //商品价格
        TextView Price=wrapper.getPrice();
        //购物数量/单位
        TextView ProductNum=wrapper.getProductNum();
        //商品金额
        TextView ProductAmt=wrapper.getProductAmt();
        //商品序号
        TextView ProductCartNumber=wrapper.getProductCartNumber();

        //设置控件要显示的文字
        ProductSysNo.setText(String.valueOf(productList.get(i).getProductSysNo()));
        ProductID.setText(productList.get(i).getProductID());

        //商品名称切割处理
        String productName = productList.get(i).getProductName();
        if (productName.length() > 17) {
            productName = String.format("%s..", productName.substring(0, 18));
        }
        ProductName.setText(productName);

        Price.setText(productList.get(i).getPrice());
        ProductNum.setText(productList.get(i).getProductNum());
        ProductAmt.setText(productList.get(i).getProductAmt());
        ProductCartNumber.setText(String.valueOf( productList.get(i).getProductCartNumber()));


        //得到listview上的按钮
        ImageButton imgBtnDeleteProduct = row.findViewById(R.id.imgBtnDeleteProduct);
        imgBtnDeleteProduct.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View view) {
                //得到当前父对象
                View list = (View) (view.getParent().getParent());
                //同级的其它对象
                int productSysNo = Integer.parseInt(((TextView) list.findViewById(R.id.tvProductSysNo)).getText().toString());
                ((ProductCartActivity)Con).imgBtnDeleteProduct_listener(productSysNo);
            }
        });


        return row;
    }

    /**
     * 商品购物车Adapter 容器
     * Author:William(徐威)
     * Create Time:2018-07-26
     */
    class ShoopingProductWrapper{

        public  ShoopingProductWrapper(View row){
            this.row = row;
        }

        private View row;

        //商品系统号
        public TextView ProductSysNo;

        //商品编号
        public TextView ProductID;

        //商品名称
        public TextView ProductName;

        //商品价格
        public TextView Price;

        //购物数量/单位
        public TextView ProductNum;

        //商品金额
        public TextView ProductAmt;

        //商品序号
        public TextView ProductCartNumber;

        public TextView getProductSysNo() {
            if (ProductSysNo == null) {
                ProductSysNo = (TextView) row.findViewById(R.id.tvProductSysNo);
            }
            return ProductSysNo;
        }

        public TextView getProductID() {
            if (ProductID == null) {
                ProductID = (TextView) row.findViewById(R.id.tvProductID);
            }
            return ProductID;
        }

        public TextView getProductName() {
            if (ProductName == null) {
                ProductName = (TextView) row.findViewById(R.id.tvProductName);
            }
            return ProductName;
        }

        public TextView getPrice() {
            if (Price == null) {
                Price = (TextView) row.findViewById(R.id.tvPrice);
            }
            return Price;
        }

        public TextView getProductNum() {
            if (ProductNum == null) {
                ProductNum = (TextView) row.findViewById(R.id.tvProductNum);
            }
            return ProductNum;
        }

        public TextView getProductAmt() {
            if (ProductAmt == null) {
                ProductAmt = (TextView) row.findViewById(R.id.tvProductAmt);
            }
            return ProductAmt;
        }

        public TextView getProductCartNumber() {
            if (ProductCartNumber == null) {
                ProductCartNumber = (TextView) row.findViewById(R.id.tvProductCartNumber);
            }
            return ProductCartNumber;
        }
    }
}

2.代码中我使用到的适配器数据实体类:ShoppingProductAdapterInfo 就不具体贴出代码了

/**
* 商品购物车Adapter 实体类
* Author:William(徐威)
* Create Time:2018-07-25
*/
public class ShoppingProductAdapterInfo extends Object implements Serializable {

         //此处不具体申明属性了,仅做参考

}

 

3.Activity页面调用:

//填充购物篮
fillShoppingProduct(false);//此方法是我的业务逻辑方法,大家不用参考,主要调用是下面2句
shoppingAdapter = new ShoppingProductAdapter(this, shoppingCartList);//绑定适配器
lvProductCartList.setAdapter(shoppingAdapter);//设置listview的数据源为adapter
<think>首先,用户的问题是关于Android Studio中ListView数据绑定实现方法。我需要参考提供的引用内容,但用户指出这些引用仅供参考,可能不是直接相关的。不过,我可以从这些引用中提取有用的信息。 回顾引用内容: - 引用[1]:提到Android Studio显示方法列表和ListView实现列表数据显示。 - 引用[2]:展示了一个XML布局文件,用于ListView。 - 引用[3]:涉及自定义适配器实现通讯录设计,包括实体类Person和适配器PersonAdapter。 用户的需求是:在Android Studio中实现ListView数据绑定数据绑定通常指的是将数据源(如数组或列表)绑定ListView上,以便显示数据。 在Android开发中,ListView数据绑定通常通过适配器(Adapter)来实现。适配器负责将数据源中的每个项映射到ListView的每个视图项上。 根据系统级指令: - 使用中文回答。 - 结构清晰,帮助用户逐步解决问题。 - 确保回答真实可靠。 - 在行内数学表达式使用$...$,但这里可能不涉及数学,所以可能不需要。 - 独立公式使用$$...$$,但同样,可能不适用。 - 生成相关问题。 - 在引用的段落末尾添加引用标识,如[^1]。 步骤: 1. **理解需求**:用户想在Android Studio中实现ListView数据绑定。这意味着我需要解释如何设置ListView,创建适配器,并绑定数据。 2. **参考引用**: - 引用[2]显示了XML布局文件,包含ListView。 - 引用[3]提供了实体类Person和自定义适配器的例子。 3. **构建回答**: - **逐步指导**:从创建布局、定义数据模型、创建适配器、到设置适配器。 - **代码示例**:提供简化的代码片段,类似于引用中的例子。 - **确保真实可靠**:基于Android开发标准实践。 4. **添加引用**:如果使用引用中的内容,添加引用标识。例如,提到布局文件时引用[^2],提到适配器时引用[^3]。 5. **生成相关问题**:在回答结束时,添加相关问题部分。 回答结构: - 简介:解释ListView数据绑定的基本概念。 - 步骤: 1. 创建ListView布局。 2. 定义数据模型(实体类)。 3. 创建自定义适配器。 4. 绑定数据ListView。 - 代码示例:提供关键部分的代码。 - 总结。 - §§相关问题§§:列出2-3个相关问题。 现在,生成相关问题: 1. 如何优化ListView的性能? 2. ListView和RecyclerView有什么区别? 3. 如何处理ListView中的点击事件? 确保回答清晰、逐步。</think>### Android Studio ListView 数据绑定实现方法 在 Android Studio 中,ListView数据绑定主要通过**适配器(Adapter)**实现。适配器充当数据源(如数组或列表)和 ListView 视图之间的桥梁,将数据映射到每个列表项上。以下是详细步骤和代码示例,基于标准 Android 开发实践: #### 步骤 1: 创建 ListView 布局文件 在 XML 布局文件中定义 ListView 控件。例如,创建一个 `activity_main.xml` 文件: ```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="match_parent" android:orientation="vertical"> <!-- ListView 控件 --> <ListView android:id="@+id/listView" android:layout_width="match_parent" android:layout_height="match_parent" /> </LinearLayout> ``` 此布局定义了 ListView 的位置和大小[^2]。 #### 步骤 2: 定义数据模型(实体类) 创建一个 Java/Kotlin 类表示数据项。例如,定义一个 `Person` 类存储姓名和头像: ```java // Person.java public class Person { private String name; private int imgId; // 头像资源ID public Person(String name, int imgId) { this.name = name; this.imgId = imgId; } // Getter 方法 public String getName() { return name; } public int getImgId() { return imgId; } } ``` 此类用于存储每个列表项的数据[^3]。 #### 步骤 3: 创建自定义适配器 适配器负责将数据绑定ListView 的每个项。继承 `BaseAdapter` 并实现关键方法: ```java // PersonAdapter.java public class PersonAdapter extends BaseAdapter { private Context context; private List<Person> personList; // 数据源 public PersonAdapter(Context context, List<Person> personList) { this.context = context; this.personList = personList; } @Override public int getCount() { return personList.size(); // 返回数据项总数 } @Override public Object getItem(int position) { return personList.get(position); // 返回指定位置的数据项 } @Override public long getItemId(int position) { return position; // 返回项ID(通常为位置索引) } @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder; if (convertView == null) { // 初始化项布局 convertView = LayoutInflater.from(context).inflate(R.layout.list_item, parent, false); holder = new ViewHolder(); holder.nameView = convertView.findViewById(R.id.textView); holder.imgView = convertView.findViewById(R.id.imageView); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } // 绑定数据到视图 Person person = personList.get(position); holder.nameView.setText(person.getName()); holder.imgView.setImageResource(person.getImgId()); return convertView; } // ViewHolder 优化性能 static class ViewHolder { TextView nameView; ImageView imgView; } } ``` 关键点: - `getView()` 方法将数据映射到视图(使用 `ViewHolder` 减少重复查找视图,提升性能)。 - 需要创建一个项布局文件 `list_item.xml`(见下一步)[^3]。 #### 步骤 4: 创建列表项布局 在 `res/layout/list_item.xml` 中定义单个列表项的视图: ```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/imageView" android:layout_width="50dp" android:layout_height="50dp" android:src="@drawable/ic_launcher" /> <!-- 默认头像 --> <TextView android:id="@+id/textView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="10dp" android:textSize="18sp" /> </LinearLayout> ``` #### 步骤 5: 在 Activity 中绑定数据 在 `MainActivity.java` 中初始化数据、适配器,并设置到 ListView: ```java // MainActivity.java public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 1. 初始化数据源 List<Person> personList = new ArrayList<>(); personList.add(new Person("张三", R.drawable.avatar1)); personList.add(new Person("李四", R.drawable.avatar2)); // 2. 初始化适配器 PersonAdapter adapter = new PersonAdapter(this, personList); // 3. 绑定适配器到 ListView ListView listView = findViewById(R.id.listView); listView.setAdapter(adapter); } } ``` #### 关键说明 - **数据更新**:修改数据源后,调用 `adapter.notifyDataSetChanged()` 刷新列表。 - **性能优化**:使用 `ViewHolder` 模式避免重复调用 `findViewById()`。 - **错误处理**:确保数据源不为 `null`,否则适配器会崩溃。 此方法适用于显示静态或动态数据列表(如通讯录、商品列表),并确保代码真实可靠,基于 Android 官方文档实践[^1][^2][^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值