2016-03-16 28 views
7

Mam dziwny błąd w moim kodzie. Używam widoku Recycler (używanego w przeszłości bez żadnego problemu). Stworzyłem test ArrayList do pokazania go w Recycler, ale otrzymałem jedyny pierwszy wiersz w RecyclerView, a po nim aplikacja zatrzymała się (nie uległa awarii) podobnie jak ArrayList.Dlaczego RecyclerView onBindViewHolder został wywołany tylko raz?

Główny Kod:

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    // Inflate the layout for this fragment 
    View view = inflater.inflate(R.layout.fragment_all_tab, container, false); 

    Activity activity = getActivity(); 

    //TODO: For testing ONLY 
    ArrayList<Order> orders = new ArrayList<>(); 
    for(int i = 0; i < 10; i++) { 
     orders.add(new Order(i, i, i)); 
    } 

    // Initialising Orders Recycler View. 
    OrderAdapter orderAdapter = new OrderAdapter(activity, orders); 
    RecyclerView recyclerViewOrders = (RecyclerView) view.findViewById(R.id.recylerViewAllDiners); 
    recyclerViewOrders.setLayoutManager(new LinearLayoutManager(activity)); 
    recyclerViewOrders.setAdapter(orderAdapter); 

    return view; 
} 

Adapter:

package com.slavafleer.tipcalculator; 

import android.content.Context; 
import android.support.v7.widget.RecyclerView; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 

import java.util.ArrayList; 

/** 
* Order Adapter for Order Recycler View 
*/ 
public class OrderAdapter extends RecyclerView.Adapter<OrderHolder> { 

    private Context context; 
    private ArrayList<Order> orders; 

    public OrderAdapter(Context context, ArrayList<Order> orders) { 

     this.context = context; 
     this.orders = orders; 
    } 

    @Override 
    public OrderHolder onCreateViewHolder(ViewGroup parent, int viewType) { 

     LayoutInflater layoutInflater = (LayoutInflater) 
       context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

     View view = layoutInflater.inflate(R.layout.item_order, parent, false); 

     return new OrderHolder(view); 
    } 

    // TODO: why it has been done just once ? 
    @Override 
    public void onBindViewHolder(OrderHolder holder, int position) { 

     Order order = orders.get(position); 

     holder.bindOrder(order); 
    } 

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

Holder:

package com.slavafleer.tipcalculator; 

import android.support.v7.widget.RecyclerView; 
import android.view.View; 
import android.widget.TextView; 

/** 
* Order Holder for Order Recycler View 
*/ 
public class OrderHolder extends RecyclerView.ViewHolder { 

    private TextView textViewOrderId; 
    private TextView textViewDinerId; 
    private TextView textViewPrice; 

    public OrderHolder(View itemView) { 
     super(itemView); 

     textViewOrderId = (TextView) itemView.findViewById(R.id.textViewOrderId); 
     textViewDinerId = (TextView) itemView.findViewById(R.id.textViewDinerId); 
     textViewPrice = (TextView) itemView.findViewById(R.id.textViewPrice); 
    } 

    // Bind Data Object to the Views. 
    public void bindOrder(Order order) { 

     textViewOrderId.setText(order.getOrderId() + ""); 
     textViewDinerId.setText(order.getDinerId() + ""); 
     textViewPrice.setText(order.getPrice() + ""); 
    } 


} 

Odpowiedz

7

Na początku, Febi Mathew, dziękuję, że próbujesz mi w tym pomóc.

Znalazłem, jak to naprawić.

Moja oryginalna linia Gradle był

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

po prostu zrobiłam próbkę do Recycler i to było to samo, próbowałem wersję

compile 'com.android.support:recyclerview-v7:23.1.1' 

I to działało idealnie. Więc przypuszczam, że to nie mój błąd =). Jeśli wiesz, jak zgłosić ten błąd, możesz to zrobić.

Aktualizacja: Co było nie tak, to nie ustawiłem wysokości układu dla mojego przedmiotu jako zawartości wrap. I z tego powodu, którego nie rozumiem w starej wersji, nie miało to znaczenia, ale na nowej po prostu zajmuje cały mój ekran i nie sądziłem, żebym próbował go zrzucić.

+0

Nie wiem, czy jest to ważne, ale pracuję nad wersją beta Androida Studio 2.0 w wersji beta 6 – Slava

+0

Może to być problem z natychmiastowym uruchomieniem. Czy wypróbowałeś czystą instalację czystej kompilacji z biblioteką 23.2? – WarrenFaith

+0

WarrenFaith, nie jestem pewien co masz na myśli (Czy wypróbowałeś czystą instalację czystej kompilacji z biblioteką 23.2?) Ale to nie koniec =) Na moim prostym teście RecyclerView działało tak, jak mówiłem wcześniej, ale w moim projekcie to ma stary efekt. Chyba spróbuję odinstalować wersję beta i wypróbować ją w stabilnej wersji Androida Studio. – Slava

0

można spróbować?

@Override 
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    LayoutInflater layoutInflater = (LayoutInflater) 
      context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

    View view = layoutInflater.inflate(R.layout.item_order, parent, false); 

    return new OrderHolder(view); 
} 

@Override 
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { 
    Order order = orders.get(position); 

    OrderHolder orderHolder = (OrderHolder)holder; 
    orderHolder.bindOrder(order); 
} 
+0

onBindViewHolder jest @Override, więc nie mogę zmienić swoje argumenty. – Slava

+0

Zamień "rozszerza RecyclerView.Adapter " z "rozszerza RecyclerView.Adapter " –

+0

Dlaczego powinien on zastąpić, gdy jest OrderHolder rozciąga się od RecyclerView.ViewHolder? Nie ma takiej potrzeby w tym przypadku – WarrenFaith

3

Napotkano ten sam problem, ponieważ ustawiono nieprawidłowy parametr wysokości.

Powinna to być wrap_content, ale ustawiam wysokość układu = match_parent.

Pierwszy element listy zajmie całe miejsce w widoku listy, więc wyświetli tylko element listy.

1

Sprawdź, czy najbardziej zewnętrzny element wysokości układu przedmiotu jest ustawiony na wartość "wrap_content". Przykład:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout mlns:android="http://schemas.android.com/apk/res/android" 
      xmlns:tools="http://schemas.android.com/tools" 
      android:orientation="vertical" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" // Just like this! 
    > 
    <TextView 
     android:id="@+id/item_title" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
    /> 
</LinearLayout> 
0

mój poprzedni popełnić Recyclerview wersja wsparcia: 24.2.1

Później aktualizowane build.gradle dodając następujący:

> configurations.all { 
    >  resolutionStrategy.eachDependency { DependencyResolveDetails details -> 
    >   def requested = details.requested 
    >   if (requested.group == 'com.android.support') { 
    >    if (!requested.name.startsWith("multidex")) { 
    >     details.useVersion '25.3.0' 
    >    } 
    >   } 
    >  } } 

Więc po tym wszystkim wersje wsparcia zostały zmodernizowane do 25.3.0 z wyjątkiem "wielodrutowego". Oznacza to również uaktualnienie wersji recyclerview.

Oto problem, po uruchomieniu kompilacji Moja metoda viewer nie jest wywoływana.

Wszelkie jak Znalazłem przyczynę po komentując powyższy kod i działa, w stanie korzystać z mojego recyclerview

nadzieję, że to mogą być przydatne dla kogoś.

Pozdrowienia Vinod