回收站查看 OnClickListener
Posted
技术标签:
【中文标题】回收站查看 OnClickListener【英文标题】:Recycler View OnClickListener 【发布时间】:2020-11-26 17:39:39 【问题描述】:我有一个回收器视图,它从 URL 中挑选数据并将其存储,但我想设置一个 OnClickListener 以便我可以单击特定字段并显示一些额外数据。
我尝试实现 ClickListener,但它给了我一个错误。 如果我尝试的这种方式不好,请随时为我的代码提出更好的方法。
适配器类:
package com.example.zlatnakopackajson1;
import android.content.Context;
import android.content.Intent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import java.util.ArrayList;
public class PonudiAdapter extends RecyclerView.Adapter<PonudiViewHolder>
private Context context;
ArrayList<Ponudi> ponudis;
public PonudiAdapter()
ponudis = new ArrayList<>();
public void setData(ArrayList<Ponudi> ponudis)
this.ponudis = ponudis;
@NonNull
@Override
public PonudiViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType)
Context context = parent.getContext();
LayoutInflater layoutInflater = LayoutInflater.from(context);
View ponudiView = layoutInflater.inflate(R.layout.adapter_view_layout,parent,false);
return new PonudiViewHolder(ponudiView);
@Override
public void onBindViewHolder(@NonNull PonudiViewHolder holder, int position)
final Ponudi ponudi = ponudis.get(position);
// holder.sh_sport_id.setText(ponudi.sh_sport_id);
if ( ponudi.sh_sport_id.equals("1"))
holder.sh_sport_id.setText("Фудбал");
holder.imgSport.setImageResource(R.drawable.fudbal);
else if (ponudi.sh_sport_id.equals("2") )
holder.sh_sport_id.setText("Хокеј");
holder.imgSport.setImageResource(R.drawable.hokej);
else if (ponudi.sh_sport_id.equals("3") )
holder.sh_sport_id.setText("Кошарка");
holder.imgSport.setImageResource(R.drawable.basketball);
else if (ponudi.sh_sport_id.equals("4") )
holder.sh_sport_id.setText("Тенис");
holder.imgSport.setImageResource(R.drawable.tenis);
else if (ponudi.sh_sport_id.equals("5") )
holder.sh_sport_id.setText("Ракомет");
// holder.imgSport.setImageResource(R.drawable.handball);
else if (ponudi.sh_sport_id.equals("6") )
holder.sh_sport_id.setText("MLB");
// holder.imgSport.setImageResource(R.drawable.mlb);
else if (ponudi.sh_sport_id.equals("7") )
holder.sh_sport_id.setText("Одбојка");
holder.imgSport.setImageResource(R.drawable.odbojka);
else if (ponudi.sh_sport_id.equals("8") )
holder.sh_sport_id.setText("Рагби");
holder.imgSport.setImageResource(R.drawable.ragbi);
else if (ponudi.sh_sport_id.equals("9") )
holder.sh_sport_id.setText("Формула");
// holder.imgSport.setImageResource(R.drawable.formula);
else if (ponudi.sh_sport_id.equals("10") )
holder.sh_sport_id.setText("Мото Спорт");
// holder.imgSport.setImageResource(R.drawable.moto);
else if (ponudi.sh_sport_id.equals("11") )
holder.sh_sport_id.setText("Ватерполо");
holder.imgSport.setImageResource(R.drawable.vaterpolo);
else if (ponudi.sh_sport_id.equals("12") )
holder.sh_sport_id.setText("Бокс");
// holder.imgSport.setImageResource(R.drawable.boks);
else if (ponudi.sh_sport_id.equals("13") )
holder.sh_sport_id.setText("Футсал");
holder.imgSport.setImageResource(R.drawable.futsal);
else if (ponudi.sh_sport_id.equals("14") )
holder.sh_sport_id.setText("Пинг Понг");
// holder.imgSport.setImageResource(R.drawable.tenis);
else
holder.sh_sport_id.setText("Останато");
holder.imgSport.setImageAlpha(0);
holder.tim1.setText(ponudi.tim1);
holder.tim2.setText(ponudi.tim2);
holder.liga_header.setText(ponudi.liga_header);
holder.parent_layout.setOnClickListener(new View.OnClickListener()
@Override
public void onClick(View v)
Intent intent = new Intent(context,MatchActivity.class);
context.startActivity(intent);
);
@Override
public int getItemCount()
return ponudis.size();
ViewHolder 类:
package com.example.zlatnakopackajson1;
import android.view.View;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
public class PonudiViewHolder extends RecyclerView.ViewHolder
TextView sh_sport_id;
TextView tim1;
TextView tim2;
TextView liga_header;
ImageView imgSport;
LinearLayout parent_layout;
public PonudiViewHolder(@NonNull View itemView)
super(itemView);
sh_sport_id = itemView.findViewById(R.id.textView1);
tim1 = itemView.findViewById(R.id.textView2);
tim2 = itemView.findViewById(R.id.textView3);
liga_header = itemView.findViewById(R.id.textView4);
imgSport = itemView.findViewById(R.id.imgSport);
parent_layout = itemView.findViewById(R.id.parent_layout);
错误日志:
java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.content.Context.getPackageName()' on a null object reference
at android.content.ComponentName.<init>(ComponentName.java:131)
at android.content.Intent.<init>(Intent.java:6510)
at com.example.zlatnakopackajson1.PonudiAdapter$1.onClick(PonudiAdapter.java:114)
at android.view.View.performClick(View.java:7125)
at android.view.View.performClickInternal(View.java:7102)
at android.view.View.access$3500(View.java:801)
at android.view.View$PerformClick.run(View.java:27336)
at android.os.Handler.handleCallback(Handler.java:883)
at android.os.Handler.dispatchMessage(Handler.java:100)
at android.os.Looper.loop(Looper.java:214)
at android.app.ActivityThread.main(ActivityThread.java:7356)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930)
新活动:
package com.example.zlatnakopackajson1;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
public class MatchActivity extends AppCompatActivity
private static final String TAG = "MatchActivity";
@Override
protected void onCreate(@Nullable Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_match);
Log.d(TAG, "OnCrate: started");
getIncomingIntent();
private void getIncomingIntent()
Log.d(TAG, "getIncomingIntent: checking for incoming intent");
if (getIntent().hasExtra("tim1") && getIntent().hasExtra("tim2"))
Log.d(TAG, "getIncomingIntetnt: found intent extras.");
String tim1 = getIntent().getStringExtra("tim1");
String tim2 = getIntent().getStringExtra("tim2");
setItems(tim1,tim2);
private void setItems (String tim1, String tim2)
Log.d(TAG,"setItems: setting the tims to widgets.");
TextView Tim1 = findViewById(R.id.txtMatchT1);
Tim1.setText(tim1);
TextView Tim2 = findViewById(R.id.txtMatchT2);
Tim2.setText(tim2);
【问题讨论】:
private Context context;
in PonudiAdapter
永远不会被分配。传递Activity
,或从视图上下文的基本上下文链中检索活动。
点击此链接 - ***.com/questions/24471109/…
【参考方案1】:
在您的 PonudiAdapter 类中,您有一个私有成员 Context。 但是您没有在类构造函数中设置 context 的值。
更改您的类构造函数以传递上下文对象
public class PonudiAdapter extends RecyclerView.Adapter<PonudiViewHolder>
private Context context;
ArrayList<Ponudi> ponudis;
public PonudiAdapter(Context context)
ponudis = new ArrayList<>();
this.context = context;
...
然后在您初始化 PonudiAdapter 的类中,传递应用程序上下文。
PonudiAdapter adapter = new PonudiAdapter(getApplicationContext());
希望这能回答您的问题。如果您遇到任何其他问题,请随时发表评论。
【讨论】:
非常感谢您的回答,这就是问题所在,当我在构造函数中添加上下文时,我需要在意图中添加 FLAG_ACTIVITY_NEW_TASK。谢谢。 当然没问题。如果我的回答有帮助,你知道该怎么做?以上是关于回收站查看 OnClickListener的主要内容,如果未能解决你的问题,请参考以下文章
关于mfs的回收站中文件的查看方法以及mfs回收站中文件恢复
如何在 Youtube Autoplay 新闻提要等回收站视图中检测查看可见性(80% 左右),当 ~80 可见时播放视频