如何在android中获取回收器视图的特定位置行?

时间:2016-01-13 05:48:25

标签: android

在我的应用程序中,我需要获得一个特定位置的完整的回收器视图行(因为我想获得该行的一些视图)。我搜索了我们可以通过方法getAdapterPosition()得到位置。现在获得位置后这个方法我想得到那个位置的完整行。我怎么能实现呢?

编辑:我在每一行都有一些视图,我在按钮上设置onclick listner,点击我想要完整的行或顶部布局(父布局)。我明白是在点击时调用它返回父视图包裹哪个按钮但不完整的行。

3 个答案:

答案 0 :(得分:0)

我使用了一个类来获取视图(以及点击和长按)

public class RecyclerTouchListener implements RecyclerView.OnItemTouchListener {

    private GestureDetector gestureDetector;
    private ClickListener clickListener;

    public RecyclerTouchListener(Context context, final RecyclerView recyclerView, final ClickListener clickListener) {
        this.clickListener = clickListener;
        gestureDetector = new GestureDetector(context, new GestureDetector.SimpleOnGestureListener() {
            @Override
            public boolean onSingleTapUp(MotionEvent e) {
                return true;
            }

            @Override
            public void onLongPress(MotionEvent e) {
                View child = recyclerView.findChildViewUnder(e.getX(), e.getY());
                if (child != null && clickListener != null) {
                    clickListener.onLongClick(child, recyclerView.getChildPosition(child));
                }
            }
        });
    }

    @Override
    public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) {

        View child = rv.findChildViewUnder(e.getX(), e.getY());
        if (child != null && clickListener != null && gestureDetector.onTouchEvent(e)) {
            clickListener.onClick(child, rv.getChildPosition(child));
        }
        return false;
    }

    @Override
    public void onTouchEvent(RecyclerView rv, MotionEvent e) {
    }

    @Override
    public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {

    }


    public interface ClickListener {

        void onClick(View view, int position);

        void onLongClick(View view, int position);
    }

}

并使用此

/ **          * Recycler视图项单击处理程序          * /

rvDraft.addOnItemTouchListener(new RecyclerTouchListener(getActivity(),
                    rvDraft, new RecyclerTouchListener.ClickListener() {
                @Override
                public void onClick(View view, final int position) {
    // click operation

                }

                @Override
                public void onLongClick(View view, final int position) {

                    Dialogs dialog = new Dialogs();
                    dialog.showAlertForAction(getActivity(), getString(R.string.are_u_sure_want_to_delete), new AlertInterface() {
                        @Override
                        public void buttonYesClick() {

                           // long press operation

                        }

                        @Override
                        public void buttonNoClick() {

                        }
                    });

                }
            }));

希望这会对你有所帮助。

答案 1 :(得分:0)

我现在已经解决了这个问题。首先使用适配器类

中的以下方法获取适配器中的recycleler视图
   @Override
public void onAttachedToRecyclerView(RecyclerView recyclerView) {
    super.onAttachedToRecyclerView(recyclerView);
    mRecyclerView = recyclerView;
}

以及代码

下的点击事件使用
RecyclerView.ViewHolder holder = mRecyclerView.findViewHolderForLayoutPosition(getAdapterPosition());

然后将持有者投射到实际对象,如下所述

MessageViewHolder messageViewHolder = (MessageViewHolder) holder;

恭喜!现在你有一个特定位置的完整行。快乐的编码

答案 2 :(得分:0)

使用全局变量View selectedView。在自定义ViewHolder类中,假设行项为LinearLayout集,请添加以下行

rowItemLayout = (LinearLayout) itemView.findViewById(R.id.row_item);

rowItemLayout.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
         selectedView = rowItemLayout;
         ..
    }
});

现在您可以使用

获取该视图
public View getSelectedView() {
            return selectedView;
}