使用recycleview实现item多布局踩的坑

RecycleView 实现复杂首页布局三种方式 RecycleView 实现复杂首页布局三种方式:嵌套、自定义布局管理器、三方控件。实现效果如淘宝,美团,bilibili等 立即下载

关于使用recycleview写多种布局布局遇到的坑

最近项目中遇到多种布局嵌套使用情况,为了不多麻烦去写自定义控件监听事件的分发,便使用了recycleview.对于第一次在项目中使用这个玩意,在看过官方文档后并不是很理解其介绍(主要是全英文),于是乎在优快云怼了个中文注解的示例demo来用,于是乎就有了下面的这个问题.

1. 首先看原型图

 

2. 服务器返回的数据

 

3.代码部分.

Activity:

package com.example.administrator.a3dmark.detail_shop;

import android.app.ProgressDialog;
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.View;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;

import com.example.administrator.a3dmark.Activity.BaseActivity;
import com.example.administrator.a3dmark.R;
import com.example.administrator.a3dmark.adapter.ShopAdapter;
import com.example.administrator.a3dmark.bean.Banners;
import com.example.administrator.a3dmark.bean.ShopGoods;
import com.example.administrator.a3dmark.util.Contants;
import com.example.administrator.a3dmark.util.ItemDivider;
import com.example.administrator.a3dmark.util.SharedUtil;
import com.lzy.okgo.OkGo;
import com.lzy.okgo.callback.StringCallback;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.util.ArrayList;

import butterknife.BindView;
import butterknife.ButterKnife;
import okhttp3.Call;
import okhttp3.Response;

/**
 * 店铺
 * Created by Administrator on 2017/3/8.
 */
public class Shop_Activity extends BaseActivity {

    @BindView(R.id.image_title_white_back)
    ImageView imageTitleWhiteBack;
    @BindView(R.id.tv_title_white)
    TextView tvTitleWhite;
    @BindView(R.id.tv_title_white_vice)
    TextView tvTitleWhiteVice;
    Intent intent;
    @BindView(R.id.tv_collection_title)
    TextView tvCollectionTitle;
    @BindView(R.id.tv_title_num)
    TextView tvTitleNum;
    @BindView(R.id.ll_title)
    LinearLayout llTitle;
    @BindView(R.id.recyclerView)
    RecyclerView recyclerView;


    private String bussiness_id;
    private String userid;

    //轮播图List<bean>对象
    private ArrayList<Banners> Flybanners = new ArrayList<>();
    //商品List<bean>对象
    private ArrayList<ShopGoods> goodses = new ArrayList<ShopGoods>();

    private ShopAdapter adapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.shop_activity);
        ButterKnife.bind(this);
        intent = getIntent();
        bussiness_id = intent.getStringExtra("bussiness_id");
        Toast.makeText(Shop_Activity.this, bussiness_id, Toast.LENGTH_SHORT).show();
        userid = (String) SharedUtil.getParam(this, "userid", "");
        llTitle.setVisibility(View.VISIBLE);

        recyclerView.setLayoutManager(new GridLayoutManager(recyclerView.getContext(), 3, GridLayoutManager.VERTICAL, false));
        recyclerView.addItemDecoration(new ItemDivider().setDividerWith(this, 20));
        adapter = new ShopAdapter(Shop_Activity.this);
        initGradData();
        recyclerView.setAdapter(adapter);
        adapter.setOnItemClickListener(new ShopAdapter.OnRecyclerViewItemClickListener() {
            @Override
            public void onItemClick(View view) {
                int position = recyclerView.getChildAdapterPosition(view);
                startActivity(new Intent(Shop_Activity.this, Boutique_Detail.class)
                        .putExtra("goods_id", goodses.get(position).getId())
                        .setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP)
                );
            }
        });

        imageTitleWhiteBack.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                finish();
            }
        });

    }

    //商品接口
    private void initGradData() {
        final ProgressDialog mDialog = ProgressDialog.show(this, "获取数据", "获取数据中");
        OkGo.post(Contants.DTORE)
                .params("bussinessId", bussiness_id)
                .execute(new StringCallback() {
                    @Override
                    public void onSuccess(String s, Call call, Response response) {
                        Log.d("code===initGradData", s);
                        mDialog.dismiss();
                        try {
                            JSONObject json = new JSONObject(s);
                            if (s.indexOf("error") != -1) {//有错误
                                Toast.makeText(Shop_Activity.this, json.getString("error"), Toast.LENGTH_SHORT).show();
                                return;
                            }

                            JSONObject success = json.getJSONObject("success");
                            tvTitleWhite.setText(success.getString("shopName"));
                            tvTitleNum.setText("店铺号:" + success.getString("introduce"));

                            JSONArray info = success.getJSONArray("goodsInfoArray");
                            for (int i = 0; i < info.length(); i++) {
                                JSONObject obj = info.getJSONObject(i);
                                ShopGoods shopgoods = new ShopGoods();
                                shopgoods.setGoodsname(obj.getString("goodsName"));
                                shopgoods.setId(obj.getString("goodsId"));
                                shopgoods.setImages(obj.getString("img"));
                                shopgoods.setPricenow(obj.getString("priceNow"));
                                goodses.add(shopgoods);
                            }
                            adapter.setGoods(goodses);
                            JSONArray showPage = success.getJSONArray("showPage");
                            for (int j = 0; j < showPage.length(); j++) {
                                JSONObject page = info.getJSONObject(j);
                                Banners banners = new Banners();
                                //banners.setId(page.getString("id"));
                                banners.setImg(page.getString("img"));
                                Flybanners.add(banners);
                            }
                            adapter.setFlybanners(Flybanners);
                            adapter.notifyDataSetChanged();

                        } catch (JSONException e) {
                            e.printStackTrace();
                        }
                    }

                    @Override
                    public void onError(Call call, Response response, Exception e) {
                        super.onError(call, response, e);
                        mDialog.dismiss();
                        Toast.makeText(Shop_Activity.this, e.toString(), Toast.LENGTH_LONG).show();
                    }
                });
    }
}

Adapter:

package com.example.administrator.a3dmark.adapter;

import android.content.Context;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;

import com.bumptech.glide.Glide;
import com.example.administrator.a3dmark.R;
import com.example.administrator.a3dmark.bean.Banners;
import com.example.administrator.a3dmark.bean.ShopGoods;
import com.recker.flybanner.FlyBanner;

import java.util.ArrayList;
import java.util.List;

/**
 * Created by Administrator on 2017/3/8.
 */
public class ShopAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
    private Context context;

    //轮播图List<bean>对象
    private ArrayList<Banners> Flybanners;
    //商品List<bean>对象
    private ArrayList<ShopGoods> goods;


    //type
    public static final int TYPE_1 = 0xff0111;
    public static final int TYPE_MAIN = 0xffffff;

    public ShopAdapter(Context context) {
        this.context = context;
        Flybanners = new ArrayList<>();
        goods = new ArrayList<>();
    }


    public ArrayList<Banners> getFlybanners() {
        return Flybanners;
    }

    public void setFlybanners(ArrayList<Banners> flybanners) {
        Flybanners = flybanners;
    }

    public List<ShopGoods> getGoods() {
        return goods;
    }

    public void setGoods(ArrayList<ShopGoods> goods) {
        this.goods = goods;
    }

    //自定义监听事件
    public static interface OnRecyclerViewItemClickListener {
        void onItemClick(View view);
        //void onItemLongClick(View view);
    }
    //监听接口
    private ShopAdapter.OnRecyclerViewItemClickListener mOnItemClickListener = null;
    //监听实现
    public void setOnItemClickListener(ShopAdapter.OnRecyclerViewItemClickListener listener) {
        mOnItemClickListener = listener;
    }



    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        switch (viewType){
            case TYPE_1:
                return new ShopAdapter.MyViewHolder1(LayoutInflater.from(parent.getContext()).inflate(R.layout.md_recycle_item_type1, parent, false));
            case TYPE_MAIN:
                View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_shop_typemain, parent, false);
                view.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                        if (mOnItemClickListener != null) {
                            mOnItemClickListener.onItemClick(view);
                        }
                    }
                });
                return new ShopAdapter.MyViewHolderMain(view);
            default:
                Log.d("error","viewholder is null");
                return null;
        }
    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
        if (holder instanceof ShopAdapter.MyViewHolder1){
            bindType1((ShopAdapter.MyViewHolder1) holder, position);
        }else if (holder instanceof ShopAdapter.MyViewHolderMain){
            bindTypeMain((ShopAdapter.MyViewHolderMain) holder, position);
        }
    }


    /**
     * Main RecyclerView getItemCount
     * @return
     */
    @Override
    public int getItemCount() {
        return getGoods().size();
    }

    @Override
    public int getItemViewType(int position) {
        if (position == 0){
            return TYPE_1;
        }else {
            return TYPE_MAIN;
        }
    }


    @Override
    public void onAttachedToRecyclerView(RecyclerView recyclerView) {
        super.onAttachedToRecyclerView(recyclerView);

        RecyclerView.LayoutManager manager = recyclerView.getLayoutManager();
        if(manager instanceof GridLayoutManager) {
            final GridLayoutManager gridManager = ((GridLayoutManager) manager);
            gridManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
                @Override
                public int getSpanSize(int position) {
                    int type = getItemViewType(position);
                    switch (type){
                        case TYPE_1:
                            return gridManager.getSpanCount();
                        default:
                            return 1;
                    }
                }
            });
        }
    }


    private void bindType1(ShopAdapter.MyViewHolder1 holder, int position){
        //轮播图URL
        ArrayList<String> ImagesUrl = new ArrayList();

        if (getFlybanners().size() != 0) {
            for (Banners flyBanners : getFlybanners()) {
                ImagesUrl.add(flyBanners.getImg());
            }
            holder.flyBanner.setImagesUrl(ImagesUrl);
        }

        holder.flyBanner.setOnItemClickListener(new FlyBanner.OnItemClickListener() {
            @Override
            public void onItemClick(int position) {
// Intent intent = new Intent(context, Boutique_Detail.class);
// intent.putExtra("goods_id", Flybanners.get(position).getId());
// context.startActivity(intent);
            }
        });

    }


    private void bindTypeMain(ShopAdapter.MyViewHolderMain holder, int position){
        Glide.with(context).load(getGoods().get(position).getImages()).fitCenter().placeholder(R.drawable.icon_empty).into(holder.img);
        holder.textprice.setText(getGoods().get(position).getPricenow());
        holder.name.setText(getGoods().get(position).getGoodsname());
        holder.buy.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //去试衣间
            }
        });
    }


    public class MyViewHolder1 extends RecyclerView.ViewHolder {
        public FlyBanner flyBanner;

        public MyViewHolder1(View itemView) {
            super(itemView);
            flyBanner = (FlyBanner) itemView.findViewById(R.id.banner);
        }
    }

    public class MyViewHolderMain extends RecyclerView.ViewHolder {
        public ImageView img;//商品图片
        public TextView name;//商品简介
        public TextView textprice;//商品价格
        public TextView buy;//立即购买

        public MyViewHolderMain(final View itemView) {
            super(itemView);
            img = (ImageView) itemView.findViewById(R.id.img);
            name = (TextView) itemView.findViewById(R.id.name);
            textprice = (TextView) itemView.findViewById(R.id.price);
            buy = (Button) itemView.findViewById(R.id.buy);
        }
    }
}

问题:

在运行项目后,服务器明明返回给了一个如下红色方框标记的商品数据,而却没有显示出来.

细挖代码后发现,是如下代码位置出了问题.

/**
     * Main RecyclerView getItemCount
     * @return
     */
    @Override
    public intgetItemCount() {
        return getGoods().size();
    }

@Override
    public intgetItemViewType(int position) {
        if (position == 0){
            return TYPE_1;
        }else {
            return TYPE_MAIN;
        }
    }

当getItemCount的值return的是getGoods().size();

而getItemViewType的position == 0时加载了另一个布局,

这”另一个布局”作为了getItemCount的一个item而正好

getGoods().size()为1,也就是position == 0.

就出现了本该有的一个商品却没有显示,使数据出现丢失的情况.

理所当然getItemCount应该返回returngetGoods().size()+1;

而当我重新运行项目竟然报错 java.lang.IndexOutOfBoundsException(数组下标越界异常)

根据报错位置找到是下划线位置报错:

private void bindTypeMain(ShopAdapter.MyViewHolderMain holder,int position){
        Glide.with(context).load(getGoods().get(position).getImages()).fitCenter().placeholder(R.drawable.icon_empty).into(holder.img);
        holder.textprice.setText(getGoods().get(position).getPricenow());
        holder.name.setText(getGoods().get(position).getGoodsname());
        holder.buy.setOnClickListener(newView.OnClickListener() {
            @Override
            public voidonClick(View view) {
                //去试衣间
            
}
        });
    }

当getGoods().size()+1后,position的值就不能再匹配对应的数据,

position是大于getGoods().size()的.

反复调试后:

private void bindTypeMain(ShopAdapter.MyViewHolderMain holder, int position){

        ShopGoods shopGoods = null;

        if (position <= getGoods().size()) {

            shopGoods = getGoods().get(position-1);

        }

        Glide.with(context).load(shopGoods.getImages()).fitCenter().placeholder(R.drawable.icon_empty).into(holder.img);

        holder.textprice.setText(shopGoods.getPricenow());

        holder.name.setText(shopGoods.getGoodsname());

        holder.buy.setOnClickListener(new View.OnClickListener() {

            @Override

            public void onClick(View view) {

                //去试衣间

            }

        });

}

这样设置后运行项目,看到界面(喜极而泣)终于显示出来了

好接着开始写点击事件,写好后点击一看toast,靠商品对应的ID不对?

ID出现乱序.靠什么鬼?

再挖代码,挖挖找找....真TMD(别乱猜中文,我反正是想说”他妹的”)不负有心人,再activity点击事件的回调中这样写:

//item的点击事件

        adapter.setOnItemClickListener(new ShopAdapter.OnRecyclerViewItemClickListener() {

            @Override

            public void onItemClick(View view) {

                ShopGoods shopGoods = null;

                int position = recyclerView.getChildAdapterPosition(view);

                if (position <= goodses.size()) {

                    shopGoods = goodses.get(position-1);

                }

                startActivity(new Intent(Shop_Activity.this,Boutique_Detail.class)

                        .putExtra("goods_id",shopGoods.getId())

                        .setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP)

                );

            }

        });

再次以怀疑人生的心情运行一次项目,打开界面,点击,

wo~~kao~kao~kao~~~

终于搞定!!!

(转眼第二天测试!!!)然而程序总是喜欢跟哥开玩笑,当我再次运行项目(日志显示)服务器给我返回了两个商品数据,而测试手机界面确实也有两个商品数量,这里强调:是”数量”.很是奇怪第二个商品没任何数据?靠靠靠,又开始挖代码~挖啊挖,半小时过去了.然而并没有什么卵用!已接近崩溃了,早一万句草泥马已经飞奔过去.到了接近快一个小时的时候,发现了红色标注的地方:

private void bindTypeMain(ShopAdapter.MyViewHolderMain holder, int position){

        ShopGoods shopGoods = null;

        if (position <= getGoods().size()) {

            shopGoods = getGoods().get(position-1);

        }

        Glide.with(context).load(shopGoods.getImages()).fitCenter().placeholder(R.drawable.icon_empty).into(holder.img);

        holder.textprice.setText(shopGoods.getPricenow());

        holder.name.setText(shopGoods.getGoodsname());

        holder.buy.setOnClickListener(new View.OnClickListener() {

            @Override

            public void onClick(View view) {

                //去试衣间

            }

        });

}

就这个判断,正确判断应该是

if (position <= getGoods().size()+1) {

            shopGoods = getGoods().get(position-1);

        }

 

在黑字标注的地方 +1 欧了运行项目显示正常!点击商品异常退出应用!

又TM 什么鬼?

再去点击事件查看  靠靠啊靠~~

adapter.setOnItemClickListener(new ShopAdapter.OnRecyclerViewItemClickListener() {

            @Override

            public void onItemClick(View view) {

                ShopGoods shopGoods = null;

                int position = recyclerView.getChildAdapterPosition(view);

                if (position <= goodses.size()+1) {

                    shopGoods = goodses.get(position-1);

                }

                startActivity(new Intent(Shop_Activity.this,Boutique_Detail.class)

                        .putExtra("goods_id",shopGoods.getId())

                        .setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP)

                );

            }

        });

原来少 +1 ,加上运行项目,显示正常,点击商品跳转正常!

这次才算真正的终于搞定!!!

4年前关于RecycleView写的这个使用案列,刚入坑感觉逻辑想的有点复杂了,对新手阅读理解太不友好,还有当时只是作为一个个人笔记也没好好整理一下格式, 今日整理资料就顺便整理一下.

简单一点其实在adapter的bindTypeMain()中先赋值position -= 1; 即可

private void bindTypeMain(ShopAdapter.MyViewHolderMain holder,int position){
     position -= 1;
     //下面再使用position就不会越界了
}

AI视频生成模型训练:从数据准备到部署全流程 咱们这次的目的就像是要建造一座超级厉害的AI视频生成魔法城堡。范围呢,就是从收集建造城堡的材料(数据准备)开始,到把城堡搭建起来(模型训练),再到让城堡能供大家使用(模型部署),涵盖了整个过程的方方面面。接下来我们会先给大家介绍一些重要的术语,就像认识冒险途中的关键道具一样。然后引入一个有趣的故事,带大家进入AI视频生成的奇妙世界,解释核心概念以及它们之间的关系。接着会详细讲解核心算法原理、数学模型和公式,还会有项目实战,带大家亲自体验代码的魅力。 阅读详情

相关推荐

Oracle 11g RAC 节点通信故障排查与修复指南

本文详细介绍了Oracle 11g RAC集群发生节点通信故障时的系统性排查与修复方法。当出现节点异常重启时,核心问题往往源于心跳网络中断。文章提供了从快速诊断、日志分析到六层深度检查的完整指南,并给出了针对网络配置、内核参数及Oracle已知Bug等常见根因的实战解决方案,帮助DBA快速恢复集群稳定。

weixin_29246195的博客 273

关于 GridLayoutManager 的 SpanSizeLookup

效果图 代码 GridLayoutManager layoutManager = new ScrollGridLayoutManager(getActivity(),6, GridLayoutManager.VERTICAL, false); GridLayoutManager.SpanSizeLookup spanSizeLookup = new GridLayoutManager.SpanSizeLookup() { @Override public int get

chuyouyinghe的专栏 1453

聊一聊固态电池和钠离子电池新技术

总之,固态电池是一种“安全又高效的未来电池”,它的好处非常明显,但目前还处于研发阶段,离普及还有一段距离。未来,这两种技术可能会与锂离子电池并存,分别满足不同的市场需求。我尝试用最通俗易懂的语言将复杂的技术讲给大家听。钠离子电池和锂离子电池的工作原理很相似,但它用的是。固态电池和钠离子电池是两种正在研发和推广的。,它们有潜力解决现有锂离子电池的部分缺点。,而不是锂(Li)。

weixin_33324696的博客 3333

RecyclerView 多布局的时候GlideLayoutManger item占位问题

在上篇recyclerView多布局中,我们使用的LinearLayoutManager(),项目能够正常的展示,如果我们使用GlideLayoutManger的时候就会出现item多布局的占位问题,布局出现并不是我们想要的那样,比如下图出现item占位问题。下面我们就说下怎么解决这个问题 首先我们要知道GlideLayoutManger有setSpanSizeLookup()这个方法,就是规范i

J_zcxf的博客 1050

从“要啥”到“咋测”:手把手拆解Aspice SWE.1需求分析,为你的车载/嵌入式项目避坑

本文深入解析Aspice SWE.1需求分析在车载/嵌入式项目中的关键作用,帮助开发者将模糊的系统需求转化为可执行、可验证的软件需求。通过实战案例和结构化方法,详细拆解功能需求原子化、非功能需求工程化表达等核心技巧,为项目避坑提供实用指南。

weixin_31682031的博客 259

VC Spyglass实战指南:从零开始掌握CDC约束配置与调试

本文详细介绍了如何使用VC Spyglass进行CDC约束配置与调试,从基础环境搭建到典型CDC问题调试实战,帮助开发者快速掌握跨时钟域验证技术。通过TCL脚本和SDC约束的深度解析,提升CDC验证效率,避免常见设计风险。

weixin_26757925的博客 296

RecyclerView GridLayoutManager 使用遇到的问题

(1)item不居中的问题,请看下面的文章 http://www.jianshu.com/p/a6cd97d8646c (2)从实际情况来看,item中的内容是自动垂直居中的。

“点点”专栏 7069

概率论—期末复习速成笔记(自用)

概率论期末复习

a200327的博客 2万+

GridLayoutManager 中的一些坑

插入3时:0和1同时执行操作A,不执行操作B , 0和1不会触发onmeasure。3和2执行操作A ,2不会触发onmeasure,3触发onmeasure。插入2时:0和1同时执行操作A,不执行操作B , 0和1不会触发onmeasure。2执行操作A并触发onmeasure。插入1时:0和1同时执行操作A,不执行操作B。函数会根据必要性确定是否要执行子view的测量操作。我们假设假设wrapcotent计算的高度为50。插入0时:0执行操作A,不执行操作B。decorate插入的高度为10。

不会写代码的丝丽 1561

引入高分辨率特征层保持的YOLOv10小目标增强:从思路到完整实现

大概两个月前,我在做一个无人机航拍图像检测的项目,目标是识别图片里的小型车辆和行人。用的数据集是VisDrone,相信做小目标检测的朋友对这个数据集都不陌生。一开始我直接跑了官方YOLOv10的代码,结果在tiny vehicle这一类上mAP50只有可怜的0.312。那些小目标基本就是几个像素点,YOLOv10在三次下采样之后,这些小目标的特征几乎就消失不见了。 后来我折腾了大概三周,尝试了各种方法:改anchor、调loss权重、做数据增强、甚至考虑过换检测头。最后发现最有效的还是引入一个高分辨率特征

YOLO 50

2xmax96717+max96724+agx orin驱动代码

说明:这里主要解决max96717的设备地址和sensor地址映射,vc0->vc1多颗max96717+max96724使用配置思路如下: 1、改变max96717的pipez stream id,然后max96724的pipe绑定使用相应的stream id 2、max96717默认是vc0,把vc0改写成vc1\vc2\vc3,然后max96724再重新映射vc输出

mantouyouyou的博客 113

RecyclerView实现多type页面

目录介绍 先看看实际需求 adapter实现多个type 这样写的弊端 如何优雅实现adapter封装 01.先看看实际需求 比如一个APP的首页,包含Banner区、广告区、文本内容、图片内容、新闻内容等等。 RecyclerView 可以用ViewType来区分不同的item,也可以满足需求,但还是存在一些问题,比如: 在item过多逻辑复杂列表界面,Adapter里面的代码量庞大,逻辑复...

Android 开发架构 1681

1. 迈进 SAP UI5 开发世界的第一步 - Hello World

SAP UI5 是一个用于开发企业级 Web 应用的前端框架,基于 HTML 和 JavaScript. 作为教程的第一步,我们需要了解最基础的 HTML 知识。 请大家在电脑上任意新建一个文件夹,将其命名,比如我取的名称为 Walkthrough. 进入 Walkthrough 文件夹,再新建一个文件夹名叫 01,代表本教程的第一个步骤。 进入 01 文件夹,新建一个 webapp 文件夹。这个名称是 web 应用约定俗成所使用的,大家都倾向于用这个名称,当然你要是想用其他名称也没有问题。......

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 9005

RecycleView多布局

RecycleViewAdapter多布局 现在在实际开发中,越来越多的人选择RecyclerView来实现列表布局,而RecyclerView写多了,每次都要直接继承Adapter实现onCreateViewHolder、onBindViewHolder、getItemCount这三个方法,虽然代码量不算很大,但每个XXXAdapter其实都长得差不多,这种重复性的代码,开发者是最不想写的了,所以网上就出现了很多封装Adapter的开源库。 所以本篇文章也介绍自己封装的一个Adapter,帮你快速高效的添

阿呆博客 748

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

RecyclerView的多布局实现

通过学习了RecyclerView的简单使用后,我们不得不讲讲RecyclerView的多布局的实现了,这种用法常见于各种电商类的App。要实现这个效果最主要是复写RecyclerView的适配器里面的getItemViewType()方法,这个方法是根据条件返回Item的类型。不知道你们有没有发现这个方法跟前面那三个方法中的onCreateViewHolder方法的参数viewTyp...

Homjay的博客 2714

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Android Recycleview多布局踩的坑

希望让网格布局的item可以横向一页一页滑动 RecycleviewsetOnFlingListener(null); new LinearSnapHelper().attachToRecyclerView(Recycleview); 希望局部刷新某一个item notifyItemChanged(position,1);//调用这个方法来进行局部刷新 第一个参数是:需要刷新的布局的下标,第...

weixin_43942430的博客 662

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

recyclerview多布局实现

安卓 Android Recyclerview多布局适配 开始 实现目标 代码 布局文件 java文件 点个赞吧,给个关注 开始 好久没有写博客了,不知道会不会有人看见,最近忙着上线项目和维护,哎《《《加班 实现原理就是重写了适配器getItemViewType这个方法,作用是,根据当前是第几个条目,返回不同的布局,如果是网络数据的话,则判断网络数据和自己的条件返回不同的类型即可!! 实现目标 RecyclerView实现列表不同布局,主要看RecyclerviewAdapter来实现,跟我一起做吧!!!

weixin_50302512的博客 938

BaseQuickAdapter和RecycleView基础使用

一.添加依赖 maven { url ‘https://jitpack.io’ } implementation ‘com.github.CymChad:BaseRecyclerViewAdapterHelper:3.0.1’ 二.适配器 class BaseAdapter( layoutId: Int,//可以传入item的布局 data: MutableList<InfoBean>? = null//数据 ) : BaseQuickAdapter<Bean, Bas

DASHBB的博客 3219

RecycleView多Type布局的实现以及点击事件

RecycleView是开发中最常用的组件之一,因其优秀的回收机制而得到了广泛使用。最常用的效果就是用来实现复杂多布局列表。 所以当项目里需要实现如下布局时,我最先想到的便是使用Recycleview。 可以看到,整个Recycleview是方向垂直,而第一个itrm中有个水平滑动的recycleview。 而我们的demo实现的效果如图: 现在让我们开始实现这一步骤: 1.先编...

故河的博客 790

RecycleView 实现多布局界面的原理

实现多布局界面基本原理: 以下全部Adapter中的方法,设置多布局界面就是在Adapter中设置。 图1 上面的方法是设置每一个item返回的viewType,position是每一个item的position 图2 图1设置的viewType,就是图2的viewtype,然后根据它来设置相应的布局。 图3 在该方法获取itemType做相应处理 补充:getItem...

杨岳龙 691

Android RecycleView + GridLayoutManager 实现一个复杂的布局

效果图 要实现这么一个布局有很多种方式,这里介绍一个Recyclerview+GridLayoutManager多布局的方法来实现。 思路 1.首先要明白整体的一个布局结构,从上到下分别为:轮播图的头布局,热门主题,推荐模板,广告图,图片主题,最近热门。 所以我们可以设置几个type对应不同的布局。 public static final int ITEM_HEADER = 1; // 头布局 public static final int ITEM_HOT_SUBJECT = 2; //

ITfreashman的专栏 4528

android 怎么设置列表两列的间隔,ByRecyclerView多布局,如何设置单双列item的margin...

1.单一布局的效果图,2列这种边距非常简单:a.在activity的主布局中,为ByRecyclerView设置一个layout_marginRightandroid:id="@+id/recycler_view"android:layout_width="match_parent"android:layout_height="match_parent"android:layout_marginR...

weixin_27923353的博客 1018

Android RecycleView 的多布局

前言上一篇和大家分享了recycleview的基本的用法,实现了recycleview的3种不同的布局方式。上一篇种也提到了recycleview可以实现很多的功能,比如说recycleview的多布局,今天写的这一篇,recycleview的多布局。

洒家卖蘑菇的博客 2055

recycleview多布局

public class RecyclerAdapter extends RecyclerView.Adapter implements View.OnClickListener { private List mList; private Context context; public RecyclerAdapter(List mList, Context context

晚 207

RecyclerView多布局的加载与实现

RecyclerView,一个代替ListView的控件,所以和ListView一样,也可以设置多布局来给整个的界面带来多种的布局效果,让整个页面看起来比较好看。 同时在我们的生活中也有很多的App都是用着多布局来实现很多的效果的,例如qq,微信的聊天界面,淘宝的主页,包括QQ看点,新闻界面的广告效果都可以使用RecyclerView的多布局来实现,下面就让我们来学习一下RecyclerView的...

weixin_45189502的博客 395

RecycleView复用错乱常用解决办法

RecycleView相对于ListView来说,它本身已经帮你解决了布局复用问题,但是使用不当,还会出现布局错乱问题。 1.当显示的数据是同步显示的,一般出现错乱都是因为逻辑问题,在recycleview中逻辑判断写if一定要写else 2.当显示的数据是异步的,比如加载网页图片,在图片下载成功以后再设置给imageview显示,如果显示错乱,可以在最开始给imageview设置一个tag,im...

weixin_37999256的博客 3798
上一篇: onActivityResult,startActivityForResult,setResult用法解决从后一个activity带参数跳转到前一个activity
下一篇: Android内容观察者模式监听通话状态改变
YangSion.
博客等级 码龄12年 2粉丝 6原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值