1

因为我更新到com.android.support.constraint:constraint-layout:1.0.0-beta5我使用的是在RecyclerAdapterConstraintLayout公测5的ImageView在RecyclerView缩放问题

使用ConstraintLayout内扩展的ImageView时,我已经和至少步骤演示项目的观察奇怪的行为重现:

行是非常简单的:报头和图像:

<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" 
             xmlns:app="http://schemas.android.com/apk/res-auto" 
             android:layout_width="match_parent" 
             android:layout_height="wrap_content" 
> 

<View 
    android:id="@+id/header" 
    android:layout_width="0dp" 
    android:layout_height="10dp" 
    app:layout_constraintLeft_toLeftOf="parent" 
    app:layout_constraintRight_toRightOf="parent" 
    app:layout_constraintTop_toTopOf="parent" 
    /> 

<ImageView 
    android:id="@+id/image" 
    android:layout_width="0dp" 
    android:layout_height="wrap_content" 
    android:adjustViewBounds="true" 
    android:scaleType="centerInside" 
    app:layout_constraintLeft_toLeftOf="parent" 
    app:layout_constraintRight_toRightOf="parent" 
    app:layout_constraintTop_toBottomOf="@+id/header" 
    /> 

适配器看起来是这样的:

public class RecAdapter extends RecyclerView.Adapter<BooleanViewHolder> { 

private List<Boolean> list; 

public RecAdapter(ArrayList<Boolean> list) { 
    this.list = list; 
} 

@Override 
public BooleanViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    return new BooleanViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.row, parent, false)); 
} 

@Override 
public void onBindViewHolder(BooleanViewHolder holder, int position) { 

    holder.header.setBackgroundColor(list.get(position) ? Color.parseColor("#00FF00") : Color.parseColor("#FF0000")); 

    holder.image.setImageDrawable(null); 
    if (list.get(position)) { 
     holder.image.setVisibility(View.VISIBLE); 
     holder.image.setImageDrawable(holder.image.getContext().getResources().getDrawable(R.drawable.remove_me)); 
    } else { 
     holder.image.setVisibility(View.GONE); 
    } 
} 

@Override 
public int getItemCount() { 
    return list.size(); 
} 


static class BooleanViewHolder extends RecyclerView.ViewHolder { 
    private final ImageView image; 
    private final View header; 

    BooleanViewHolder(View itemView) { 
     super(itemView); 
     header = itemView.findViewById(R.id.header); 
     image = (ImageView) itemView.findViewById(R.id.image); 
    } 
} 
} 

RecyclerView和适配器如下初始化:

 recView = (RecyclerView) findViewById(R.id.recView); 
//  final StaggeredGridLayoutManager layoutManager = new StaggeredGridLayoutManager(1, StaggeredGridLayoutManager.VERTICAL); 
     LinearLayoutManager layoutManager = new LinearLayoutManager(this); 
     recView.setLayoutManager(layoutManager); 
     ArrayList<Boolean> list = new ArrayList<>(); 
     list.add(true); 
     list.add(false); 
     list.add(true); 
     list.add(false); 
     list.add(true); 
     list.add(false); 
     list.add(true); 
     list.add(false); 
     recView.setAdapter(new RecAdapter(list)); 

演示功能: 如果true头颜色为绿色,并显示图像。 如果false标题显示为红色,并且隐藏了ImageView。在RecyclerView上下滑动

后的结果:使用beta-5(左)和beta-4

(右):

enter image description here

我同时使用没有与API 24 & API 19测试StaggeredGridLayoutManagerLinearLayoutManager

我知道这看起来更像Google的问题报告(AOSP issue),但我会为此目的使用该帖子,除非有人指出我犯的错误或解决方法。

回答

0

该问题已由Google在图书馆的主分支中解决,并且将在下一个版本后正常运行。

0

我相信这是一个beta5中的bug,wrap_content。我提交了一个bug,并与一位致力于ConstraintLayout的Google工程师交谈。他证实了这个错误,转载了它,然后在几天后他将它修复为master,所以我预计它将在下一个版本(未知日期)得到修复。

该错误报告位于here

注意这是Fixed in master.从2天前。

+1

我认为这些问题是无关的,虽然相似。谷歌已经把这一个合并到了20分钟前的主人。无论如何感谢您的答复 –