簡體   English   中英

為什么RecyclerView onBindViewHolder只調用一次?

[英]Why RecyclerView onBindViewHolder called just once?

我的代碼中有一個奇怪的錯誤。 我使用Recycler View(過去使用沒有任何問題)。 我創建了測試ArrayList以在Recycler中顯示它但是我獲得了RecyclerView中唯一的第一行,之后,應用程序停止(不是崩潰)像ArrayList完成。

我的主要代碼:

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


}

起初,Febi Mathew,謝謝你試圖幫助我。

我找到了解決方法。

我在Gradle的原創作品是

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

在我為Recycler做樣品之后,我嘗試了舊版本

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

而且效果很好。 所以我想這不是我的錯誤=)。 如果您知道如何報告此錯誤,歡迎您這樣做。

更新:出了什么問題我沒有為我的項目設置layout-height作為換行內容。 而且從我對舊版本不了解的原因來看並不重要,但是在一個新的版本上,它只占用了我的所有屏幕而且我沒想過試圖將它滑下來。

我也遇到了同樣的問題,因為設置了錯誤的高度參數。

它應該是wrap_content ,但是我設置了layout-height = match_parent。

因此,第一個列表項將占據列表視圖中的所有空間,因此它僅顯示列表項。

檢查項目布局高度的最外層元素是否未設置為“match_parent”值,但設置為“wrap_content”或某個Ndp值。 例:

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

你能試試嗎?

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

我以前的提交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'
   >             }
   >         }
   >     } }

因此,除了“multidex”之外,所有支持版本都已升級到25.3.0。 這意味着recyclerview版本也升級了。

這是問題,在運行構建之后,我的recyclelerview onbindviewholder方法未被調用。

在評論上面的代碼並運行后,我能找到這個原因,能夠使用我的recyclerview

希望這對某人有用。

關心Vinod

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM