安卓 实现PopUpWindow (长按删除列表元素的界面)(新手笔记-18)

我们经常会使用到Recyclerview来显示列表内容,有时候我们需要删除某一项,这时候我们会选择长按,长按后的弹窗可以使用PopUpWindow来实现(由于需要数据交互更新,我这里没有做数据的删除,只是实现前端界面样式)。

首先创建了一个LinearLayout,里面包含两个TextView作为弹出界面的布局,这里不写了。

之后实现一个PopUpWindow:

public class RecyclerViewPopWindow extends PopupWindow implements View.OnClickListener{

    private View contentView;
    private TextView pop_delete;
    private TextView pop_test;
    private Context mContext;
    private boolean flag;

    public RecyclerViewPopWindow(Activity context){
        this.mContext = context;
        //获取系统服务(Layout Inflater的服务)
        LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        //设置长按之后PopUpWindow的布局样式
        contentView = inflater.inflate(R.layout.pop_window_layout, null);
        //设置该布局
        this.setContentView(contentView);

        //在布局文件中设置了两个TextView作为测试
        pop_delete = contentView.findViewById(R.id.pop_delete);
        pop_test = contentView.findViewById(R.id.pop_test);

        //获取屏幕高度宽度
        int height = context.getWindowManager().getDefaultDisplay().getHeight();
        int width = context.getWindowManager().getDefaultDisplay().getWidth();
        //设置高度宽度
        this.setHeight(ViewGroup.LayoutParams.WRAP_CONTENT);
        this.setWidth(width / 3);
        //设置该PopUpWindow是否可以点击
        this.setFocusable(true);
        //设置该PopUpWindow外的地方是否可以点击(就是点击其他位置使窗口消失)
        this.setOutsideTouchable(true);
        //刷新PopUpWindow状态
        this.update();
        //实例化一个ColorDrawable颜色为半透明
        ColorDrawable dw = new ColorDrawable(0000000000);
        //设置背景颜色
        this.setBackgroundDrawable(dw);
        pop_delete.setOnClickListener(this);
        pop_test.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()){
            case R.id.pop_delete:
                //实现接口中的操作,这样我们可以在Recyclerview所在的活动中进行数据操作,而无需转入该类。
                iRecycler.getRecycler(1);
                dismiss();
                break;
            case R.id.pop_test:
                iRecycler.getRecycler(2);
                dismiss();
                break;
            default:
                break;
        }
    }

    private IRecycler iRecycler;

    public void setIRecycler(IRecycler iRecycler){
        this.iRecycler = iRecycler;
    }

    //实现一个接口
    public interface IRecycler{
        public void getRecycler(int i);
    }

    //显示PopUpWindow
    public void showPopWindow(View parent){
        if(!this.isShowing()){
            //以下拉方式显示PopUpWindow
            this.showAsDropDown(parent, parent.getLayoutParams().width/2,5);
        }else {
            this.dismiss();
        }
    }
}

在包含有Recyclerview的一个类中进行修改代码(这里Recyclerview的代码不发了)

public class FirstFragment extends Fragment implements RecyclerViewPopWindow.IRecycler{

    private RecyclerView recyclerView;
    private List<RecyclerViewListItemEntity> viewData = new ArrayList<RecyclerViewListItemEntity>();
    private RecyclerViewAdapter scenAdapter;

    private View view;

    private int pop_position = -1;

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        //避免同一activity下 多个fragment 切换时重复执行onCreateView方法
        // Fragment之间切换时每次都会调用onCreateView方法,导致每次Fragment的布局都重绘,无法保持Fragment原有状态。
        if (view == null) {
            view = inflater.inflate(R.layout.first_fragment, container, false);
        } else {
            ViewGroup parent = (ViewGroup) view.getParent();
            if (null != parent) {
                parent.removeView(view);
            }
        }

        //添加数据的函数(这里的数据就随意添加了)
        initData();

        recyclerView = view.findViewById(R.id.recyclerView);

        //添加布局管理(这里有多重布局,实现效果也不同,比如Gridlayout)
        final LinearLayoutManager layoutManager = new LinearLayoutManager(view.getContext());
        recyclerView.setLayoutManager(layoutManager);

        //添加recyclerview的适配器
        scenAdapter = new RecyclerViewAdapter(view.getContext(), viewData);
        recyclerView.setAdapter(scenAdapter);

        //设置每一项中的分割线
        recyclerView.addItemDecoration(new DividerItemDecoration(view.getContext(),
                DividerItemDecoration.VERTICAL_LIST));

        //设置监听事件
        scenAdapter.setOnItemClickListener(new RecyclerViewAdapter.OnItemClickListener() {
            @Override
            public void onClick(int position) {
                Toast.makeText(view.getContext(),"on click line " + position,Toast.LENGTH_SHORT).show();
            }

            @Override
            public void onLongClick(int position) {
                RecyclerViewPopWindow popWindow = new RecyclerViewPopWindow(getActivity());
                //这里需要使用选中的item的view来进行showPopWindow
                View pop_view = layoutManager.findViewByPosition(position);
                popWindow.showPopWindow(pop_view);
                //设置点击后的事件
                popWindow.setIRecycler(FirstFragment.this);

                pop_position = position;
            }
        });
        return view;
    }



    private void initData() {
        viewData.add(new RecyclerViewListItemEntity("happy","123456"));
        viewData.add(new RecyclerViewListItemEntity("sad","156816"));
        viewData.add(new RecyclerViewListItemEntity("anger","555555"));
        viewData.add(new RecyclerViewListItemEntity("excite","789498"));
        viewData.add(new RecyclerViewListItemEntity("diss","151965"));
        viewData.add(new RecyclerViewListItemEntity("diss","151965"));
        viewData.add(new RecyclerViewListItemEntity("diss","151965"));
        viewData.add(new RecyclerViewListItemEntity("diss","151965"));
        viewData.add(new RecyclerViewListItemEntity("diss","151965"));
        viewData.add(new RecyclerViewListItemEntity("diss","151965"));
        viewData.add(new RecyclerViewListItemEntity("diss","151965"));
        viewData.add(new RecyclerViewListItemEntity("diss","151965"));
        viewData.add(new RecyclerViewListItemEntity("diss","151965"));
        viewData.add(new RecyclerViewListItemEntity("diss","151965"));
        viewData.add(new RecyclerViewListItemEntity("diss","151965"));
        viewData.add(new RecyclerViewListItemEntity("diss","151965"));
        viewData.add(new RecyclerViewListItemEntity("diss","151965"));
        viewData.add(new RecyclerViewListItemEntity("diss","151965"));

    }

    @Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
    }

    //重写点击弹出菜单后的操作
    @Override
    public void getRecycler(int i) {
        if(i == 1){
            Toast.makeText(view.getContext(),"Delete",Toast.LENGTH_SHORT).show();
        }else if(i == 2){
            Toast.makeText(view.getContext(), "test",Toast.LENGTH_SHORT).show();

            viewData.remove(pop_position);
            scenAdapter.notifyDataSetChanged();
        }
    }
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值