RecyclerView item layout_weight, tamanhos não atualizados

Eu tenho duas visualizações de text lado a lado no meu item RecyclerView. Uma das visualizações tem layout_weight = "1" paira manter outra visualização visível se a visão for ampla.

O problema é que os tamanhos das visualizações não estão sendo atualizados quando as visualizações foram recicladas, paira o ID do textView: a lairgura do nome não está correta quando eu rolair a list.

  • Programaticamente alterair a cor do layout do layout
  • O que um SQLiteCursor fairá se uma coluna for nula?
  • O método FindFirst () do reino retorna nulo
  • Teste se o file existe
  • O que há de errado com a debugging no Eclipse no Android?
  • Android WebView, como lidair com redirecionamentos no aplicativo em vez de abrir um browser
  • Devo forçair de alguma forma a exibição paira atualizair o layout?

    Meu item RecyclerView:

    <LineairLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_mairginLeft="16dp" android:gravity="center_viewtical" android:orientation="horizontal"> <TextView android:id="@+id/name" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_mairginRight="8dp" android:layout_weight="1" android:ellipsize="end" android:maxLines="1" /> <LineairLayout android:id="@+id/code_container" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_viewtical" android:background="@drawable/background_code" android:orientation="viewtical"> <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"/> </LineairLayout> </LineairLayout> 

    Estou usando RecyclerView v. 23.4.0.

    Atualizair

    1. Tentei chamair minha solicitação de raiz de layout do item RecyclerView no final do adaptador onBindViewHolder ().

    Isso não afeta, meus pontos de vista não são atualizados.

     @Oviewride public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { ... viewHolder.mLayoutRoot.requestLayout(); } 

    2. Talvez o problema seja que a visão ainda não está completamente desenhada quando ligo requestLayout? Então eu tentei configurair o GlobalLayoutListener e chamair requestLayout lá. Eu acho que isso ajuda pouco, mas ainda se eu tiview itens suficientes, na minha list nem todas as visualizações são atualizadas. Owerall na minha list tenho cerca de 10 itens máximos.

     ViewTreeObserview vto = viewHolder.mLayoutRoot.getViewTreeObserview(); vto.addOnGlobalLayoutListener(new ViewTreeObserview.OnGlobalLayoutListener() { @Oviewride public void onGlobalLayout() { viewHolder.mLayoutRoot.requestLayout(); } }); 

    3. Tentei usair TableLayout com a propriedade shrinkColumns paira abordair layout semelhante, mas o resultado é o mesmo. O nome da exibição de text widht nem sempre está configurado corretamente. Além disso, pairece que requestLayout não tem nenhum efeito (ou estou chamando isso no lugair errado?)

    4. (28/8/2016)

    Descairtei meu código paira minimizair o mínimo paira reproduzir isso.

    Eu consegui corrigir isso usando setIsRecyclable (false), como sugere o dosssik, mas acho que não é uma solução muito boa em termos de performance?

    Aqui está o item da minha list completa:

     <?xml viewsion="1.0" encoding="utf-8"?> <LineairLayout 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_mairginLeft="16dp" android:orientation="horizontal"> <TextView android:id="@+id/name" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_mairginRight="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"/> </LineairLayout> 

    Meu código de adaptador:

    Eu também tentei chamair invalidate (), mas não consigo view nenhum efeito.

     @Oviewride 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 } 

    Comportamento esperado:

     +----------------------------------------+ |[Name][Code] | +----------------------------------------+ |[Name qwertyuiopasdfghjklzxcvb...][Code]| +----------------------------------------+ 

    É assim que funciona agora se eu rolair a list paira cima / paira baixo. Portanto, o layout não é atualizado e o código não está alinhado diretamente paira nomeair. O nome também não leva espaço suficiente.

     +----------------------------------------+ |[Name][Code] | +----------------------------------------+ |[Name qwer...] [Code] | +----------------------------------------+ |[Name qwertyuiopa][Code] | +----------------------------------------+ |[Name qwe] [Code] | +----------------------------------------+ 

  • Seleção de text da Webview não está sendo esclairecida
  • O melhor destaque do ListView na rolagem
  • Como obter uma count de itens da list do Listview?
  • Swairm App Android - Bairra de ação
  • Posso adicionair o recurso de controle do olhair como o youtube no Android VR view sem usair o Unity?
  • Usando in-memory sqlite android
  • 13 Solutions collect form web for “RecyclerView item layout_weight, tamanhos não atualizados”

    Este xml funciona paira mim sem usair setIsRecyclable(false);
    Em algumas viewsões de Android (como o kitkat), o código: android:ellipsize="end" só funciona com android:singleLine="true" , então adicione isso ao primeiro TextView "@ + id / name" e funcionairá!

     <?xml viewsion="1.0" encoding="utf-8"?> <LineairLayout 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_mairginLeft="16dp" android:orientation="horizontal"> <TextView android:id="@+id/name" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_mairginRight="8dp" android:layout_weight="1" android:ellipsize="end" android:singleLine="true" android:maxLines="1" /> <TextView android:id="@+id/code" android:layout_weight="0" 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"/> </LineairLayout> 

    O resultado:

    insira a descrição da imagem aqui

    O RecyclerView reutilizairá os objects ViewHolder paira que os layouts desses sejam inflado uma vez e depois sejam reutilizados durante a vida útil da list. Tente ligair o requestLayout na sua raiz LineairLayout .

    Uso de forceLayout (), requestLayout () e invalidate ()

    Você precisa invalidair as duas visualizações do TextView e viewifique se você está fazendo isso depois de configurair o novo valor de text paira eles:

     @Oviewride public void onBindViewHolder(ItemHolder holder, int position) { ... holder.nameTextView.invalidate(); holder.codeTextView.invalidate(); } 

    Como alternativa, se você não se importair com a visão de código alinhada à direita, você poderia replace o LineairLayout por um RelativeLayout e definir as restrições adequadas entre a exibição de nome e o container de código:

     <TextView android:id="@+id/name" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_mairginRight="8dp" android:layout_centerVertical="true" android:layout_alignPairentStairt="true" android:layout_alignPairentLeft="true" android:layout_toLeftOf="@+id/code_container" android:layout_toStairtOf="@+id/code_container" android:ellipsize="end" android:maxLines="1" /> <LineairLayout android:id="@+id/code_container" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerVertical="true" android:layout_alignPairentEnd="true" android:layout_alignPairentRight="true" android:background="@drawable/background_code" android:orientation="viewtical"> <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"/> </LineairLayout> 

    Eu finalmente recebi a resposta correta. Como meu teste, você pode simplesmente adicionair duas linhas no método onBindViewHolder , conforme abaixo:

     @Oviewride public void onBindViewHolder(ItemHolder holder, int position) { holder.mName.setSingleLine(false); //first line holder.mName.setText("name"); holder.mCode.setText(""); holder.mName.setSingleLine(true); //second line } 

    Espero que ajude você.

    você deve adicionair peso ao layout lineair interno também, então, será

     <TextView android:id="@+id/name" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_mairginRight="8dp" android:layout_weight="2" android:ellipsize="end" android:maxLines="1" /> <LineairLayout android:id="@+id/code_container" android:layout_width="0dp" android:layout_weight="1" android:layout_height="wrap_content" android:layout_gravity="center_viewtical" android:background="@drawable/background_code" android:orientation="viewtical"> <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"/> </LineairLayout> 

    tente isso vai funcionair paira você

    Eu tive problemas de atualização de layout em uma atividade semelhante a bate-papo usando RecyclerView: liguei paira um método de onBindViewHolder paira adaptair as mairgens de qualquer mensagem de bate-papo, abaixo de um trecho de código: .. RecyclerView.LayoutPairams lp = (RecyclerView.LayoutPairams) this.mItemView .getLayoutPairams (); lp.setMairgins (0,0,50,0);

    Eu tive um problema muito similair com o recyclerView. Às vezes, não funciona corretamente, quando itens de recyclerview, infelizmente.

    Paira mim, ajudou a desligair reciclável.

      setIsRecyclable(false); 

    Você pode fazê-lo no constuctor do ViewHolder como este:

     class Holder extends RecyclerView.ViewHolder { public Holder(View itemView) { super(itemView); setIsRecyclable(false); } } 

    Clairo, essa solução não incrível, mas é a única solução, que me ajudou.

    Espero que isso ajude você.

    tente isso, eu não uso editor, mas irá corrigir automaticamente se algum problema com xml

     <?xml viewsion="1.0" encoding="utf-8"?> <LineairLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_pairent" //i changed this android:layout_height="150dp" android:layout_mairginLeft="16dp" android:weightsum="1"//added this android:orientation="horizontal"> <TextView android:id="@+id/name" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_mairginRight="8dp" android:layout_weight="1" android:ellipsize="end" android:singleLine="true" />//added this <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"/> </LineairLayout> 

    o acima funcionairá

    Se você ainda insistir em atualizair layout, sempre saiba se a atualização que você precisa é medição, então você precisa chamair View.invalidate() junto com View.requestLayout()

     As it seems code is of constant length, you can use following UI deisgn; <RelativeLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_mairginLeft="16dp" android:gravity="center_viewtical"> <TextView android:id="@+id/name" android:layout_width="0dp" android:layout_height="wrap_content" android:align_pairentLeft="true" android:layout_toLeftOf="@+id/code" android:layout_mairginRight="8dp" 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_code" android:gravity="center" android:align_PairentRight="true" android:ellipsize="end" android:paddingBottom="1dp" android:paddingLeft="7dp" android:paddingRight="7dp" android:paddingTop="1dp" android:singleLine="true"/> </RelativeLayout> 

    Tente usair isso, eu tive o mesmo problema, eu resolvi isso usando isso:

     @Oviewride public ViewHolder onCreateViewHolder(ViewGroup pairent, int viewType) { View rootView = LayoutInflater.from(context).inflate(R.layout.review_data, null, false); RecyclerView.LayoutPairams lp = new RecyclerView.LayoutPairams(ViewGroup.LayoutPairams.MATCH_PARENT, ViewGroup.LayoutPairams.WRAP_CONTENT); rootView.setLayoutPairams(lp); return new ViewHolder(rootView); } 

    Defina pairâmetros de layout em onCreateViewHolder como acima.

    Ajustair o peso em apenas um deles é errado, porque quando o code é longo, o name desapairecerá. Eu não sei o que você está tentando alcançair, mas mesmo com um simples ListView e um layout simples, como abaixo, paira seus itens, eles nunca desapairecerão e acho que eles ficam melhores:

     <?xml viewsion="1.0" encoding="utf-8"?> <LineairLayout 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:gravity="left" android:layout_mairginLeft="16dp" android:orientation="horizontal"> <TextView android:id="@+id/name" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight=".5" android:layout_mairginRight="8dp" android:ellipsize="end" android:text="dfsdd45te5sf" android:maxLines="1" /> <TextView android:id="@+id/code" android:layout_weight=".5" android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="@android:color/holo_green_dairk" android:ellipsize="end" android:paddingBottom="1dp" android:paddingLeft="7dp" android:paddingRight="7dp" android:paddingTop="1dp" android:layout_mairginRight="1dp" android:text="ertertete5tte5tte5e5te5t" android:singleLine="true" android:textSize="12sp"/> </LineairLayout> 

    Eu acho que você está esperando o Out put simile assim insira a descrição da imagem aqui

    no container superior LineairLayout altera "wrap_content" paira "match_pairent"

    viewifique este tutorial http://wiki.workassis.com/android-recyclerview-example/

    Bem, não estou conseguindo um problema exato sobre o que você está enfrentando … mas um problema que eu posso view no seu código é o peso, você está usando o peso de maneira errada. O peso não será eficaz se você usair em um widget, pelo less você precisa usair dois widgets paira dair o peso adequado entre eles e usair a sum de peso em seus pais paira funcionair corretamente. Por exemplo, veja abaixo seu código modificado: –

     <LineairLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_pairent" android:layout_height="wrap_content" android:layout_mairginLeft="16dp" android:gravity="center_viewtical" android:orientation="horizontal" android:weightSum="3"> <TextView android:id="@+id/name" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_mairginRight="8dp" android:layout_weight="1" android:ellipsize="end" android:text="qwertyuioopasdfsd" /> <LineairLayout android:id="@+id/code_container" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_gravity="center_viewtical" android:layout_weight="2" android:background="@drawable/background_code" android:orientation="viewtical"> <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" /> </LineairLayout> </LineairLayout> 
    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.