在更改listitem中视图的可见性时,在android中的回收器视图中加载毕加索的图像会消失

时间:2017-08-26 18:09:00

标签: android android-recyclerview picasso android-image

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

我这样做的方法是将我的recyclerview的适配器设置为null,然后初始化一个新的Recycler视图适配器,该适配器具有可见的复选框并将其设置为我的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) {

            }
        });

    }

请帮忙。提前致谢。

1 个答案:

答案 0 :(得分:0)

我不认为每次重新加载数据都是一个好主意,它会产生很多性能,而你可以创建界面并让项目听取它,只需一行代码就可以改变可见性< / p>

检查this answer

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

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

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

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

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

  • 调用具有foreach的方法,并且将对所有侦听器进行分类