【问题标题】:Recycler View Does not works in Fragment回收站视图在 Fragment 中不起作用
【发布时间】:2021-04-16 13:21:16
【问题描述】:

我一直在制作一个在Fragment 中使用recyclerView 的应用程序,但recyclerView 的内容尚未显示。它显示:

 'No adapter attached; skipping layout'.

特色助手类:

public class FeaturedHelperClass {

    int image;
    String title;

    public FeaturedHelperClass(int image, String title) {
        this.image = image;
        this.title = title;
    }

    public int getImage() {
        return image;
    }

    public String getTitle() {
        return title;
    }
}

片段:

RecyclerView.Adapter adapter;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        featuredRecycle = inflater.inflate(R.layout.fragment_dashboard, container, false).findViewById(R.id.explore_recycle);
        recycle();
        return inflater.inflate(R.layout.fragment_dashboard, container, false);
    }

private void recycle(){

        featuredRecycle.setHasFixedSize(true);
        featuredRecycle.setLayoutManager(new LinearLayoutManager(getActivity()));

        ArrayList<FeaturedHelperClass> featuredLocations = new ArrayList<>();

        featuredLocations.add(new FeaturedHelperClass(R.drawable.mcdonald, "Mcdonald's"));
        featuredLocations.add(new FeaturedHelperClass(R.drawable.kfc, "KFC"));
        featuredLocations.add(new FeaturedHelperClass(R.drawable.starbucks, "Starbucks"));

        adapter = new FeaturedAdapter(featuredLocations);
        featuredRecycle.setAdapter(adapter);
    }


【问题讨论】:

  • 您给定的数据和代码是不够的。发布您的 fragment_dashboard.xml。并解释为什么你的特点回收和你的片段分开膨胀?

标签: android android-fragments android-recyclerview fragment


【解决方案1】:

未附加视图膨胀回收器视图适配器后出现'No adapter attached; skipping layout'. 的原因。

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        featuredRecycle = inflater.inflate(R.layout.fragment_dashboard, container, false).findViewById(R.id.explore_recycle);
        recycle();
        return inflater.inflate(R.layout.fragment_dashboard, container, false);
    }

因为 recycle() 方法会在视图膨胀之前执行。

我们可以把它改成

//inflate the view and return
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
         View view = inflater.inflate(R.layout.fragment_dashboard, container, false);
         return view;
   }

//this callback is just after once the view get inflated in the screen
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
             featuredRecycle = view.findViewById(R.id.explore_recycle);
             recycle();
   }

现在我们得到featuredRecycle 视图并执行recycle() 逻辑,将绘制recycler。

【讨论】:

    【解决方案2】:

    您的通货膨胀逻辑似乎有缺陷,请尝试在您的 onCreateView 中更改以下内容

    featuredRecycle = inflater.inflate(R.layout.fragment_dashboard, container, false).findViewById(R.id.explore_recycle);
    recycle();
    return inflater.inflate(R.layout.fragment_dashboard, container, false);
    

    进入

    View view = inflater.inflate(R.layout.fragment_dashboard, container, false);
    featuredRecycle = view.findViewById(R.id.explore_recycle);
    recycle();
    return view;
    

    【讨论】:

      【解决方案3】:

      以下内容对您有用,但它不是延迟片段中视图膨胀的好方法。由于您在返回视图之前执行了一些任务,因此会延迟视图膨胀。

      @Override
      public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
               View view = inflater.inflate(R.layout.fragment_dashboard, container, false);
               featuredRecycle = view.findViewById(R.id.explore_recycle);
               recycle()
               return view;
         }
      

      执行以下操作将是最佳方法,

      //inflate the view and return
      @Override
      public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
               View view = inflater.inflate(R.layout.fragment_dashboard, container, false);
               return view;
         }
      
      //this callback is just after the view inflation, you set your ui here
      @Override
      public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
                   featuredRecycle = view.findViewById(R.id.explore_recycle);
                   recycle()
         }
      

      【讨论】:

      • 代替getView(),我们可以使用视图本身。基本上,两者都只会给出膨胀的视图。