仿美团饿了么选菜界面实现

本文介绍如何基于现有开源项目,改造实现类似美团、饿了么应用的选菜界面。通过自定义ViewGroup,使用两个RecyclerView并设置横向布局。借助BaseBean进行数据适配,并通过tag匹配左右列数据。同时实现右侧滑动时,左侧联动滚动的效果,详细讲解了滚动监听的实现方法。
摘要由CSDN通过智能技术生成

本文是在未来大神zxt头像狂魔的基础上稍作修改,大家在看这个博客之前可以出门右拐至这里: 传送门-----> 点击打开链接

好了,我们首先看一下两个app的界面长什么样子:



我们看到两个界面都很相似,如果你已经读完了我推荐的博客内容,接下来会非常的简单,首先我们还是无脑的自定义viewgroup,这个界面我打算用两个recyclerview完成,因为是左右布局,我们直接继承Linearlayout然后横向布局即可,所以我们只用这样写:

public class MeiTuanFoodView extends LinearLayout {
   

    public MeiTuanFoodView(Context context) {
        this(context, null);
    }

    public MeiTuanFoodView(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public MeiTuanFoodView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        setOrientation(HORIZONTAL);

    }

接下来我们写一个xml布局,既左边一个recyclerview 右边一个recyclerview:

<merge xmlns:android="http://schemas.android.com/apk/res/android"
   >
    <android.support.v7.widget.RecyclerView
        android:layout_width="0px"
        android:layout_height="match_parent"
        android:layout_weight="1"
        android:id="@+id/left_view"
        ></android.support.v7.widget.RecyclerView>
    <android.support.v7.widget.RecyclerView
        android:layout_width="0px"
        android:layout_height="match_parent"
        android:layout_weight="2"
        android:id="@+id/right_view"
        ></android.support.v7.widget.RecyclerView>
</merge>
因为外层布局同样是Linearlayout,所以这里可以直接写上merge布局,然后再我们的viewgroup里进行初始化,然后因为我们的weight属性在项目里并不固定,所以我们尽量通过自定义属性来支持动态的weight变化,所以我们在attrs.xml新建一个自定义属性:
<resources>
    <declare-styleable name="MeiTuanFoodView">
        <attr name="leftSum" format="integer"></attr>
        <attr name="rightSum" format="integer"></attr>
        <attr name="topItemHeight" format="dimension"></attr>
    </declare-styleable>
前两个属性显而易见是我们左右recyclerview的weight属性,最后一个则是我们悬浮标签的高度。

然后我们的viewgroup的代码就变成了如下:

 public MeiTuanFoodView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        this.context = context;
        setOrientation(HORIZONTAL);
        inflate(context, R.layout.layout_meituan, this);
        leftView = (RecyclerView) findViewById(R.id.left_view);
        rightView = (RecyclerView) findViewById(R.id.right_view);
        leftView.setLayoutManager(new LinearLayoutManager(context, LinearLayoutManager.VERTICAL, false));
        rightView.setLayoutManager(new LinearLayoutManager(context, LinearLayoutManager.VERTICAL, false));
        TypedArray ta = context.getTheme().obtainStyledAttributes(attrs, R.styleable.MeiTuanFoodView, defStyleAttr, 0);
        leftSum = ta.getInt(R.styleable.MeiTuanFoodView_leftSum, 1);
        rightSum = ta.getInt(R.styleable.MeiTuanFoodView_rightSum, 2);
        itemTopHeight = ta.getDimensionPixelSize(R.styleable.MeiTuanFoodView_topItemHeight, (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 30, context.getResources().getDisplayMetrics()));
        ta.recycle();

        leftLp = (LayoutParams) leftView.getLayoutParams();
        rightLp = (LayoutParams) rightView.getLayoutParams();
        if (leftSum != leftLp.weight) {
            leftLp.weight = leftSum;
            leftView.setLayoutParams(leftLp);
        }
        if (rightSum != rightLp.weight) {
            rightLp.weight = rightSum;
            rightView.setLayoutParams(rightLp);
        }


    }
好了,接下来我们就该动态的设置数据,首先两个recyclerview肯定需要adapter适配器,为了简便,我直接写了简单版的baseAdapter来进行共用,代码非常简单,大家都能看的懂:

public abstract class BaseViewAdapter<T> extends RecyclerView.Adapter<BaseViewAdapter.BaseHolder> {
    private int selectPosition=-1;

    private Context context;
    private List<T> mData;
    public BaseViewAdapter(Context context,List<T> mData){
        this.context=context;
        this.mData=mData;
    }

    @Override
    public BaseHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        return new BaseHolder(LayoutInflater.from(context).inflate(getLayoutId(),parent,false));
    }

    @Override
    public void onBindViewHolder(BaseHolder holder, int position) {
        bind(holder,position);
    }


    public int getSelectPosition() {
        return selectPosition;
    }

    public void setSelectPosition(int selectPosition) {
        this.selectPosition = selectPosition;
        notifyDataSetChanged();

    }

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

    protected abstract void bind(BaseHolder holder, int p
### 回答1: 同城外卖系统源码、同城O2O配送外卖小程序、外卖APP和仿美团饿了么骑手导航配送平台都是用于创建和管理外卖订单、配送和导航的软件。 同城外卖系统源码是一个提供外卖订餐服务的平台,使用者可以在平台上浏览餐厅菜单、下单、付款和选择配送方式。该源码可以供开发人员根据自己的需求进行二次开发,定制自己的外卖订餐系统。 同城O2O配送外卖小程序是一种基于微信或其他社交媒体平台的小程序,用户可以通过搜索附近的餐厅、浏览菜单、下单和支付,餐厅可以收到订单并安排配送。该小程序具有便捷、快速和实时的特点,方便用户下单和餐厅配送管理。 外卖APP是一款专门用于订购外卖的手机应用程序,用户可以通过该APP在手机上浏览餐厅菜单、下单、支付和选择配送方式。该APP通常有用户评价、促销优惠等功能,为用户提供更便捷的外卖服务体验。 仿美团饿了么骑手导航配送平台是一个提供骑手导航和配送管理的软件平台。骑手可以通过该平台接收订单、查看订单详情、导航到目的地以及完成配送。该平台可以根据订单的优先级和距离进行最优的分配,提高配送效率和服务质量。 总之,同城外卖系统源码、同城O2O配送外卖小程序、外卖APP和仿美团饿了么骑手导航配送平台都是为了提供便捷的外卖订购和配送服务,满足用户和商家的需求。不同的系统和平台有不同的特点和功能,可以根据个人或商家的需求选择合适的解决方案。 ### 回答2: 同城外卖系统源码是一种提供给餐饮行业的解决方案,能够帮助餐厅与消费者之间实现线上点餐、配送服务的平台。它包括同城o2o配送外卖小程序和外卖app,可以模仿美团饿了么等知名平台的骑手导航配送平台。 同城外卖系统源码由前端和后台两部分组成。前端部分是同城o2o配送外卖小程序和外卖app,它们提供给消费者一个方便快捷的线上点餐平台,消费者可以通过这些平台选择菜品、下单支付并实时查看订单和配送进度。同时,这些平台也为餐厅提供了一个展示自己菜品并接受订单的渠道。 后台部分是同城外卖系统的核心,它连接了餐厅、骑手和消费者,实现了订单管理、配送管理、骑手管理等功能。通过后台管理系统,餐厅可以接受并管理订单、查看菜品销售情况,骑手可以接受配送任务并进行导航定位,消费者则可以实时查看订单状态和配送进度。 同城外卖系统源码的优势在于它提供了一整套完善的解决方案,不仅包括前端的小程序和app开发,还有后台系统的搭建和管理。这样的系统源码可以有效减少开发成本和周期,帮助餐厅快速上线线上外卖服务。同时,系统的界面和功能可以仿美团饿了么等成功平台,提供给用户一种熟悉、便捷的体验。 综上所述,同城外卖系统源码包括同城o2o配送外卖小程序和外卖app,可以通过仿美团饿了么的骑手导航配送平台实现餐厅与消费者之间的线上点餐和配送服务。这种系统源码具有成本低、周期短、界面友好等优势,是餐饮行业实现线上外卖服务的一个可行解决方案。 ### 回答3: 同城外卖系统源码是为了满足现代社会外卖配送需求而开发的一种技术解决方案。该系统源码适用于开发同城o2o配送外卖小程序或外卖app,功能类似于美团饿了么等外卖平台,可以提供用户下单、商家接单、骑手接单、订单配送等功能。 该系统源码基于互联网和移动端技术开发,具备可扩展性和稳定性。通过前端界面和后端逻辑的配合,用户可以通过小程序或app浏览并选择附近的餐馆、菜品,进行下单和支付。商家可以接收订单、处理订单,并与骑手进行配送沟通。骑手可以接收配送任务,并通过导航系统进行准确的配送。 这个系统源码可以帮助餐馆和外卖平台开发出高效、便捷的配送系统,提升用户体验和订单处理效率。同时,它也可以提供一种创业机会,帮助个人或企业开发自己的同城外卖平台。 总结而言,同城外卖系统源码是一种满足现代社会外卖配送需求的技术解决方案。通过开发同城o2o配送外卖小程序或外卖app,可以构建类似于美团饿了么等外卖平台的功能,并为用户、商家和骑手提供便捷的下单、接单和配送服务。这个系统源码具备可扩展性和稳定性,适合个人创业或企业开发自己的同城外卖平台。
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值