[英]why payloads in RecyclerView' onBindViewHolder is a list?
[英]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.