RecyclerView 未加载

问题描述

我创建了一个 Recycler 视图,应该在创建活动时创建该视图。目前,当我单击 MainActivity 上的按钮时,一个意图会启动具有我的回收视图但未加载的 ListActivity。我已经使用 toast 消息来确认每个方法都被调用了,并且我从 API 获取了正确的数据。如果我使用 Android Studio 中的重新启动活动选项重置活动,则 Recycler 会显示并正常运行。我不知道我做错了什么。

这是我的 ListActivity:


    private RecyclerView myrecyclerview;
    private RecyclerView.Adapter myadapter;
    private RecyclerView.LayoutManager mylayoutmanager;
    static RequestQueue listqueue;
    static final private String url = "https://swapi.dev/api/people/";

    static ArrayList<RecyclerItem> list = new ArrayList<>();


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_list);
        getSupportActionBar().hide();
        listqueue = Volley.newRequestQueue(this);

        myrecyclerview = findViewById(R.id.characterlist);
        

        myadapter = new MyAdapter(list,this);
        myrecyclerview.setAdapter(myadapter);
        myrecyclerview.setHasFixedSize(true);
        mylayoutmanager = new linearlayoutmanager(getApplicationContext());
        myrecyclerview.setLayoutManager(mylayoutmanager);
        parseJsonData();
    }

    public void parseJsonData(){
    JsonObjectRequest request = new JsonObjectRequest(
            Request.Method.GET,url,null,new Response.Listener<JSONObject>() {
                @Override
                public void onResponse(JSONObject response) {
                    Toast.makeText(getApplicationContext(),response.toString(),Toast.LENGTH_SHORT).show();

                    try {
                        JSONArray jsonarray = response.getJSONArray("results");
                        for (int i = 0; i < jsonarray.length(); i++) {
                            JSONObject jsonobject = jsonarray.getJSONObject(i);

                            String name = jsonobject.getString("name");
                            String height = jsonobject.getString("height");
                            String mass = jsonobject.getString("mass");
                            String eyecolor = jsonobject.getString("eye_color");
                            String birthyear = jsonobject.getString("birth_year");

                            //list.add(new RecyclerItem("darth vader","200","128","1950","red"));
                            list.add(new RecyclerItem(name,"Height: " + height,"Mass: " + mass,"Birth Year: " + birthyear,eyecolor));
                        }
                    } catch (JSONException e) {
                        e.printstacktrace();
                    }

                }

            },new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            error.printstacktrace();
        }
    });

        listqueue.add(request);

    }


    @Override
    public void onCharacterClick(int position) {
        String color = list.get(position).getEyecolor();
        Toast.makeText(getApplicationContext(),color,Toast.LENGTH_SHORT).show();
    }

} ```

Like I mentioned,once I reload the activity,it works correctly. But I want the recycler view to show when I navigate to the activity.

解决方法

问题是第一次创建活动时,list 为空,parseJsonData() 正在后台运行填充该列表。 一旦您重新加载活动,列表和适配器就会在您调用时填充

myadapter = new MyAdapter(list,this);
myrecyclerview.setAdapter(myadapter);
myrecyclerview.setHasFixedSize(true);
mylayoutmanager = new LinearLayoutManager(getApplicationContext());
myrecyclerview.setLayoutManager(mylayoutmanager);

回收者视图显示。尝试在您的 parseJsonData() 上执行此操作;循环结束后,创建适配器并显示 rv

for (int i = 0; i < jsonarray.length(); i++) {
   JSONObject jsonobject = jsonarray.getJSONObject(i);
   ....
}

myadapter = new MyAdapter(list,this);
....
myrecyclerview.setLayoutManager(mylayoutmanager);
,

希望对你有帮助

创建列表

private List< TipsList > tipsLists = new ArrayList<>();

像这样设置回收站

RecyclerView tipsRv = findViewById(R.id.tips_rv);
    TipsAdapter adapter = new TipsAdapter(tipsLists,this);
    tipsRv.setAdapter(adapter);
    tipsRv.setHasFixedSize(true);
    tipsRv.setLayoutManager(new LinearLayoutManager(this));

获取数据

 public void getWallis() {
    String myJSONStr = method.loadJSON();

    try {
        JSONObject ROOT_OBJ = new JSONObject(myJSONStr);
        JSONArray MAIN_ARRAY = ROOT_OBJ.getJSONArray("ff_api");
        JSONObject TIPS_OBJ = MAIN_ARRAY.getJSONObject(3);
        JSONArray TIPS_ARRAY = TIPS_OBJ.getJSONArray("Tips");

        for (int i = 0; i < TIPS_ARRAY.length(); i++) {
            TipsList tipsList = new TipsList();
            JSONObject jsonObject = TIPS_ARRAY.getJSONObject(i);
            tipsList.setId(jsonObject.getInt("id"));
            tipsList.setTipsTitle(jsonObject.getString("tipsTitle"));
            tipsList.setTipsDec(jsonObject.getString("tipsDec"));
            tipsLists.add(tipsList);
        }

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