【问题标题】:RecyclerView not working properly: adapter isnt attachingRecyclerView 无法正常工作:适配器未连接
【发布时间】: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();
        }
    });
}}

【问题讨论】:

  • 如果它们显示为灰色,则表示它们没有在任何地方使用

标签: java android json android-recyclerview


【解决方案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(致命错误)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-02-04
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    • 2017-05-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多