2016-03-16 18 views
7

Có lỗi lạ trong mã của tôi. Tôi sử dụng Recycler View (được sử dụng trong quá khứ mà không có bất kỳ vấn đề gì). Tôi tạo ra ArrayList thử nghiệm để hiển thị nó trong Recycler nhưng tôi nhận được hàng đầu tiên duy nhất trong RecyclerView và sau đó, ứng dụng dừng lại (không bị treo) như ArrayList đã kết thúc.Tại sao RecyclerView onBindViewHolder chỉ được gọi một lần?

Mã chính của tôi:

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

Adaptor:

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

Chủ:

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


} 

Trả lời

7

Lúc đầu, Febi Mathew, cảm ơn bạn đã cố gắng giúp tôi với điều này.

Tôi đã tìm cách khắc phục.

dòng ban đầu của tôi trong Gradle là

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

sau khi tôi đã làm mẫu chỉ dành riêng cho Recycler và nó là như nhau, tôi đã cố gắng một phiên bản cũ

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

Và nó làm việc một cách hoàn hảo. Vì vậy, tôi cho rằng đó không phải là lỗi của tôi =). Nếu bạn biết cách báo cáo lỗi này, bạn có thể làm điều đó.

Cập nhật: Điều gì đã xảy ra là tôi không đặt chiều cao bố cục cho mục của tôi là nội dung bọc. Và từ lý do mà tôi không hiểu trên phiên bản cũ nó không quan trọng nhưng trên một cái mới nó chỉ mất tất cả màn hình của tôi và tôi đã không nghĩ để cố gắng trượt nó xuống.

+0

Tôi không biết điều đó có quan trọng hay không, nhưng tôi đang làm việc trên phiên bản beta 6 của Android Studio 2.0 – Slava

+0

Có thể là một vấn đề xảy ra ngay lập tức. Bạn đã thử cài đặt sạch một bản dựng sạch với thư viện 23.2 chưa? – WarrenFaith

+0

WarrenFaith, không phải như vậy chắc chắn những gì bạn có nghĩa là (Bạn đã thử một cài đặt sạch của một xây dựng sạch với thư viện 23,2?) Nhưng đây không phải là hơn =) Ngày thử nghiệm đơn giản của tôi RecyclerView nó làm việc như tôi đã nói trước đây, nhưng trên dự án của tôi nó có hiệu ứng cũ. Tôi nghĩ rằng tôi sẽ cố gắng gỡ cài đặt bản beta và thử tương tự trên bản phát hành ổn định của Android Studio. – Slava

0

Bạn có thể thử loại này?

@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 là @ Override, vì vậy tôi không thể thay đổi đối số của nó. – Slava

+0

Thay thế "mở rộng RecyclerView.Adapter " bằng "mở rộng RecyclerView.Adapter " –

+0

Tại sao anh ta nên thay thế khi OrderHolder mở rộng từ RecyclerView.ViewHolder? Không cần thiết cho điều đó trong trường hợp này là – WarrenFaith

3

Tôi cũng gặp phải vấn đề tương tự vì thông số chiều cao sai được đặt.

Nó phải là wrap_content, nhưng tôi đặt bố cục-height = match_parent.

Vì vậy, mục danh sách đầu tiên sẽ chiếm tất cả không gian trong chế độ xem danh sách, vì vậy nó chỉ hiển thị một mục danh sách.

1

Kiểm tra xem phần tử ngoài cùng của chiều cao bố cục mặt hàng có được đặt thành giá trị "wrap_content" hay không. Ví dụ:

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

Trước tôi cam kết Recyclerview hỗ trợ phiên bản: 24.2.1

Sau đó tôi được cập nhật build.gradle bằng cách thêm sau:

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

Vì vậy, sau này tất cả các phiên bản hỗ trợ đã được nâng cấp lên 25.3.0 ngoại trừ "multidex". Điều này có nghĩa là phiên bản recyclerview cũng được nâng cấp.

Đây là vấn đề, sau khi điều này chạy một xây dựng Phương pháp onbindviewholder của tôi recyclerview không được gọi.

Bất kỳ làm thế nào tôi tìm thấy nguyên nhân này sau khi bình luận trên mã và chạy, có thể sử dụng recyclerview tôi

Hy vọng điều này có thể hữu ích cho một ai đó.

Trân Vinod

Các vấn đề liên quan