【问题标题】:Image is not displaying properly when using live data and retrofit android使用实时数据和改造 android 时图像无法正确显示
【发布时间】:2019-11-13 11:28:27
【问题描述】:

所有其他数据都在显示,只有图像不能正常显示。

下面是代码。

public class MainActivity extends AppCompatActivity {
    ArrayList<Movies> articleArrayList = new ArrayList<>();
    MoviesAdapter newsAdapter;
    RecyclerView rvHeadline;
    MoviesViewModel newsViewModel;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        rvHeadline = findViewById(R.id.rvNews);

        newsViewModel = ViewModelProviders.of(this).get(MoviesViewModel.class);
        newsViewModel.init();
        newsViewModel.getNewsRepository().observe(this, newsResponse -> {
            List<Movies> newsArticles = null;
            if (newsResponse != null) {
                newsArticles = newsResponse.getMovies();
                articleArrayList.addAll(newsArticles);
                newsAdapter.notifyDataSetChanged();
            }
        });
        setupRecyclerView();
    }

    private void setupRecyclerView() {
        if (newsAdapter == null) {
            newsAdapter = new MoviesAdapter(MainActivity.this, articleArrayList);
            rvHeadline.setLayoutManager(new LinearLayoutManager(this));
            rvHeadline.setAdapter(newsAdapter);
            rvHeadline.setItemAnimator(new DefaultItemAnimator());
            rvHeadline.setNestedScrollingEnabled(true);
        } else {
            newsAdapter.notifyDataSetChanged();
        }
    }
}


public class MoviesAdapter extends RecyclerView.Adapter<MoviesAdapter.MoviesViewHolder> {
    Context context;
    ArrayList<Movies> articles;

    public MoviesAdapter(Context context, ArrayList<Movies> articles) {
        this.context = context;
        this.articles = articles;
    }

    @NonNull
    @Override
    public MoviesAdapter.MoviesViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(context).inflate(R.layout.movies_item, parent, false);
        return new MoviesViewHolder(view);
    }
    @Override
    public void onBindViewHolder(@NonNull MoviesAdapter.MoviesViewHolder holder, int position) {
        holder.tvName.setText(articles.get(position).getTitle()); //this is working
        holder.tvDesCription.setText(articles.get(position).getDirector());
        String url = articles.get(position).getPoster();
        if(url!=null) {
           /* Glide.with(context) //passing context
                    .load(url) //passing your url to load image.
                    .dontAnimate()
                    .placeholder(context.getDrawable(R.drawable.ic_launcher_background)) //this would be your default image (like default profile or logo etc). it would be loaded at initial time and it will replace with your loaded image once glide successfully load image using url.
                    .centerCrop()//this method help to fit image into center of your ImageView
                    .into(holder.ivNews);*/ //pass imageView reference to appear the image.*/
            Picasso.get()
                    .load(url)
                    .placeholder(R.drawable.ic_launcher_background)
                    .error(R.drawable.ic_launcher_background)
                    .into(holder.ivNews);
        }
    }
    @Override
    public int getItemCount() {
        return articles.size();
    }

    public class MoviesViewHolder extends RecyclerView.ViewHolder {

        TextView tvName;
        TextView tvDesCription;
        ImageView ivNews;

        public MoviesViewHolder(@NonNull View itemView) {
            super(itemView);

            tvName = itemView.findViewById(R.id.tvName);
            tvDesCription = itemView.findViewById(R.id.tvDesCription);
            ivNews = itemView.findViewById(R.id.ivNews);

        }
    }
}

我无法弄清楚我到底在哪里犯了错误。因为响应中的图像仅显示特定表格,而其他表格则通过显示相同的图像进行复制,或者也不显示。我也使用了 Glide 和 picasso,但仍然没有从某些列表的响应中显示图像。

【问题讨论】:

  • 您需要为if(url!=null) { 添加else-statement 否则持有人将拥有遗留数据

标签: java android mvvm retrofit android-livedata


【解决方案1】:

在适配器中同时使用 if 和 else 条件.. 只需将此代码添加到您的项目中:

 if(url!=null){
        Picasso.get()
                .load(url)
                .placeholder(R.drawable.ic_launcher_background)
                .error(R.drawable.ic_launcher_background)
                .into(holder.ivNews);
    } else {
        Picasso.get()
                .load(R.drawable.ic_launcher_background)
                .error(R.drawable.ic_launcher_background)
                .into(holder.ivNews);
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-01-07
    • 2014-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-06
    • 2021-04-19
    • 1970-01-01
    相关资源
    最近更新 更多