回收站查看 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回收站中文件恢复

长按回收站查看项目动画

如何对回收站查看 SQLite 内容进行排序

如何在 Youtube Autoplay 新闻提要等回收站视图中检测查看可见性(80% 左右),当 ~80 可见时播放视频

win10查看回收站清空超过1万个文件,占用资源高造成系统卡死,删除失败

自定义回收商查看通函列表安排