Search code examples
androidandroid-studioandroid-intentandroid-activityandroid-recyclerview

How to make a specific item respond to click in recyclerView


i have a news app which i want when the news item (cardview) is clicked on, it should open another activity. unfortunately, nothing happens when the news item in the card view is clicked on, only when the background (recycler layout) is clicked on then the activity comes up.

i want when the news item on the cardview is clicked on, an activity should open and not when the background is clicked.

newsAdapter.java

package wami.ikechukwu.kanu;

import android.content.Context;
import android.support.annotation.NonNull;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;

import com.bumptech.glide.Glide;

import java.util.ArrayList;

 public class newsAdapter extends RecyclerView.Adapter<newsAdapter.viewHolder> {

private ArrayList<dataModel> mDataModel;
private Context context;
private onclicklistener clicklistener;

public newsAdapter(Context context, ArrayList<dataModel> mDataModel, onclicklistener clicklistener) {

    this.context = context;
    this.mDataModel = mDataModel;
    this.clicklistener = clicklistener;
}

@NonNull
@Override
public viewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {

    View view =
            LayoutInflater.from(context).inflate(R.layout.recyclerview_layout,
                    viewGroup, false);
    return new viewHolder(view);
}

@Override
public void onBindViewHolder(@NonNull final newsAdapter.viewHolder viewHolder, final int i) {

    dataModel dataModel = mDataModel.get(i);
    viewHolder.mTextView.setText(dataModel.getTitle());
    viewHolder.mTextDescrip.setText(dataModel.getDescrip());
    Glide.with(context).load(dataModel.getImage()).into(viewHolder.mImageView);

}

@Override
public int getItemCount() {

    return mDataModel.size();
}

public interface onclicklistener {

    void onItemClick(int position);

}

public class viewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {

    public TextView mTextView;
    public ImageView mImageView;
    public TextView mTextDescrip;

    public viewHolder(@NonNull View itemView) {

        super(itemView);
        mTextView = itemView.findViewById(R.id.layout_text);
        mImageView = itemView.findViewById(R.id.layout_image);
        mTextDescrip = itemView.findViewById(R.id.layout_descrip);
        itemView.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {

        int adapterposition = getAdapterPosition();
        clicklistener.onItemClick(adapterposition);
    }

}

}

MainActivity.java

package wami.ikechukwu.kanu;

import android.app.AlertDialog;
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.widget.Toast;

import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.JsonObjectRequest;
import com.android.volley.toolbox.Volley;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.util.ArrayList;

import dmax.dialog.SpotsDialog;

public class MainActivity extends AppCompatActivity implements newsAdapter.onclicklistener {

private final String KEY_AUTHOR = "author";
private final String KEY_TITLE = "title";
private final String KEY_DESCRIPTION = "description";
private final String KEY_URL = "url";
private final String KEY_URL_TO_IMAGE = "urlToImage";
private final String KEY_PUBLISHED_AT = "publishedAt";

//this string is appended to the url
String urlLink = "buhari";

ArrayList<dataModel> list;

private RecyclerView recyclerView;
private newsAdapter mAdapter;
private RecyclerView.LayoutManager mLayout;

@Override
protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    getSupportActionBar().hide();
    setContentView(R.layout.activity_main);

    list = new ArrayList<>();
    recyclerView = findViewById(R.id.recyclerView);
    mAdapter = new newsAdapter(getApplicationContext(), list, this);
    mLayout = new LinearLayoutManager(this);
    recyclerView.setLayoutManager(mLayout);
    recyclerView.setAdapter(mAdapter);

    jsonParser();
}

private void jsonParser() {

    final AlertDialog progressDialog = new SpotsDialog(this, R.style.customProgressDialog);
    progressDialog.show();

    JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(Request.Method.GET, "https://newsapi.org/v2/everything?q=" + urlLink + "&language=en&sortBy=publishedAt&pageSize=100&apiKey=655446a36e784e79b2b62adcad45be09", null, new Response.Listener<JSONObject>() {

        @Override
        public void onResponse(JSONObject response) {

            try {
                JSONArray jsonArray = response.getJSONArray("articles");

                //Using a for loop to get the object (data) in the JSON
                for (int i = 0; i < jsonArray.length(); i++) {
                    JSONObject jsonObject = jsonArray.getJSONObject(i);

                    dataModel dataModel = new dataModel();
                    dataModel.setTitle(jsonObject.getString(KEY_TITLE));
                    dataModel.setImage(jsonObject.getString(KEY_URL_TO_IMAGE));
                    dataModel.setDescrip(jsonObject.getString(KEY_DESCRIPTION));
                    list.add(dataModel);
                }
            } catch (JSONException e) {
                e.printStackTrace();

            }
            mAdapter.notifyDataSetChanged();
            progressDialog.dismiss();
        }
    }, new Response.ErrorListener() {

        @Override
        public void onErrorResponse(VolleyError error) {

            Log.e("Volley", error.toString());
            progressDialog.dismiss();
        }
    });
    RequestQueue requestQueue = Volley.newRequestQueue(this);
    requestQueue.add(jsonObjectRequest);
}

@Override
public void onItemClick(int position) {

    Toast.makeText(this, "it worked " + position, Toast.LENGTH_SHORT).show();
    Intent intent = new Intent(this, news_detail.class);
    startActivity(intent);
}

}

recyclerview_layout.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="wrap_content"
android:layout_height="wrap_content">

<android.support.v7.widget.CardView
    android:id="@+id/recyclerviewlayout"
    android:layout_width="match_parent"
    android:layout_height="250dp"
    android:layout_marginLeft="5dp"
    android:layout_marginTop="10dp"
    android:layout_marginRight="5dp"
    android:clickable="true"
    android:focusable="true"
    app:cardCornerRadius="5dp"
    app:cardElevation="10dp">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="250dp"
        android:orientation="vertical">

        <TextView
            android:id="@+id/layout_text"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="#FFFF"
            android:ellipsize="end"
            android:maxLines="1"
            android:padding="5dp"
            android:textColor="#F000"
            android:textSize="17sp"
            android:textStyle="bold" />

        <ImageView
            android:id="@+id/layout_image"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="1"
            android:contentDescription="@string/Recyclerview_ImageContent"
            android:scaleType="centerCrop" />

        <TextView
            android:id="@+id/layout_descrip"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="#FFFF"
            android:ellipsize="end"
            android:maxLines="3"
            android:padding="5dp"
            android:textColor="#F000"
            android:textSize="15sp" />

        <View
            android:layout_width="match_parent"
            android:layout_height="2dp"
            android:background="@color/colorPrimaryDark" />
    </LinearLayout>
</android.support.v7.widget.CardView>

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">


<android.support.v7.widget.RecyclerView
    android:id="@+id/recyclerView"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:scrollbars="vertical">

</android.support.v7.widget.RecyclerView>


Solution

  • You have to modify your viewHolder in newsAdapter like following.

    public class viewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
    
        public TextView mTextView;
        public ImageView mImageView;
        public TextView mTextDescrip;
        public CardView yourCardView;
    
        public viewHolder(@NonNull View itemView) {
    
            super(itemView);
            mTextView = itemView.findViewById(R.id.layout_text);
            mImageView = itemView.findViewById(R.id.layout_image);
            mTextDescrip = itemView.findViewById(R.id.layout_descrip);
            yourCardView= itemView.findViewById(R.id.recyclerviewlayout);
    
            // here you set on click listerner to your cardview.
            yourCardView.setOnClickListener(this);
        }
    
        @Override
        public void onClick(View v) {
            int adapterposition = getAdapterPosition();
            clicklistener.onItemClick(adapterposition);
        }
    
    }
    

    Hope it helps you.