У меня есть два текстовых вида рядом со мной в элементе RecyclerView. В одном из представлений layout_weight = "1", чтобы увидеть другое вид, если вид широко.RecyclerView item layout_weight, размеры не обновляются
Проблема заключается в том, что размеры вида не обновляются, когда просмотры переработаны, поэтому для textView id: ширина имени неверна, когда я просматриваю список.
Должен ли я каким-то образом заставить просмотр обновить макет?
Мой RecyclerView пункт:.
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="16dp"
android:gravity="center_vertical"
android:orientation="horizontal">
<TextView
android:id="@+id/name"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginRight="8dp"
android:layout_weight="1"
android:ellipsize="end"
android:maxLines="1" />
<LinearLayout
android:id="@+id/code_container"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:background="@drawable/background_code"
android:orientation="vertical">
<TextView
android:id="@+id/code"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:ellipsize="end"
android:paddingBottom="1dp"
android:paddingLeft="7dp"
android:paddingRight="7dp"
android:paddingTop="1dp"
android:singleLine="true"/>
</LinearLayout>
</LinearLayout>
Im использованием RecyclerView V 23.4.0.
Update
1. Я попытался назвать мой RecyclerView пункт корневой макет requestLayout в конце адаптера onBindViewHolder().
Это не повлияло, мои взгляды не обновляются.
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
...
viewHolder.mLayoutRoot.requestLayout();
}
2. Может быть, проблема в том, что точка зрения еще не полностью погасил, когда я называю requestLayout? Поэтому я попытался установить GlobalLayoutListener и вызвать requestLayout. Я думаю, что это мало помогает, но, если у меня есть достаточно предметов, в моем списке не все просмотры обновляются. Owerall в моем списке у меня около 10 предметов.
ViewTreeObserver vto = viewHolder.mLayoutRoot.getViewTreeObserver();
vto.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
viewHolder.mLayoutRoot.requestLayout();
}
});
3. Я пытался использовать TableLayout с shrinkColumns собственности подойти подобное расположение, но результат тот же. Имя текстового вида widht не всегда правильно задано. Кроме того, он выглядит как requestLayout не влияет на все (или я звоню его в неположенном месте?)
4. (28/8/2016)
Я урезанная мой код, чтобы обнажить минимум до воспроизведите это.
Мне удалось исправить это с помощью setIsRecyclable (false), как предлагает dosssik, но я думаю, что это не очень хорошее решение с точки зрения производительности?
Вот мой полный элемент списка:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="wrap_content"
android:layout_height="150dp"
android:layout_marginLeft="16dp"
android:orientation="horizontal">
<TextView
android:id="@+id/name"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginRight="8dp"
android:layout_weight="1"
android:ellipsize="end"
android:maxLines="1" />
<TextView
android:id="@+id/code"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/background_stop_code_small"
android:ellipsize="end"
android:paddingBottom="1dp"
android:paddingLeft="7dp"
android:paddingRight="7dp"
android:paddingTop="1dp"
android:singleLine="true"
android:textSize="11sp"/>
</LinearLayout>
Мой адаптер Код:
Я также попытался вызвать Invalidate(), но не может видеть никакого влияния.
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
Item item = getItem(position);
NormalViewHolder viewHolder = (NormalViewHolder) holder;
viewHolder.mName.setText(item.getName());
//viewHolder.mName.invalidate(); // No help
viewHolder.mCode.setText(item.getCode());
//viewHolder.mCode.invalidate(); // No help
}
Ожидаемое поведение:
+----------------------------------------+
|[Name][Code] |
+----------------------------------------+
|[Name qwertyuiopasdfghjklzxcvb...][Code]|
+----------------------------------------+
Это как работает прямо сейчас, если я перечисляю список вверх/вниз. Поэтому макет не обновляется, а код не выравнивается, чтобы его можно было назвать. Также имя не занимает всегда достаточно места.
+----------------------------------------+
|[Name][Code] |
+----------------------------------------+
|[Name qwer...] [Code] |
+----------------------------------------+
|[Name qwertyuiopa][Code] |
+----------------------------------------+
|[Name qwe] [Code] |
+----------------------------------------+
Не могли бы вы разместить фото/видео о проблеме? А также вы могли бы опубликовать полный код реализации метода 'onBindViewHolder'? – rom4ek
Снимок экрана, пожалуйста? –
Почему второе текстовое изображение в линейном режиме? позаботьтесь о том, чтобы разработать для меня логику здесь? – Elltz