【问题标题】:Images loaded with picasso in recycler view in android disappear when changing visibility of a view within the listitem更改列表项中视图的可见性时,在android的回收器视图中加载毕加索的图像会消失
【发布时间】:2017-08-26 18:09:00
【问题描述】:

所以我有一个回收器视图,其中加载了包含文本和图像的项目以及一个复选框。最初加载所有数据都很好,包括使用毕加索的图像。该复选框最初是隐藏的,一旦我点击一个按钮,这不是回收站视图的一部分。复选框应出现在回收站视图的所有项目中。一切正常,除了图像一旦我这样做就会消失。

我这样做的方式是将我的 recyclerview 的适配器设置为 null,然后初始化一个新的 recycler view 适配器,该适配器具有可见的复选框并将其设置为我的 recycler 视图。

如果我尝试使用顶部的搜索栏搜索特定列表项,也会发生同样的事情。知道为什么吗?这是关于我如何将适配器设置为我的回收站视图的代码。

  // set the adapter to null on cards list view.
  cards_list_view.setAdapter(null);

 // Initialize the adapter again.
 deckCardRecycleAdapter = new DeckCardRecycleAdapter(getActivity(), cards_list, show_checkbox);

// Set the adapter again to list view.                          
 cards_list_view.setAdapter(deckCardRecycleAdapter);

这是我在适配器中的 onBindViewHolder 函数。

 @Override
public void onBindViewHolder(final ViewHolder viewHolder, final int position) {

    typeface = Typeface.createFromAsset(context.getAssets(), "fonts/futura-medium.otf");

    viewHolder.user_name.setTypeface(typeface);
    viewHolder.user_name.setText(cards.get(position).getName().toString());

    viewHolder.position.setTypeface(typeface);
    viewHolder.position.setText(cards.get(position).getPosition().toString());

    viewHolder.dot.setTypeface(typeface);

    viewHolder.event_saved.setTypeface(typeface);

    if(cards.get(position).getEvent_name().toString().equals("None")) {
        viewHolder.event_saved.setVisibility(View.GONE);
        viewHolder.dot.setVisibility(View.GONE);
    }
    else
        viewHolder.event_saved.setText(cards.get(position).getEvent_name().toString());

    viewHolder.date_saved.setTypeface(typeface);
    String timestamp = cards.get(position).getTimestamp().toString();
    viewHolder.date_saved.setText(toDate(timestamp));


    if(cards.get(position).image_url.toString().equals("None"))
        viewHolder.user_image.setImageResource(R.drawable.anonymous);
    else {

        String url_image = cards.get(position).image_url.toString();
        Picasso.with(this.context).cancelRequest(viewHolder.user_image);
        Picasso.with(context).load(url_image).into(new Target() {
            @Override
            public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) {

                viewHolder.user_image.setImageBitmap(bitmap);
                cards.get(position).setImage_url(getStringImage(bitmap));
            }

            @Override
            public void onBitmapFailed(Drawable errorDrawable) {

            }

            @Override
            public void onPrepareLoad(Drawable placeHolderDrawable) {

            }
        });

    }

请帮忙。提前致谢。

【问题讨论】:

    标签: android android-recyclerview picasso android-image


    【解决方案1】:

    我不认为每次都重新加载数据是一个好主意,它会带来很多性能,而不是您可以创建界面并让项目监听它,并且只需一行代码就可以更改可见性

    查看this answer

    interface Listener { 
    public void onVisibilityChanged(bool visible); 
    }
    
    • 创建界面(设置可见/不可见的布尔参数)

    • 为管理监听器创建单独的类 (like this)

    • 为每个项目添加监听器(使复选框可见或不可见)

    • 删除项目时删除侦听器(避免 NullpointException)

    • 如果回收器重置,则清除侦听器(避免 NullpointException)

    • 调用有foreach的方法,所有的监听器都会被触发

    【讨论】:

      猜你喜欢
      • 2017-06-15
      • 1970-01-01
      • 2017-08-31
      • 2014-07-04
      • 2018-10-03
      • 1970-01-01
      • 2019-11-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多