【问题标题】:How to make a specific item respond to click in recyclerView如何使特定项目响应点击recyclerView
【发布时间】:2020-01-19 06:46:57
【问题描述】:

我有一个我想要的新闻应用程序,当点击新闻项目 (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>

【问题讨论】:

  • new newsAdapter(getApplicationContext(), list, this) – 这就是我将错误的Context 传递给您的Adapter 的意思。不要将 getApplicationContext() 用于 UI 内容。使用当前的Activity;即this.
  • @MikeM。谢谢我只是需要,但这并没有解决问题
  • 我没有说这是当前的问题。当您问“如何获得正确的上下文”时,我指的是您最后一个问题的 cmets。

标签: android android-studio android-intent android-activity android-recyclerview


【解决方案1】:

recyclerView中如何让特定item响应点击?

因此,让您的卡片视图可点击为 false,并使您的新项目(在卡片视图中查看)可点击为 true:

<Cardview..
  android:clickable="false">
...............
......
<View..
android:clickable="true"/>

</Cardview>

【讨论】:

    【解决方案2】:

    你必须像下面这样在newsAdapter中修改你的viewHolder

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

    希望对你有帮助。

    【讨论】:

      【解决方案3】:
      • 我认为应该在 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);
                  }
              });
      

      【讨论】:

      • 我试过了,但应用程序不断崩溃,要求一个 FLAG_ACTIVITY_NEW_FLAG,我认为使用标志可能无法实现我的想法。
      • 这解决了我的问题。简单,像魅力一样工作。谢谢!!!
      【解决方案4】:

      为了在回收器视图中设置 onclick 监听器,您必须按照以下方式进行操作

      inner class ViewHolderItem(itemView: View) : RecyclerView.ViewHolder(itemView) {
                  init {
                      itemView.setOnClickListener {
                         clicklistener.onItemClick(adapterposition)
                      }
                  }
      }
      

      OnclickListener 将在 Init 块中工作

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多