Loading [MathJax]/jax/output/CommonHTML/config.js
社区首页 >问答首页 >我的片段中的RecyclerView即使在填充时仍然是空白的

我的片段中的RecyclerView即使在填充时仍然是空白的
EN

Stack Overflow用户
提问于 2019-08-21 09:28:05
回答 2查看 45关注 0票数 0

我在Android上的RecyclerView有以下问题:

每当我尝试用RecyclerView打开片段时,它仍然是空白的。我的ArrayList mList不是空的,它包含数据(我测试过)。

我尝试了很多方法来解决这个问题,但是我是个初学者,所以我不知道问题出在哪里。

RecyclerView应该显示一个产品列表。我认为我的适配器有问题,或者可能xml文件fragment_list没有正确显示?我不太清楚。

我的ListAdaper课程:

代码语言:javascript
代码运行次数:0
复制
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.cardview.widget.CardView;
import androidx.recyclerview.widget.RecyclerView;
import java.util.ArrayList;

public class ListAdapter extends 
RecyclerView.Adapter<ListAdapter.ListViewHolder> {

private Context mContext;
private ArrayList<Item> mList;

public ListAdapter(Context context, ArrayList<Item> list) {

    mContext = context;
    mList = list;

}

@NonNull
@Override
public ListViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    View v = LayoutInflater.from(mContext).inflate(R.layout.list_item, parent, false);
    return new ListViewHolder(v);
}

@Override
public void onBindViewHolder(@NonNull ListViewHolder holder, int position) {
    Item currentItem = mList.get(position);

    holder.textViewName.setText(currentItem.getName());
    holder.textViewRegion.setText(currentItem.getRegion());
}

@Override
public void onAttachedToRecyclerView(@NonNull RecyclerView recyclerView) {
    super.onAttachedToRecyclerView(recyclerView);
}

public static class ListViewHolder extends RecyclerView.ViewHolder {

    public CardView cardView;
    public TextView textViewName;
    public TextView textViewRegion;

    public ListViewHolder(@NonNull View itemView) {
        super(itemView);
        cardView = itemView.findViewById(R.id.cardview);
        textViewName = itemView.findViewById(R.id.item_name);
        textViewRegion = itemView.findViewById(R.id.item_region);
    }
}

@Override
public int getItemCount() {
    return mList.size();
}
}

...my ListFragment类:

代码语言:javascript
代码运行次数:0
复制
import android.content.Context;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import androidx.recyclerview.widget.DefaultItemAnimator;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.JsonObjectRequest;
import com.android.volley.toolbox.Volley;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.ArrayList;
import java.util.Iterator;


public class ListFragment extends Fragment {

private RecyclerView mRecyclerView;
private ListAdapter mListAdapter;
private ArrayList<Item> mList;
private RequestQueue mRequestQueue;
private Context mContext;


@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    View rootview = inflater.inflate(R.layout.fragment_list, container, false);

    mRecyclerView = rootview.findViewById(R.id.recycler_view);
    mRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
    mRecyclerView.setHasFixedSize(true);
    parseJSON();
    mRecyclerView.setAdapter(mListAdapter);
    mRecyclerView.setItemAnimator(new DefaultItemAnimator());
    return rootview;
}

@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
}

@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
}

@Override
public void onAttach(Context context) {
    super.onAttach(context);
    mContext = context;
}

@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    mList = new ArrayList<>();
    mListAdapter = new ListAdapter(mContext, mList);
    mRequestQueue = Volley.newRequestQueue(mContext);

}


private void parseJSON() {

    JsonObjectRequest request = new JsonObjectRequest("http://my_ip/sestavsisvujsvetweb/api/seznammagnetek", null, new Response.Listener<JSONObject>() {

        @Override
        public void onResponse(JSONObject response) {
            JSONObject magnetky = response;
            try {

                Iterator keys = magnetky.keys();
                while (keys.hasNext()) {
                    Object key = keys.next();
                    JSONObject value = magnetky.getJSONObject((String) key);
                    String monumentnumber = value.getString("monumentid");
                    String monumentname = value.getString("name");
                    String monumentregion = value.getString("region");
                    mList.add(new Item(monumentnumber, monumentname, monumentregion));
                }

            } catch (JSONException e) {
                e.printStackTrace();
            }

        }
    }

            , new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            error.printStackTrace();
        }
    });
    if (request != null) {
        mRequestQueue.add(request);
    }

}

}

.....and我的项目模型类:

代码语言:javascript
代码运行次数:0
复制
public class Item {

private String name;
private String number;
private String region;

public Item(String number, String name, String region) {
    this.name = name;
    this.number = number;
    this.region = region;
}
public String getName() {
    return name;
}
public String getRegion() {
    return region;
}
public String getNumber() { return number; }
}

谢谢你的帮助,如果我没有包括重要的东西,请告诉我:)

更新:我尝试添加mListAdapter.notifyDataSetChanged();看起来很有效,但是我在日志中得到了这个错误:

代码语言:javascript
代码运行次数:0
复制
2019-08-21 19:46:16.947 5542-5542/com.example.app E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.app, PID: 5542
java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.TextView.setText(java.lang.CharSequence)' on a null object reference
    at com.example.app.ListAdapter.onBindViewHolder(ListAdapter.java:38)
    at com.example.app.ListAdapter.onBindViewHolder(ListAdapter.java:15)

........and some other stuff
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-08-21 09:38:34

您需要通知适配器数据集在onResponse()代码下面更改了onResponse()

代码语言:javascript
代码运行次数:0
复制
mListAdapter.notifyDataSetChanged();
票数 0
EN

Stack Overflow用户

发布于 2019-08-21 09:32:00

移除这一行:

代码语言:javascript
代码运行次数:0
复制
    mRecyclerView.setHasFixedSize(true);

由于是异步加载数据,所以设置适配器时数据大小为0。因为您将其设置为固定大小,所以当项目更改时,RecyclerView不会更新其大小。

来自setHasFixedSize()

RecyclerView仍然可以根据其他因素(例如父级的大小)更改其大小,但这种大小计算不能取决于其子节点的大小或适配器的内容(适配器中的项目数除外)。

还可以在加载数据后设置适配器。它也应该能起作用。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57596565

复制
相关文章
Groovy 添加带注释的Map构造函数
从Groovy的早期开始,我们可以创建POGO(Plain Old Groovy Objects)类,它们将具有带有Map参数的构造函数。 Groovy在生成的类中自动添加构造函数。我们可以使用命名参数来创建POGO的实例,因为Map参数构造函数。 这只有在我们不添加自己的构造函数且属性不是最终的时才有效。从Groovy 2.5.0开始,我们可以使用@MapConstrutor AST转换注释来添加带有Map参数的构造函数。使用注释我们可以有更多选项来自定义生成的构造函数。例如,我们可以让Groovy使用Map参数生成构造函数,并添加我们自己的构造函数。 属性也可以是final,我们仍然可以使用带有Map参数的构造函数。
白石
2019/08/23
1.1K0
Java里的构造函数(构造方法)
本文转载之https://www.cnblogs.com/livterjava/p/4709561.html
用户7886150
2021/01/31
2.5K0
@Autowired的使用:推荐对构造函数进行注释
Spring Team recommends "Always use constructor based dependency injection in your beans. Always use assertions for mandatory dependencies".
java架构师
2019/06/13
2K0
JAVA & .NET创建对象构造函数调用顺序
基类静态初始化块——当前类静态初始化块——基类初始化块——基类构造函数——当前类初始化块——当前类构造函数
雪飞鸿
2019/03/08
1.1K0
java构造函数调用另一个构造函数_java中的构造函数
* 构造方法是专门用来创建对象的方法,当我们通过关键字new来创建对象时,其实就是在调用构造方法
用户7886150
2021/04/29
4.5K0
java scanner构造函数_使用Scanner作为构造函数的参数的Java
这是一个学校任务的问题,这就是为什么我这样做的原因。使用Scanner作为构造函数的参数的Java
用户7886150
2021/04/26
2.8K0
Java 构造函数的详解
我们人出生的时候,有些人一出生之后再起名字的,但是有些人一旦出生就已经起好名字的。那么我们在java里面怎么在对象一旦创建就赋值呢?
全栈程序员站长
2022/09/08
5610
[ Java学习基础 ] Java构造函数
   构造方法是类中特殊方法,用来初始化类的实例变量,它在创建对象(new运算符)之后自动调用。 Java构造方法的特点如下: 构造方法名必须与类名相同。 构造方法没有任何返回值,包括void。 构造方法只能与new运算符结合使用。 示例代码如下: 1 //Rectangle.java文件 2 package com.a51work6; 3 4 // 矩形类 5 public class Rectangle { 6 7 // 矩形宽度 8 int wi
Kevin_Zhang
2018/05/22
1.3K0
通过工厂函数、构造函数创建对象
当我们有多个变量的结构非常类似时,如下所示,反复书写结构过于麻烦,我们可以定义一个工厂函数来创建对象
很酷的站长
2022/12/21
7890
通过工厂函数、构造函数创建对象
什么是java构造函数_什么是java构造函数
构造函数是面向对象中的一员,构造函数可以叫做构造器,它的函数名与类名相同,不用定义返回值类型,也没有具体的返回值。构造函数是在构建创造时对象时调用函数,作用是可以给对象进行初始化,创建对象都必须要通过构造函数初始化。一个类中如果没有定义过构造函数,那么该类会有一个默认的空参数构造函数。如果在类中定义了指定的构造函数,那么该类中的默认构造函数就没有了。
全栈程序员站长
2022/09/08
1.2K0
js 中的构造函数,构造函数作用,构造函数和普通函数的区别
函数的定义方式: 1.声明式函数定义: function 函数名 (){};这种定义方式,会将函数声明提升到该函数所在作用域的最开头,也是就无论你在这个函数的最小作用域的那儿使用这种方式声明的函数,在这个作用域内,你都可以调用这个函数为你所用。 2.函数表达式:let fun = function(){}; 此方式定义的函数,只能在该作用域中,这段赋值代码执行之后才能通过fun()调用函数,否则,由于变量声明提升,fun === undefined。 3.new Function 形式: var fun1 = new Function (arg1 , arg2 ,arg3 ,…, argN , body );Function构造函数所有的参数都是字符串类型。除了最后一个参数, 其余的参数都作为生成函数的参数即形参。这里可以没有参数。最后一个参数, 表示的是要创建函数的函数体。
全栈程序员站长
2022/10/04
3.5K0
【Kotlin】Kotlin 构造函数 ( 主构造函数 | 主构造函数声明属性 | init 初始化代码块 | 次构造函数 | 构造函数委托 | 调用构造函数创建实例对象 )
1 . 构造函数个数 : Kotlin 类定义时需要指定主构造函数 , 还可以指定 0 ~ 多个次构造函数 ;
韩曙亮
2023/03/27
4.1K0
Groovy 元组构造函数创建
Groovy 1.8添加了@TupleConstructor注释。 通过这个注释,我们可以在编译时自动创建一个元组构造函数。 因此构造函数可以在编译的类中找到。 对于类中的每个属性,将使用默认值创建构造函数中的参数。 类中定义的属性的顺序还定义了构造函数中参数的顺序。 因为参数具有默认值,所以我们可以使用Groovy语法,并在使用构造函数时将参数留在参数列表的末尾。
白石
2019/09/18
1.3K0
@Autowired的使用--Spring规范解释,推荐对构造函数进行注释
Spring Team recommends "Always use constructor based dependency injection in your beans. Always use assertions for mandatory dependencies.
ydymz
2018/09/10
4.2K0
Java复制构造函数
----------------------------------------------------------------------------------
用户7886150
2020/12/15
9610
java构造函数方法声明无效_如何构造函数
Java构造函数,也叫构造方法,是JAVA中一种特殊的函数。与函数名相同,无返回值。
全栈程序员站长
2022/10/05
1.7K0
C++核心准则C.51:使用委托构造函数实现所有构造函数的共通动作
C.51: Use delegating constructors to represent common actions for all constructors of a class C.51:使用委托构造函数实现所有构造函数的共通动作
面向对象思考
2020/03/25
6890
【说站】js创建构造函数的注意点
推荐操作环境:windows7系统、jquery3.2.1版本,DELL G3电脑。
很酷的站长
2022/11/24
7230
【说站】js创建构造函数的注意点
LeetCode - 所有可能的路径
我又重新开始更新LeetCode了,以后工作日更新LeetCode,周末更新东野圭吾的小说
晓痴
2019/07/24
7490
LeetCode - 所有可能的路径
java构造代码块,构造函数和普通函数的区别和调用时间
在这里我们谈论一下构造代码块,构造函数和普通函数的区别和调用时间。 构造代码块:最早运行,比构造函数运行的时间好要提前,和构造函数一样,只在对象初始化的时候运行。 构造函数:运行时间比构造代码块时间晚,也是在对象初始化的时候运行。没有返回值,构造函数名称和类名一致。 普通函数:不能自动调用,需要对象来调用,例如a.add(); 如果只看代码运行先后顺序的话:构造代码块>构造函数>普通函数 下面给一个程序
用户3030674
2018/09/14
1.5K0
java构造代码块,构造函数和普通函数的区别和调用时间

相似问题

UIKeyboardWillChangeFrameNotification并非总是被调用

152

CallListener onCallProgressing()并非总是被调用

10

Viewpager Fragment 1 onCreateView并非总是被调用

19

从NSSharingService扩展调用FinderSync

14

并非总是调用NSMenuItem自定义视图drawRect

22
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档