RecyclerView 无法正常工作:适配器未连接

Posted

技术标签:

【中文标题】RecyclerView 无法正常工作:适配器未连接【英文标题】:RecyclerView not working properly: adapter isnt attaching 【发布时间】:2020-12-31 08:47:17 【问题描述】:

我的适配器类有问题。我已经尝试了很多次来弄清楚为什么适配器没有连接到回收器。不断跳过布局请帮助:S。我不知道任何有使用 Recyclers 的程序员。我不确定我在哪里搞砸了。也没有任何代码行显示任何错误。但我有两种方法是灰色的。

适配器类

public Adapter(Context context,List<Articles> articles) 
    this.context = context;
    this.articles = articles;



@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) 

    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_layout, parent,false);

    return new ViewHolder(view);
`

@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) 

    final Articles a=articles.get(position);
    String url = a.getUrl();
    holder.tvTitle.setText(a.getTitle());

    holder.tvSource.setText(a.getSource().getName());
    holder.tvDate.setText(a.getPublishedAt());


    String imageUrl=a.getUrlToImage();

    Picasso.get().load(imageUrl).into(holder.imageView);
    holder.cardView.setOnClickListener(new View.OnClickListener() 
        @Override
        public void onClick(View v) 
            Intent intent=new Intent(context, NewsInDetails.class);
            intent.putExtra("url",a.getUrl());
            context.startActivity(intent);
        
    );


@Override
public int getItemCount() 
    return articles.size();


public class ViewHolder extends RecyclerView.ViewHolder 
    TextView tvTitle,tvSource,tvDate;
    ImageView imageView;
    CardView cardView;
    public ViewHolder(@NonNull View itemView) 
        super(itemView);

        tvTitle=itemView.findViewById(R.id.tvId);
        tvDate=itemView.findViewById(R.id.tvDate);
        tvSource=itemView.findViewById(R.id.tvSource);
        imageView=itemView.findViewById(R.id.image);
        cardView=itemView.findViewById(R.id.cardView);
    
public String getCountry()

    Locale locale=Locale.getDefault();
    String country=locale.getCountry();
    return country.toLowerCase();    

主类

public class MainActivity extends AppCompatActivity 
RecyclerView recyclerView;
Adapter adapter;
final String apiKey = "732e904090094f96be1cd5f012f107a3";
Button button;
ImageButton floatingActionButton;
List<Articles> articles =new ArrayList<>();


    @Override
protected void onCreate(Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    recyclerView =findViewById(R.id.recyclerView);
    button=findViewById(R.id.refreshButton);
    recyclerView.setLayoutManager(new LinearLayoutManager(this));
    final String country=getCountry();

    floatingActionButton=(ImageButton)findViewById(R.id.floating);
    floatingActionButton.setOnClickListener(new View.OnClickListener() 
        @Override
        public void onClick(View v) 
            Intent intent=new Intent(MainActivity.this,Intro.class);
            startActivity(intent);
        
    );

    retrieveGSON(country,apiKey);
    button.setOnClickListener(new View.OnClickListener() 
        @Override
        public void onClick(View v) 
            retrieveGSON(country,apiKey);
        
    );

public  void retrieveGSON(String country, String apiKey)

    Call<Headlines> call= Client.getInstance().getApi().getHeadlines(country, apiKey);
    call.enqueue(new Callback<Headlines>() 
        @Override
        public void onResponse(Call<Headlines> call, Response<Headlines> response) 
            if (response.isSuccessful() && response.body().getArticles()!=null)
            
                articles.clear();
                articles = response.body().getArticles();

                adapter = new Adapter(MainActivity.this, articles);
                recyclerView.setAdapter(adapter);
            
        

        @Override
        public void onFailure(Call<Headlines> call, Throwable t) 
            Toast.makeText(MainActivity.this,"There is An Error",Toast.LENGTH_SHORT).show();
        
    );

【问题讨论】:

如果它们显示为灰色,则表示它们没有在任何地方使用 【参考方案1】:

然后在 onCreate() 中将 Adapter 设置为 recyclerview

例如: adapter = new Adapter(MainActivity.this, articles); recyclerView.setAdapter(adapter);

在onResponse中将文章最新数据更新到适配器并在适配器上调用notifyDataSetChanged()

例如:

  public setData(List<Articles> articles)
  this.articles = articles
   notifyDataSetChanged
  

【讨论】:

嘿,感谢您的帮助!不幸的是,这对我不起作用。我的应用程序变为空白:s 您是否在 onResponse 中获取文章的成功响应数据,请查看日志。 [FATAL:jni_android.cc(243)] 是logcat中的错误【参考方案2】:

看起来编码没有问题,但只是通知适配器 适配器.notifyDatasetChanged()。 还要检查您是否为视图传递了正确的 ID(致命错误)。

【讨论】:

以上是关于RecyclerView 无法正常工作:适配器未连接的主要内容,如果未能解决你的问题,请参考以下文章

可过滤在 Recyclerview 中无法按预期工作

Fragment,RecyclerView:没有附加适配器;跳过布局

单击项目时,Recyclerview onbindview 无法正常工作

为啥 firebase recyclerview 无法正常工作?

如何在recyclerView中管理点击事件

单击 Recyclerview 中的项目后,OnItem 单击无法正常工作