2015-03-05 37 views
6

Próbuję wyświetlić zagnieżdżony widok recyclerview, ale elementy podrzędne nie są wyświetlane. Chcę wyświetlać różne elementy we wszystkich widokach podrzędnych. Nie widzę błędu, ale widok nie jest odświeżany.zagnieżdżony widok recyclerview z Androidem

Oto mój kod może pomóc.

Dzięki

public class MainActivity extends ActionBarActivity { 

    RecyclerView recyclerView; 
    RootAdapter adapter; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     adapter = new RootAdapter(this); 
     recyclerView = (RecyclerView) findViewById(R.id.recyclerRoot); 
     recyclerView.setLayoutManager(new LinearLayoutManager(this)); 
     recyclerView.setAdapter(adapter); 

    } 

private class RootAdapter extends RecyclerView.Adapter<RootAdapter.RootViewHolder> { 

     private final LayoutInflater inflater; 
     String[] _items = new String[]{"ITEM 1", "ITEM 2", "ITEM 3", "ITEM 4"}; 
     public RootAdapter(Context context) 
     { 
      inflater = LayoutInflater.from(context); 
     } 

     @Override 
     public RootViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) { 
      View view = inflater.inflate(R.layout.root_row, viewGroup, false); 
      RootViewHolder rvi = new RootViewHolder(view); 
      return rvi; 
     } 

     @Override 
     public void onBindViewHolder(RootViewHolder rootViewHolder, int i) { 
      rootViewHolder.txtRootLine.setText(_items[i]); 
      rootViewHolder.recyclerViewChild.setLayoutManager(new LinearLayoutManager(inflater.getContext())); 
      rootViewHolder.recyclerViewChild.setAdapter(new ChildAdapter(inflater)); 
     } 

     @Override 
     public int getItemCount() { 
      return _items.length; 
     } 

     class RootViewHolder extends RecyclerView.ViewHolder { 
      TextView txtRootLine; 
      RecyclerView recyclerViewChild; 
      public RootViewHolder(View itemView) { 
       super(itemView); 
       txtRootLine = (TextView) itemView.findViewById(R.id.txtRootLine); 
       recyclerViewChild = (RecyclerView) itemView.findViewById(R.id.recyclerChild); 
      } 
     } 
    } 


private class ChildAdapter extends RecyclerView.Adapter<ChildAdapter.ChildViewHolder> { 
     private LayoutInflater _inflater; 
     String[] _childItems = new String[]{"child 1", "child 2", "child 2"}; 
     public ChildAdapter(LayoutInflater inflater) { 
      _inflater = inflater; 
     } 

     @Override 
     public ChildViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) { 
      View view = _inflater.inflate(R.layout.child_row, viewGroup, false); 
      ChildViewHolder rvi = new ChildViewHolder(view); 
      return rvi; 
     } 

     @Override 
     public void onBindViewHolder(ChildViewHolder childViewHolder, int i) { 
      childViewHolder.txtChildLine.setText(_childItems[i]); 
     } 

     @Override 
     public int getItemCount() { 
      return _childItems.length; 
     } 

     public class ChildViewHolder extends RecyclerView.ViewHolder { 
      TextView txtChildLine; 
      public ChildViewHolder(View itemView) { 
       super(itemView); 
       txtChildLine = (TextView) itemView.findViewById(R.id.txtChildLine); 
      } 
     } 
    } 


activity_main.xml 

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical"> 

    <TextView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="main text"/> 

    <android.support.v7.widget.RecyclerView xmlns:android="http://schemas.android.com/apk/res/android" 
     xmlns:tools="http://schemas.android.com/tools" 
     android:id="@+id/recyclerRoot" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content"> 
    </android.support.v7.widget.RecyclerView> 

</LinearLayout> 

root_row.xml 

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <TextView 
     android:id="@+id/txtRootLine" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" /> 

    <android.support.v7.widget.RecyclerView xmlns:android="http://schemas.android.com/apk/res/android" 
     xmlns:tools="http://schemas.android.com/tools" 
     android:id="@+id/recyclerChild" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content"> 
    </android.support.v7.widget.RecyclerView> 

</LinearLayout> 


child_row.xml 

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <TextView 
     android:id="@+id/txtChildLine" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" /> 

</LinearLayout> 
+0

hej, czy znalazłeś jakieś rozwiązanie? –

+3

możliwy duplikat [Jak uzyskać widok ListView/RecyclerView wewnątrz nadrzędnego widoku RecyclerView ?. Mam listę nadrzędną, która zawiera listy dzieci na każdej pozycji] (http://stackoverflow.com/questions/32011995/how-to-have-a-listview-recyclerview-inside-a-parent-recyclerview-i- have-a-pare) – Mogsdad

+0

Nie powinieneś tworzyć nowych adapterów w onBindView(), powinieneś to zrobić tylko raz. Proszę spojrzeć na [tę bibliotekę] (https://github.com/vivchar/RendererRecyclerViewAdapter) Myślę, że to pomoże ci – Vitaly

Odpowiedz

-1

RecyclerView nie obsługuje wrap_content.Set jakąś wartość w zagnieżdżonych widzenia recyklera jak 200dp i twój rzecz pokazy. Więcej dyskusji dostępnych here

+0

To nie Rozwiąż problem. –

+0

To się zmieniło wraz z najnowszą wersją, możesz teraz użyć wrap_content dla swojego RecyclerView. Edycja: Źródło -> http://android-developers.blogspot.se/2016/02/android-support-library-232.html – zoltish

2

Istniejący menedżer układu nie obsługuje jeszcze zawijania treści. Przetestuj go, przypisując stałą wysokość do urządzenia recyklingowego, a pojawi się widok.

Jako rozwiązanie tego problemu można utworzyć nowy menedżer LayoutManager, który rozszerza istniejący i nadpisuje metodę onMeasure, aby zmierzyć zawartość zawijania.

0

Android Wsparcia Biblioteki 23,2 biblioteki wsparcia wersji 23.2.0. Więc wszystkie WRAP_CONTENT powinny działać poprawnie.

Zaktualizuj wersję biblioteki w pliku gradle.

compile 'com.android.support:recyclerview-v7:23.2.0' 
+0

Nadal wszystkie wiersze są niewidoczne –