【问题标题】:RecyclerView in a Fragment not loading片段中的 RecyclerView 未加载
【发布时间】:2020-05-06 19:11:11
【问题描述】:

Tl:dr:我创建了自己的底部导航栏,它重定向到 3 个不同的片段。 1 个片段(Trips)有一个 recyclerview,我在其中显示 3 个信息(ImageView、2 个 TextViews)。此回收器视图未加载(无错误消息),该片段上有一个空白屏幕。 我怀疑问题出在我从 Fragment Java 类加载回收器的方式上,但没有成功(浏览了多个 YT 教程和我能找到的 stackoverflow 文章)

我尝试的一些步骤(我对 Android 比较陌生,所以尝试了不同的场景) - 清洁项目 - 检查@override(其他stackoverflow文章) - 在片段中:将我的代码拆分为 2:在我膨胀布局的地方 OncreateView 和在我加载适配器的地方创建 OnViewCreated。 - 另一个片段(带有硬编码文本)工作,表明片段管理器似乎工作

感谢您的建议


片段

package com.example.projectapp;

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.LinearLayoutManager;
import androidx.recyclerview.widget.ListAdapter;
import androidx.recyclerview.widget.RecyclerView;

    import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.List;

    public class Trip extends Fragment {


        private RecyclerView.Adapter adapter;
        private RecyclerView recyclerView;
        private RecyclerView.LayoutManager layoutManager;


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

            RecyclerView recyclerView= (RecyclerView) v.findViewById(R.id.recycler);
            adapter listAdapter= new adapter();
            recyclerView.setAdapter(listAdapter);
            RecyclerView.LayoutManager layoutManager= new LinearLayoutManager(getActivity());
            recyclerView.setLayoutManager(layoutManager);
            return v;
        }}




    ---------------------------------------------------------
    Adapter class
    ---------------------------------------------------------


    package com.example.projectapp;

    import android.provider.ContactsContract;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.ImageView;
    import android.widget.LinearLayout;
    import android.widget.TextView;

    import androidx.annotation.NonNull;
    import androidx.recyclerview.widget.RecyclerView;

    import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.List;

    public class adapter extends RecyclerView.Adapter<adapter.adapterview> {
        public class adapterview extends RecyclerView.ViewHolder{

            public LinearLayout linearLayout;
            public ImageView imageView;
            public TextView title;
            public TextView short_desc;


            public adapterview(@NonNull View itemView) {
                super(itemView);
                linearLayout=itemView.findViewById(R.id.card);
                imageView=itemView.findViewById(R.id.pix);
                title=itemView.findViewById(R.id.titlecard);
                short_desc=itemView.findViewById(R.id.short_desc);

            }


        }

        public List<card> item_list= Arrays.asList(
                new card(R.drawable.ic_home,"this is a test","testing 2"),
                new card(R.drawable.ic_home,"this is a test1","testing 3"),
                new card(R.drawable.ic_home,"this is a test2","testing 4")
                );

        @NonNull
        @Override
        public adapterview onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {

            View v= LayoutInflater.from(parent.getContext()).inflate(R.layout.card,parent,false);
            return new adapterview(v);
                }

        @Override
        public void onBindViewHolder(@NonNull adapterview holder, int position) {
            card current= item_list.get(position);
            holder.title.setText(current.getTitle());
            holder.short_desc.setText(current.getDesc());
            holder.imageView.setImageResource(current.getimage());
        }

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

【问题讨论】:

    标签: android android-layout android-fragments android-recyclerview android-adapter


    【解决方案1】:

    不要在 onCreateView 上调用回收器,在 onViewCreated 中进行。

    @Override
    public View onViewCreated(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    
                RecyclerView recyclerView= (RecyclerView) v.findViewById(R.id.recycler);
                adapter listAdapter= new adapter();
                recyclerView.setAdapter(listAdapter);
                RecyclerView.LayoutManager layoutManager= new LinearLayoutManager(getActivity());
                recyclerView.setLayoutManager(layoutManager);
            }
    }
    
    

    【讨论】:

    • 谢谢。我试过这个版本(选择 Void OnViewCreated 虽然没有返回)但不幸的是仍然没有运气(空白屏幕)
    【解决方案2】:

    在设置LayoutManager 后,只需设置RecyclerView 适配器。所以将这些行重新排序为:

    RecyclerView recyclerView = (RecyclerView) v.findViewById(R.id.recycler);
    RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(getActivity());
    recyclerView.setLayoutManager(layoutManager);   
    adapter listAdapter= new adapter();
    recyclerView.setAdapter(listAdapter);
    

    【讨论】:

    • 感谢您的提示。我编辑了我的代码,但仍然没有运气。由于 Fragment 部分中没有太多 CL,我开始查看我的适配器,但仍然不明白可能出了什么问题。
    【解决方案3】:

    好消息我解决了这个问题(但不确定根本原因)。如果这对其他人有帮助,我基本上做了 2 处更改: 1. 我向我的适配器(在片段文件中)传递了一个对象列表和上下文。 2. 我从我的布局中删除了 1 个 Textview(来自回收站视图的项目),这可能会阻止它加载(?)

    现在,尝试使用卡片视图的下一个挑战,因为这种线性布局不是很好 谢谢大家

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-05-23
      • 1970-01-01
      • 1970-01-01
      • 2020-07-11
      • 1970-01-01
      • 1970-01-01
      • 2018-04-24
      • 1970-01-01
      相关资源
      最近更新 更多