RecyclerView使用一些按钮处理点击

时间:2016-12-07 22:35:19

标签: android android-recyclerview onitemclicklistener

好的,这是交易。我昨天浪费了13个小时来处理ListView上的点击处理,然后切换到RecyclerView(感谢这里的成员)解决了处理项目点击的原始问题。我是Android编程的新手,所以请耐心等待。

我设法使用RecyclerView \ RecyclerItemClickListener解决了我的问题:

RecyclerView onClick

现在,我添加了一些我想要使用的按钮,这使事情变得复杂。我希望能够点击按钮并执行各种操作,同时单击主项目并执行其他操作。有没有办法扩展RecyclerItemClickListener,以允许我检查点击是否在按钮或Recycler项目本身。我发现RecyclerItemClickListener上有坐标。所以,我想我也许可以用它来确定被点击的控件,但我记得设备有不同的屏幕尺寸。

我已经看到一些方法来处理ViewHolder级别的点击,但我想检查按钮和项目本身。我一直在搜索,我决定使用我的布局来指定布局标签上的onclick元素以及布局上的每个元素,将非按钮元素转发到项目(布局标签)方法,同时为按钮提供单独的方法

我正在做什么黑客攻击?你能指出我完成我想要的正确方向吗?

2 个答案:

答案 0 :(得分:1)

您可以在ViewHolder

中执行以下操作
class MyViewHolder extends RecyclerView.ViewHolder {

    private Button myButton;

    public MyViewHolder(View itemView) {
        super(itemView);
        myButton = itemView.findViewById(R.id.my_button);

        itemView.setOnClickListener(mainViewClickListener);
        myButton.setOnClickListener(buttonClickListener);
    }

    private View.OnClickListener mainViewClickListener = new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            // Do main thing here.
        }
    };

    private View.OnClickListener buttonClickListener = new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            // Do button click handling here
        }
    };
}

答案 1 :(得分:1)

您可以使用Facade视图来处理此问题。通过在LinearLayout中创建LinearLayout,您可以选择处理点击次数的内容。因此,如何处理长时间点击setOnCreateContextMenuListener,点击视图中的项目进行短暂点击和点击。

这是一个示例布局,请注意可聚焦/可点击的参数。

布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:clickable="false"
    android:focusable="false"
    >

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/showClickable"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:clickable="true"
        android:focusable="true"
        android:background="?android:attr/selectableItemBackground"
        >

        <TextView
            android:text="TextView"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:id="@+id/itemShowTitle"
            android:layout_weight="1"
            />

        <Button
            android:id="@+id/buttonWorthClicking"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="button worth clicking"/>
    </LinearLayout>
</LinearLayout>

然后我们需要传递的ViewHolder或根据需要处理点击

public class ShowsRecyclerViewAdapter extends RecyclerView.Adapter<ShowsRecyclerViewAdapter.ViewHolder> {

    public ShowsRecyclerViewAdapter(List<Show> shows) {
    }

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        Context context = parent.getContext();
        LayoutInflater inflater = LayoutInflater.from(context);
        View view = inflater.inflate(R.layout.show_list_item, parent, false);
        return new ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
        holder.itemShowTitle.setText("" + position);
    }

    @Override
    public int getItemCount() {
        return 10;
    }

    static class ViewHolder extends RecyclerView.ViewHolder
            implements View.OnClickListener, View.OnCreateContextMenuListener {

        final TextView itemShowTitle;
        final Button buttonWorthClicking;

        ViewHolder(final View itemView) {
            super(itemView);
            itemView.setOnClickListener(this);
            itemShowTitle = (TextView) itemView.findViewById(R.id.itemShowTitle);
            buttonWorthClicking = (Button) itemView.findViewById(R.id.buttonWorthClicking);

            setViewFacade(itemView);

            itemView.setOnCreateContextMenuListener(this);
        }

        /**
         * Because the layout is nested to for the ripple we build a facade to pass along clicks
         */
        private void setViewFacade(final View itemView) {
            View facedForClicks = itemView.findViewById(R.id.showClickable);
            facedForClicks.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    // pass along the short click
                    ViewHolder.this.onClick(itemView);
                }
            });
            facedForClicks.setOnCreateContextMenuListener(new View.OnCreateContextMenuListener() {
                @Override
                public void onCreateContextMenu(ContextMenu contextMenu, View view, ContextMenu.ContextMenuInfo contextMenuInfo) {
                    // no-op but passes up to the ViewHolder
                }
            });

            buttonWorthClicking.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Log.d("one-off", "the button was clicked");
                }
            });
        }

        @Override
        public void onClick(View v) {
            Log.d("one-off", "short click on item");
        }

        @Override
        public void onCreateContextMenu(ContextMenu menu, View view, ContextMenu.ContextMenuInfo contextMenuInfo) {
            Log.d("one-off", "long click on item");
        }
    }
}

我在github上的Podcast播放器项目上创建了一个分支,你可以看到一个有效的例子。

Class

XML

branch