简体   繁体   English

在Recyclerview适配器中实现onClick

[英]Implementing onClick in the Recyclerview Adapter

  1. I would like to know how to implement onClick for each item in my grid (using Recycler View and Card view) to launch a new activity.Below is my ViewHolder class and the RecyclerView Adapter Class 我想知道如何为网格中的每个项目实现onClick(使用Recycler View和Card视图)以启动新活动。以下是我的ViewHolder类和RecyclerView Adapter类

    This is my RecyclerView Adapter Class 这是我的RecyclerView适配器类

     import android.app.Activity; import android.content.Context; import android.content.Intent; import android.nfc.Tag; import android.nfc.TagLostException; import android.support.v7.widget.RecyclerView; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.Toast; import java.util.List; public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewHolders> { private List<ItemObject> itemList; private Context context; public RecyclerViewAdapter(Context context, List<ItemObject> itemList) { this.itemList = itemList; this.context = context; } @Override public RecyclerViewHolders onCreateViewHolder(ViewGroup parent, int viewType) { View layoutView = LayoutInflater.from(parent.getContext()).inflate(R.layout.card_view_list, null); RecyclerViewHolders rcv = new RecyclerViewHolders(layoutView); return rcv; } @Override public void onBindViewHolder(RecyclerViewHolders holder, final int position) { holder.countryName.setText(itemList.get(position).getName()); holder.countryPhoto.setImageResource(itemList.get(position).getPhoto()); holder.countryPhoto.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Toast.makeText(view.getContext(),"This is Maps",Toast.LENGTH_SHORT).show(); } }); } @Override public int getItemCount() { return this.itemList.size(); } } //This is my Recycler View Holder Class import android.content.Intent; import android.support.v7.widget.RecyclerView; import android.util.Log; import android.view.View; import android.widget.ImageView; import android.widget.TextView; import android.widget.Toast; public class RecyclerViewHolders extends RecyclerView.ViewHolder implements View.OnClickListener { public TextView countryName; public ImageView countryPhoto; public RecyclerViewHolders(View itemView) { super(itemView); itemView.setOnClickListener(this); countryName = (TextView) itemView.findViewById(R.id.country_name); countryPhoto = (ImageView) itemView.findViewById(R.id.country_photo); } @Override public void onClick(View view) { Toast.makeText(view.getContext(), "Clicked Country Position = " + getPosition(), Toast.LENGTH_SHORT).show(); } } 

I use Interface as the Callback to handle this case. 我使用接口作为回调来处理这种情况。

First, I create an interface class inside Adapter. 首先,我在Adapter中创建一个接口类。

public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewHolders> {

    private List<ItemObject> itemList;
    private Context context;
    private ItemClickListener mItemClickListener;

    public RecyclerViewAdapter(Context context, List<ItemObject> itemList) {
        this.itemList = itemList;
        this.context = context;
    }

    @Override
    public RecyclerViewHolders onCreateViewHolder(ViewGroup parent, int viewType) {

        View layoutView = LayoutInflater.from(parent.getContext()).inflate(R.layout.card_view_list, null);
        RecyclerViewHolders rcv = new RecyclerViewHolders(layoutView);
        return rcv;
    }

    public void addItemClickListener(ItemClickListener listener) {
        mItemClickListener = listener;
    }

    @Override
    public void onBindViewHolder(RecyclerViewHolders holder, final int position) {
        holder.countryName.setText(itemList.get(position).getName());
        holder.countryPhoto.setImageResource(itemList.get(position).getPhoto());
        holder.countryPhoto.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (mItemClickListener != null) {
                    mItemClickListener.onItemClick(position);
                }
            }
        });
    }

    @Override
    public int getItemCount() {
        return this.itemList.size();
    }

    //Define your Interface method here
    public interface ItemClickListener {
        void onItemClick(int position);
    }
}

Then, let's the Activity or Fragment implement that Interface and add the listener. 然后,让Activity或Fragment实现该接口并添加侦听器。

public class MyFragment extends Fragment
    implements RecyclerViewAdapter.ItemClickListener {

    private List<ItemObject> mItemList;
    ...
     @Override
    public View onCreateView(final LayoutInflater inflater, final ViewGroup container,
                             final Bundle savedInstanceState) {
       ...
       //Make sure mItemList not NULL
       RecyclerViewAdapter adapter = new RecyclerViewAdapter(getContext(), mItemList);
       //Add Item Click listener
       adapter.addItemClickListener(this);
    }


    @Override
    public void onItemClick(int position) {   
        Toast.makeText(.getContext(),"Click on item: " + position,Toast.LENGTH_SHORT).show();
    }
}

Hope this will help! 希望这会有所帮助!

your code look like fine, if asking for how to creat intent to open new activity here is whet you should change 您的代码看起来不错,如果在这里询问如何创建意图来打开新活动,则应该更改

it is lazy way not recommended for best pratice 这是不推荐最佳实践的懒惰方式

make a static variable in your Mian activty witch is hold a refrance some thing like that 在您的Mian活动女巫中创建一个静态变量,它持有refrance之类的东西

        public class MainActivity extends AppCompatActivity

 public static Activity activity;


            @Override
            protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_main);
                Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
                setSupportActionBar(toolbar);
                getSupportActionBar().setElevation(0);

                activity=this;

        }
    }

and then inside your click 然后点击

...

          @Override
            public void onClick(View v) {
Toast.makeText(.getContext(),"Click on item: " + position,Toast.LENGTH_SHORT).show();
                startActivity(new Intent(MainActivity.activity, MyOtherActivity.class));
            }

...

I'm not completely clear from your initial post what your issue is, but if all you want to do is implement an OnClickListener in your RecyclerViewAdapter , just add the following: 从您的初始帖子中我还不能完全清楚您的问题是什么,但是如果您要做的就是在RecyclerViewAdapter实现OnClickListener,只需添加以下内容:

First, change your class declaration to this: 首先,将您的类声明更改为:

public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewHolders> implements OnClickListener {

Then, add your onClick method to the class, to complete the interface. 然后,将onClick方法添加到该类中,以完成界面。

 @Override
public void onClick(View view) {   
    Toast.makeText(this.getContext(),"Code to change activity goes here." ,Toast.LENGTH_SHORT).show();
}

Finally, you'll need to set an OnClickListener in your adapter class. 最后,您需要在适配器类中设置OnClickListener。

@Override
public void onBindViewHolder(RecyclerViewHolders holder, final int position) {
    holder.setOnClickListener(this);
    holder.countryName.setText(itemList.get(position).getName());
    holder.countryPhoto.setImageResource(itemList.get(position).getPhoto());
    holder.countryPhoto.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            if (mItemClickListener != null) {
                mItemClickListener.onItemClick(position);
            }
        }
    });
}

Now, personally I wouldn't do things this way. 现在,我个人不会这样做。 What I would do instead is add a private inner class to your adapter, like this: 我要做的是向您的适配器添加一个私有内部类,如下所示:

private AdapterOnClickListener implements OnClickListener() {
    private String message;

    public AdapterOnClickListener (String toast) {
         message = toast;
    }

    public void onClick (View v) {
       Toast.makeText(this.getContext(),toast ,Toast.LENGTH_SHORT).show();
    }

}

Then in the adapter you call: 然后在适配器中调用:

@Override
public void onBindViewHolder(RecyclerViewHolders holder, final int position) {
    holder.setOnClickListener(new AdapterOnClickListener ("Instead of a string, I can be an intent. Then in your listener, you can call (If I recall correctly) getContext().startActivity(intent), and have an activity.");
    holder.countryName.setText(itemList.get(position).getName());
    holder.countryPhoto.setImageResource(itemList.get(position).getPhoto());
    holder.countryPhoto.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            if (mItemClickListener != null) {
                mItemClickListener.onItemClick(position);
            }
        }
    });
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM