2016-03-16 2 views
7

В моем коде есть странная ошибка. Я использую Recycler View (используется в прошлом без каких-либо проблем). Я создал тест ArrayList для показа его в Recycler, но я получил единственную первую строку в RecyclerView, и после нее приложение останавливается (а не падает), как ArrayList, завершено.Почему RecyclerView onBindViewHolder называется только один раз?

Мой Главный Код:

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

адаптер:

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(); 
    } 
} 

Владелец:

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() + ""); 
    } 


} 

ответ

7

Сначала, фев-Мэтью, спасибо, что постарались мне помочь.

Я нашел, как исправить это.

Моя оригинальная линия в Gradle был

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

после того, как я сделал выборку только для Recycler, и это было то же самое, я попробовал старую версию

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

И это сработало отлично. Поэтому я полагаю, что это не моя ошибка =). Если вы знаете, как сообщить об этой ошибке, вы можете это сделать.

Обновление: Что случилось, я не задал высоту макета для моего элемента как содержимое обертки. И из-за разума, которого я не понимаю на старой версии, это не имело значения, но на новом, он просто берет весь мой экран, и я не думал, чтобы попытаться сместить его.

+0

Я не знаю, важно ли это, но я работаю над бета-версией Android Studio 2.0 – Slava

+0

Возможно, проблема с мгновенным запуском. Пробовали ли вы чистую установку чистой сборки с библиотекой 23.2? – WarrenFaith

+0

WarrenFaith, не так уверен, что вы имели в виду (попробовали ли вы чистую установку чистой сборки с библиотекой 23,2?) Но это еще не так =) На мой простой тест RecyclerView он работал, как я уже говорил, но в моем проекте это имеет старый эффект. Я думаю, что я попытаюсь удалить бета-версию и попробовать ее на стабильной версии Android Studio. – Slava

0

Можете ли вы попробовать это?

@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 является @Override, поэтому я не могу изменить свои аргументы. – Slava

+0

Замените свой «extends RecyclerView.Adapter » на «extends RecyclerView.Adapter » –

+0

Зачем ему заменять это, когда OrderHolder распространяется из RecyclerView.ViewHolder? В этом случае нет необходимости – WarrenFaith

3

Я также столкнулся с той же проблемой, потому что установлен неправильный параметр высоты.

Это должно быть wrap_content, но я установил layout-height = match_parent.

Таким образом, первый элемент списка будет занимать все пространство в представлении списка, поэтому он отображает только элемент списка.

1

Проверьте, не превышает ли внешний элемент высоты макета элемента значение «wrap_content». Пример:

<?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

Мой предыдущий коммит версия поддержка Recyclerview: 24.2.1

Позже я обновил build.gradle, добавив следующее:

> 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' 
    >    } 
    >   } 
    >  } } 

Таким образом, после этого все версии поддержки были обновлены до 25.3.0 за исключением "multidex". Это означает, что версия recyclerview также обновлена.

В этом случае проблема заключается в том, что после этого запускается метод my recyclerview onbindviewholder.

Все, как я нашел эту причину после комментариев выше коды и работают, в состоянии использовать свой recyclerview

Надеется, что это, возможно, полезно для кого-то.

С уважением Винод

Смежные вопросы