关于Android开发中RecyclerView空间的一些技巧问题

本文介绍了在使用RecyclerView时,为避免页面闪烁和保持正确位置,应通过设置`setData`方法更新数据而不是直接在适配器构造中传递。文中展示了如何在购物车适配器中实现这一最佳实践,包括数据绑定、点击事件处理和删除操作。适配器还实现了接口以监听选中状态变化,确保购物车总价的实时更新。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在使用RecyclerView空间做列表的时候,大多数时候,不要在创建适配器的时候直接把数据传过去,最好设置一个setData的方法进行传值,这样以后在数据变动的时候,直接更新数据就好了,这样页面不会闪烁,位置也依然还在刷新前的位置

package com.enjoyshop.adapter;

import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.CheckBox;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;

import com.apkfuns.logutils.LogUtils;
import com.enjoyshop.EnjoyshopApplication;
import com.enjoyshop.R;
import com.enjoyshop.bean.ShoppingCart;
import com.enjoyshop.fragment.ShopCartFragment;
import com.enjoyshop.utils.GlideUtils;
import com.enjoyshop.widget.NumberAddSubView;

import java.util.List;

/**
 * Created by kevin_cyj
 * Time  2021/1/21
 * Describe: 购物车的适配器
 */

public class ShopCartAdapter extends RecyclerView.Adapter<ShopCartAdapter.ViewHolder> {

    private Context            mContext;
    private List<ShoppingCart> mDatas;
    private CheckItemListener  mCheckListener;
    private ShopCartFragment shopCartFragment;

    public ShopCartAdapter(Context mContext, CheckItemListener mCheckListener, ShopCartFragment shopCartFragment) {
        this.mContext = mContext;
        this.mCheckListener = mCheckListener;
        this.shopCartFragment = shopCartFragment;
    }

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(mContext).inflate(R.layout.template_cart, parent, false);
        ViewHolder viewHolder = new ViewHolder(view);
        return viewHolder;
    }

    @Override
    public void onBindViewHolder(final ViewHolder holder, final int position) {
        final ShoppingCart cart = mDatas.get(position);


        holder.mTvTitle.setText(cart.getGoodsName());
        holder.mTvPrice.setText("¥" + cart.getPrice());
        holder.mNumberAddSubView.setValue(cart.getCount());
        GlideUtils.load(EnjoyshopApplication.sContext, cart.getImgUrl(), holder.mIvLogo);

        holder.mNumberAddSubView.setOnButtonClickListener(new NumberAddSubView.OnButtonClickListener() {
            @Override
            public void onButtonAddClick(View view, int value) {
                cart.setCount(value);
                shopCartFragment.updateCar(cart);
                ((ShopCartFragment)mCheckListener).showTotalPrice();
            }

            @Override
            public void onButtonSubClick(View view, int value) {
                cart.setCount(value);
                shopCartFragment.updateCar(cart);
                ((ShopCartFragment)mCheckListener).showTotalPrice();
            }
        });

//        删除按钮操作事件
        holder.deletedIconBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                shopCartFragment.deletedCar(cart);
            }
        });

    }

    @Override
    public int getItemCount() {
        return mDatas.size();
    }


    /**
     * 设置列表的值
     * @param data
     */
    public void setData(List<ShoppingCart> data) {
        this.mDatas = data;
    }

    public class ViewHolder extends RecyclerView.ViewHolder {

        private LinearLayout     mLlContent;
        private TextView         mTvTitle;
        private TextView         mTvPrice;
        private CheckBox         mCheckBox;
        private ImageView        mIvLogo;
        private NumberAddSubView mNumberAddSubView;
        private ImageView deletedIconBtn;

        public ViewHolder(View itemView) {
            super(itemView);
            mLlContent = itemView.findViewById(R.id.ll_item);
            mCheckBox = itemView.findViewById(R.id.checkbox);
            mIvLogo = itemView.findViewById(R.id.iv_view);
            mTvTitle = itemView.findViewById(R.id.text_title);
            mTvPrice = itemView.findViewById(R.id.text_price);
            mNumberAddSubView = itemView.findViewById(R.id.num_control);
            deletedIconBtn = itemView.findViewById(R.id.deleted_icon_btn);
        }
    }

    public interface CheckItemListener {

        void itemChecked(ShoppingCart checkBean, boolean isChecked);
    }
}

调用时候这样用

        mAdapter.setData(dataArray);
        mAdapter.notifyDataSetChanged();

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值