为什么RecyclerView onBindViewHolder只调用一次?

时间:2016-03-16 10:03:25

标签: java android android-recyclerview recycler-adapter

我的代码中有一个奇怪的错误。我使用Recycler View(过去使用没有任何问题)。我创建了测试ArrayList以在Recycler中显示它,但是我在RecyclerView中获得了唯一的第一行,之后,应用程序停止(不是崩溃),就像ArrayList一样。

我的主要代码:

<script>
$(document).on("click", "#menu", function(e) {

    /*$("#main").load("main.html");*/

    if ($("#menu").text() == "Web1"){
        $("#main").html('<object data="http://www.myweb1.com"/>');
    }
    if ($("#menu").text() == "Web2"){
        $("#main").html('<object data="http://www.myweb2.com"/>');
    }
    if ($("#menu").text() == "Web3"){
        $("#main").html('<object data="http://www.myweb3.com"/>');
    }
    if ($("#menu").text() == "Web4"){
        $("#main").html('<object data="http://www.myweb3.com"/>');
    }

    });

</script>

适配器:

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

5 个答案:

答案 0 :(得分:9)

起初,Febi Mathew,谢谢你试图帮助我。

我找到了解决方法。

我在Gradle的原创作品是

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

在我为Recycler做样品之后,我尝试了旧版本

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

它完美无缺。所以我想这不是我的错误=)。如果您知道如何报告此错误,欢迎您这样做。

更新:  出了什么问题我没有为我的项目设置layout-height作为换行内容。而且由于我不了解旧版本的原因并不重要,但是在一个新的版本上,它只占用了我的所有屏幕而且我没想过试图将其滑下来。

答案 1 :(得分:4)

我也遇到了同样的问题,因为设置了错误的高度参数。

它应该是 wrap_content ,但我设置了layout-height = match_parent。

因此第一个列表项将占据列表视图中的所有空间,因此它只显示一个列表项。

答案 2 :(得分:3)

检查项目布局高度的最外层元素是否未设置为“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>

答案 3 :(得分: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);
}

答案 4 :(得分: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'
   >             }
   >         }
   >     } }

因此,除了&#34; multidex&#34;之外,所有支持版本都已升级到25.3.0。这意味着recyclerview版本也升级了。

这是问题,在运行构建之后,我的recyclelerview onbindviewholder方法没有被调用。

在评论上面的代码并运行后,我能找到这个原因,能够使用我的recyclerview

希望这对某人有用。

此致 维诺德