Android订单更多操作popwindow

本文详细介绍了在Android应用中如何实现类似淘宝、京东订单列表的更多操作PopWindow,包括弹出方向的计算、背景样式设置、数据处理以及解决列表显示不下按钮的问题。通过重写PopupWindow,使用点9图片作为背景,并结合RecyclerView实现动态添加按钮。
摘要由CSDN通过智能技术生成

转发备注:https://blog.csdn.net/ctianju/article/details/122109664

背景

淘宝,京东等购物类App订单列表都有“更多”着操作,比如删除订单,查看物流等操作;

分析

Android自带的PopWindow组件就能很好的满足,但是还有问题需要分析解决:
1、弹框的方向问题,如果列表滑动到底部需要向上弹,顶部就向下弹;
解决:计算点击“更多”文字的位置,来动态的改变弹出的方向
2、弹框的背景样式;
解决:最简单利用点9图片作为背景
3、订单列表的 item 数据返回问题
解决:和后端沟通,更多操作的按钮就放到一个list,普通的就放到一个list
4、列表按钮太多放不下问题
解决:利用横向滚动的HorizontalScrollView 动态添加按钮进去

显上效果图

在这里插入图片描述

先组建PopWindow

1、重写PopupWindow

public class ActionMorePopWindow extends PopupWindow {
   
    private Context context;
    private View conentView;
    private RecyclerView listView;
    private ActionSelectPopularAdapter selectAdapter;
    List<OrderActionBtnEntity> typeSelectlist = new ArrayList();
    int[] location = new int[2];
    private OnPopWindowItemListener onItemListener;
    private LinearLayout llParent;
    public interface OnPopWindowItemListener {
   
         void OnItemListener(int position, OrderActionBtnEntity orderActionEntity);
    }

    public void setOnItemMyListener(OnPopWindowItemListener onItemListener) {
   
        this.onItemListener = onItemListener;
    }

    public ActionMorePopWindow(Context context) {
   
        this.context = context;
        initView();
    }

    public ActionMorePopWindow(Context context, List<OrderActionBtnEntity> typeSelectlist) {
   
        this.context = context;
        this.typeSelectlist = typeSelectlist;
        initView();
    }

    private void initView() {
   
        LayoutInflater inflater = (LayoutInflater) context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        this.conentView = inflater.inflate(R.layout.popwindow, null);
        // 设置PopupWindow的View
        this.setContentView(conentView);
        // 设置PopupWindow弹出窗体的宽
        this.setWidth(LinearLayout.LayoutParams.WRAP_CONTENT);
        // 设置PopupWindow弹出窗体的高
        this.setHeight(LinearLayout.LayoutParams.WRAP_CONTENT);
        // 设置PopupWindow弹出窗体可点击
        this.setFocusable(true);
        this.setOutsideTouchable(true);
        // 刷新状态
        this.update();
        // 实例化一个ColorDrawable颜色为半透明
        ColorDrawable dw = new ColorDrawable(0000000000);
        // 点back键和其他地方使其消失,设置了这个才能触发OnDismisslistener ,设置其他控件变化等操作
        this.setBackgroundDrawable(dw);
        this.listView = conentView.findViewById(R.id.lv_list);
        //设置适配器
        this.selectAdapter = new ActionSelectPopularAdapter(typeSelectlist, context);
        this.listView.setLayoutManager(new LinearLayoutManager(context, LinearLayoutManager.VERTICAL, false));
        llParent = conentView.findViewById(R.id.llParent);
        SpacingDecoration itemDecoration = new SpacingDecoration(context, 1);
        this.listView.addItemDecoration(itemDecoration);
        this.listView.setAdapter(selectAdapter);
        this.selectAdapter.setOnItemClickerListener(new ActionSelectPopularAdapter.OnItemClickerListener() {
   
            @Override
            public void onItemClick(int position) {
   
                if (isShowing()) {
   
                    dismiss();
                }
                onItemListener.OnItemListener(position, typeSelectlist.get(position));
            }
        });

        this.setOnDismissListener(new OnDismissListener() {
   
            @Override
            public void onDismiss() {
   
            }
        });
    }

    //设置数据
    public void setDataSource(List<OrderActionBtnEntity> typeSelectlist) {
   
        this.typeSelectlist = typeSelectlist;
        this.selectAdapter.notifyDataSetChanged();
    }

    public void showPopupWindow(View v) {
   
        v.getLocationOnScreen(location); //获取控件的位置坐标
        //获取自身的长宽高
        conentView.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED);
        if (location[1] > DensityUtil.INSTANCE.getScreenHeight(v.getContext()) / 2 + 100) {
   
            //若是控件的y轴位置大于屏幕高度的一半,向上弹出,
            llParent.setBackground(v.getContext().getDrawable(R.drawable.order_doctor_more_up_bg));
            //显示指定控件的上方
            // 偏移距离根据UI的慢慢调整
            this.showAtLocation(v, Gravity.NO_GRAVITY, location[0] - DensityUtil.INSTANCE.dp2px(10), location[1] - listView.getMeasuredHeight()-DensityUtil.INSTANCE.dp2px(17<
  • 5
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要实现 Android 中的 PopUpWindow,你可以遵循以下步骤: 1. 创建一个布局文件,用于显示在 PopUpWindow 中。 2. 创建 PopUpWindow 对象,并设置其属性,如宽度、高度、动画等。 3. 将布局文件添加到 PopUpWindow 中。 4. 显示 PopUpWindow。 下面是一个简单的 PopUpWindow 实现示例: 1. 创建布局文件 popup_layout.xml: ```xml <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/popup_layout" android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="@android:color/white"> <TextView android:id="@+id/popup_text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Hello, World!" android:textSize="18sp" android:padding="10dp" /> </RelativeLayout> ``` 2. 在 Activity 中创建 PopUpWindow 对象: ```java // 布局文件 View popupView = getLayoutInflater().inflate(R.layout.popup_layout, null); // 创建 PopupWindow 对象 PopupWindow popupWindow = new PopupWindow(popupView, ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT, true); ``` 3. 设置 PopUpWindow 属性,如宽度、高度、动画等: ```java // 设置宽度和高度 popupWindow.setWidth(ViewGroup.LayoutParams.WRAP_CONTENT); popupWindow.setHeight(ViewGroup.LayoutParams.WRAP_CONTENT); // 设置动画 popupWindow.setAnimationStyle(android.R.style.Animation_Dialog); ``` 4. 将布局文件添加到 PopUpWindow 中: ```java // 获取布局文件中的 TextView 控件 TextView popupText = popupView.findViewById(R.id.popup_text); // 设置文本内容 popupText.setText("Hello, World!"); ``` 5. 显示 PopUpWindow: ```java // 在某个控件下方显示 popupWindow.showAsDropDown(view); // 或在屏幕中心显示 popupWindow.showAtLocation(view, Gravity.CENTER, 0, 0); ``` 这样就实现了一个简单的 PopUpWindow
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值