RecyclerView的onItemClicked回调函数

5
我正在使用这个教程实现一个带有RecyclerView的导航抽屉,但我不想应用整个教程,只需要处理用户的点击事件。 我在MyAdapter类中的ViewHolder内实现了onClickListener
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对象中:
        mAdapter = new MyAdapter(dataList, mSelectedPositions, ...?);

这样当用户点击一个项目时,我就可以在MainActivity中处理用户的点击事件。

我按照教程创建了适配器,代码如下:

MyAdapter类的完整代码:http://pastie.org/private/cibcsj3zieorlkcgh2rm1g

这是我的MainActivity类的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
    int pos;
    @Override
    public void onClick(View v) {
        if (listener != null) {
            listener.onItemClicked(getPosition());
            pos= getPosition();
            Log.d("TAG", "Item clicked at position " + getPosition());
        }
    }

为了能够根据所点击的项目位置执行操作,我需要您的帮助吗?
1个回答

1

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

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);
     // ....
    }

我扩展了 implements View.OnClickListener 并且按照您的建议执行了 mAdapter = new MyAdapter(dataList, mSelectedPositions, this);,但是关键字 this 没有成为 ClickListener... 您具体是什么意思? - Cris
你必须实现 ViewHolder.OnClickListener - Blackbelt
我已经按照这种方式实现了 implements RecyclerView.ViewHolder.ClickListener,但它显示 cannot resolve symbol ClickListener... - Cris
2
你需要实现 implements ViewHolder.ClickListener,导入你的 ViewHolder 类,而不是系统中的任何一个 ViewHolder,同时你还需要导入 ViewHolder.ClickListener - Blackbelt
最后我终于做到了!太棒了,谢谢你的答案!! - Cris
1
你能在问题或者回答中提供完整的代码吗? - Mehmed

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接