简体   繁体   中英

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

    This is my RecyclerView Adapter Class

     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.

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.

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

        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:

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.

 @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.

@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);
            }
        }
    });
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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