首页 > 解决方案 > 如何使特定项目响应点击recyclerView

问题描述

我有一个我想要的新闻应用程序,当点击新闻项目 ( cardview) 时,它应该打开另一个活动。不幸的是,当点击卡片视图中的新闻项目时,没有任何反应,只有当点击背景(回收器布局)时,活动才会出现。

我希望当cardview点击新闻项目时,应该打开一个活动,而不是在点击背景时。

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>

标签: androidandroid-studioandroid-intentandroid-activityandroid-recyclerview

解决方案


  • 我认为应该在 onBindViewHolder 中添加 setOnClickListener 方法

  • 并且您应该通过传递参数来调用另一个活动。

示例:-(在 onBindViewHolder 中)

holder.itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // call activity.
                Intent intent = new Intent(activity, anotherActivityname.class);
                // For passing values
                intent.putExtra(key,value);
                startActivity(intent);
            }
        });

推荐阅读