RecyclerView onItemClicked回调 [英] RecyclerView onItemClicked callback

查看:92
本文介绍了RecyclerView onItemClicked回调的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用教程,但我不想应用整个教程,我只想处理用户的点击.我已经在MyAdapter类的ViewHolder内部实现了onClickListener:

I am implementing a Navigation Drawer with a RecyclerView, using this tutorial, but I don't want to apply the whole tutorial, I just want to handle the user's click. I've implemented the onClickListener inside the ViewHolder of my MyAdapter class:

public static class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener, View.OnLongClickListener{
    int Holderid; ImageView imageView, profile;
    TextView textView, Name, email, drawerTitle;

    private ClickListener listener;
    // ViewHolder Constructor with View and viewType as a parameter
    public ViewHolder(View itemView, int ViewType, ClickListener listener) {
        super(itemView);

        if (ViewType == TYPE_HEADER){
            itemView.setClickable(false);
            Name = (TextView) itemView.findViewById(R.id.user_name);
            email = (TextView) itemView.findViewById(R.id.user_email);
            profile = (ImageView) itemView.findViewById(R.id.circleView);

            Holderid = 0;
        }
        if(ViewType == TYPE_ITEM) {
            itemView.setClickable(true);
            textView = (TextView) itemView.findViewById(R.id.rowText);

            imageView = (ImageView) itemView.findViewById(R.id.rowIcon);

            Holderid = 1;

            // Handle item click and set the selection
        }
        if(ViewType == TYPE_SEPARATOR){
            itemView.setClickable(false);
            drawerTitle = (TextView) itemView.findViewById(R.id.drawerTitle);

            Holderid = 2;
        }
        this.listener = listener;
        itemView.setOnClickListener(this);
        itemView.setOnLongClickListener(this);
    }
    int pos;
    @Override
    public void onClick(View v) {
        if (listener != null) {
            listener.onItemClicked(getPosition());
            pos= getPosition();
            Log.d("TAG", "Item clicked at position " + getPosition());
        }
    }

    @Override
    public boolean onLongClick(View v) {
        if (listener != null) {
            return listener.onItemLongClicked(getPosition());
        }

        return false;
    }
    public interface ClickListener {
        public void onItemClicked(int position);
        public boolean onItemLongClicked(int position);
    }
}

我不明白的是如何将ClickListener应用于MyAdapter对象:

What I can't understand is how to apply a ClickListener to the MyAdapter object:

        mAdapter = new MyAdapter(dataList, mSelectedPositions, ...?);

以便用户单击一个项目时,我可以处理用户对MainActivity的单击.

so that when the user clicks on one item, I can handle the user's click back on the MainActivity.

我已经按照这种方式创建了适配器(如本教程所述):

I've created the Adapter this way (as outlined in the tutorial):

整个MyAdapter类: http://pastie.org/private/cibcsj3zieorlkcgh2rm1g

这是我的MainActivity类'onCreate:

and this is my MainActivity class' onCreate:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    /* Assigning the toolbar object ot the view
    and setting the the Action bar to our toolbar */
    toolbar = (Toolbar) findViewById(R.id.tool_bar);
    setSupportActionBar(toolbar);
    // enable ActionBar app icon to behave as action to toggle nav drawer
    getSupportActionBar().setDisplayHomeAsUpEnabled(true); //pulsante drawer
    getSupportActionBar().setHomeButtonEnabled(true);      //pulsante dietro

    //Initializing
    mTitle = mDrawerTitle = getTitle();
    SharedPreferences usrData = getSharedPreferences(
                                    usr_loggedin,
                                    MODE_PRIVATE);
    AVATARresID = R.mipmap.aka;

    // Add Drawer Item to dataList
    dataList = new ArrayList<>();
    dataList = prepareDatalist(dataList, NAME, EMAIL, AVATARresID);

    mRecyclerView = (RecyclerView) findViewById(R.id.RecyclerView);
    mRecyclerView.setHasFixedSize(true);
    mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);

    mAdapter = new MyAdapter(dataList, mSelectedPositions); //**ERROR HERE**

    mRecyclerView.setAdapter(mAdapter);
    mLayoutManager = new LinearLayoutManager(this);

    mRecyclerView.setLayoutManager(mLayoutManager);

    // Drawer Listener set to the Drawer toggle
    mDrawerLayout.setDrawerListener(mDrawerToggle);
    mDrawerToggle.syncState(); // Finally we set the drawer toggle sync State
}

如何将MyAdapter类中存在的onClick的结果拉回到我的MainActivity

How do I pull the result of the onClick that is present in the MyAdapter class back to my MainActivity,

    int pos;
    @Override
    public void onClick(View v) {
        if (listener != null) {
            listener.onItemClicked(getPosition());
            pos= getPosition();
            Log.d("TAG", "Item clicked at position " + getPosition());
        }
    }

以便我可以根据单击的项目位置来处理操作?

so that I can handle actions depending on the clicked item position?

推荐答案

MyAdapter的构造函数还采用实现ClickListener的类的对象.例如,您可以让Activity/Fragment实现该接口,并使用this作为参数

The constructor of MyAdapter takes also an object of a class that implements ClickListener. You could, for instance, let your Activity/Fragment implements that Interface and use this as parameter

public class MainActivity extends Activity implements ViewHolder.ClickListener {

   @Override
   protected void onCreate(Bundle savedInstanceState) {
     super.onCreate(savedInstanceState);
     setContentView(R.layout.activity_main);
     // ....
     mAdapter = new MyAdapter(dataList, mSelectedPositions, this);
     // ....
    }

这篇关于RecyclerView onItemClicked回调的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆