RecyclerView внутри PopupWindow, как уволить после нажатия элемента? - PullRequest
0 голосов
/ 17 января 2020

У меня есть recyclerview внутри моего PopupWindow, как мне отклонить PopupWindow после clicking на элементе внутри моего рециркулятора?

public SelectBucketMenu(Context context, ArrayList<String> mBucketNames, ArrayList<String> mImagesBucket) {
        super(context);
        this.mContext = context;
        this.mBucketNames = mBucketNames;
        this.mImagesBucket = mImagesBucket;

        setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
        setOutsideTouchable(true);
        setFocusable(true);
        //Need set windowlayout for API 19 otherwise window won't appear
        setWindowLayoutMode(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);

        setupView();
    }

    private void setupView(){
        View view = LayoutInflater.from(mContext)
                .inflate(R.layout.popupmenu_selectbucket, null);
        ButterKnife.bind(this, view);
        setContentView(view);

        mAdapter = new SelectBucketAdapter(mContext, mBucketNames, mImagesBucket);
        mRecycler.setLayoutManager(new LinearLayoutManager(mContext));
        mRecycler.setAdapter(mAdapter);
    }

И внутри моего ViewHolder я реализовал Метод onClick:

public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {


        @BindView(R.id.vh_selectbucketmenu_rellayout) RelativeLayout vhLayout;

        int mPosition;
        public ViewHolder(@NonNull View itemView) {
            super(itemView);
            ButterKnife.bind(this, itemView);
            vhLayout.setOnClickListener(this);
        }

        @Override
        public void onClick(View view) {
            mPosition = getAdapterPosition();

            //How to dismiss the menu?
        }
    }

Редактировать:

public interface OnRecyclerItemClick{
        void dismissDialog();
    }

SelectBucketMenu extends PopupWindow implements SelectBucketAdapter.OnRecyclerItemClick

@Override
public void onClick(View view) {
   mPosition = getAdapterPosition();


}

// Как вызвать метод интерфейса здесь

Ответы [ 3 ]

2 голосов
/ 17 января 2020

РЕДАКТИРОВАТЬ: Sandeep Malik имеет два других допустимых варианта. Выбор за вами. :)

Вы можете использовать ViewHolder как внутренний класс в SelectBucketMenu, предполагая, что SelectBucketMenu имеет функцию dismiss (), например:

public SelectBucketMenu(Context context, ArrayList<String> mBucketNames, ArrayList<String> mImagesBucket) {
        super(context);
        this.mContext = context;
        this.mBucketNames = mBucketNames;
        this.mImagesBucket = mImagesBucket;

        setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
        setOutsideTouchable(true);
        setFocusable(true);
        //Need set windowlayout for API 19 otherwise window won't appear
        setWindowLayoutMode(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);

        setupView();
    }

    private void setupView(){
        View view = LayoutInflater.from(mContext)
                .inflate(R.layout.popupmenu_selectbucket, null);
        ButterKnife.bind(this, view);
        setContentView(view);

        mAdapter = new SelectBucketAdapter(mContext, mBucketNames, mImagesBucket);
        mRecycler.setLayoutManager(new LinearLayoutManager(mContext));
        mRecycler.setAdapter(mAdapter);
    }

    public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {


        @BindView(R.id.vh_selectbucketmenu_rellayout) RelativeLayout vhLayout;

        int mPosition;
        public ViewHolder(@NonNull View itemView) {
            super(itemView);
            ButterKnife.bind(this, itemView);
            vhLayout.setOnClickListener(this);
        }

        @Override
        public void onClick(View view) {
            mPosition = getAdapterPosition();

            dismiss(); // Here's what you need
        }
    }
}
2 голосов
/ 17 января 2020

Есть 2 способа сделать это: 1) Вы можете использовать interface, чтобы закрыть ваш диалог. 2) Вы можете отправить свой объект диалога в конструкторе вашего адаптера, и после этого, когда вы установите метод click в адаптере, затем установите их dialog.dismiss();

// это будет сделано в вашем классе адаптера

public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
private OnRecyclerItemClick clickListner;

        @BindView(R.id.vh_selectbucketmenu_rellayout) RelativeLayout vhLayout;

        int mPosition;
        public ViewHolder(@NonNull View itemView) {
            super(itemView);
            ButterKnife.bind(this, itemView);
            vhLayout.setOnClickListener(this);
        }

        @Override
        public void onClick(View view) {
            mPosition = getAdapterPosition();
            clickListner.dismissDialog();
            //How to dismiss the menu?
        }
    }

, и это будет сделано в вашей деятельности / фрагмент

private OnRecyclerItemClicklistner listner = new ViewPlanSelectedListner() {
        @Override
        public void OnRecyclerItemClick() {
            dialog.dissmis();
        }
    };

// Нет отправить объект listner в свой конструктор адаптера:

private void setupView(){
        View view = LayoutInflater.from(mContext)
                .inflate(R.layout.popupmenu_selectbucket, null);
        ButterKnife.bind(this, view);
        setContentView(view);

        mAdapter = new SelectBucketAdapter(mContext, mBucketNames, mImagesBucket, listner);
        mRecycler.setLayoutManager(new LinearLayoutManager(mContext));
        mRecycler.setAdapter(mAdapter);
    }
0 голосов
/ 17 января 2020

Вы можете передать ссылку Dialog или AlertDialog через конструктор адаптера RecyclerView. Затем Вы можете закрыть диалог внутри события клика. Если вы используете нормальное представление для всплывающего окна, вы можете передать ссылку на представление через конструктор адаптера RecyclerView, и видимость перейдет в событие click.

...