【问题标题】:Why is the arraylist not being shown in the recyclerview?为什么arraylist没有显示在recyclerview中?
【发布时间】:2019-11-16 20:28:20
【问题描述】:

我使用 for 循环创建了一个 arraylist,该循环在我的模型类中创建了 100 个项目。然后,我尝试使用适配器将此数据绑定到我的 recyclerview,但由于某种奇怪的原因,这些项目没有显示在 recyclerview 中。

我首先调查了我的适配器和 recyclerview 代码,以确保它们得到正确实施,我没有发现任何异常,这使我得出结论,数据可能实际上并没有被创建。

代码如下:

    package com.demoapp.moester96.petheart.Models;

    import android.content.Context;

    import java.util.ArrayList;
    import java.util.List;
    import java.util.UUID;

    public class PetRecord {
        private static PetRecord sPetRecord;

        private List<Pet> mPets;

        public static PetRecord get(Context context)
        {
            if(sPetRecord == null)
            {
                sPetRecord = new PetRecord(context);
            }

            return sPetRecord;
        }

        private PetRecord(Context context)
        {
            mPets = new ArrayList<>();

            for(int i=0; i<100; ++i)
            {
                Pet pet = new Pet();
                pet.setmTitle("Pet #" + i);
                pet.setFaved(i % 2 == 0);
                mPets.add(pet);
            }
        }

        public List<Pet> getPets()
        {
            return mPets;
        }

        public Pet getPet(UUID id)
        {
            for(Pet pet : mPets)
            {
                if(pet.getmId().equals(id))
                {
                    return pet;
                }
            }

            return null;
        }

    }

    package com.demoapp.moester96.petheart;

    import android.os.Bundle;
    import android.support.annotation.NonNull;
    import android.support.annotation.Nullable;
    import android.support.v4.app.Fragment;
    import android.support.v7.widget.LinearLayoutManager;
    import android.support.v7.widget.RecyclerView;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.LinearLayout;
    import android.widget.TextView;
    import com.demoapp.moester96.petheart.Models.Pet;
    import com.demoapp.moester96.petheart.Models.PetRecord;

    import java.util.List;

    public class PetListFragment extends Fragment {

        private class PetHolder extends RecyclerView.ViewHolder
        {
            private Pet mPet;
            private TextView mTitleTextView;
            private TextView mDateTextView;

            public PetHolder(LayoutInflater inflater, ViewGroup parent)
            {
                super(inflater.inflate(R.layout.list_item_pet,parent,false));

                mTitleTextView = (TextView) itemView.findViewById(R.id.pet_list_title);
                mDateTextView = (TextView) itemView.findViewById(R.id.pet_list_date);
            }

            public void bind(Pet pet)
            {
                mPet = pet;
                mTitleTextView.setText(mPet.getmTitle());
                mDateTextView.setText(mPet.getmDate().toString());
            }
        }

        private class PetAdapter extends RecyclerView.Adapter<PetHolder>
        {
            private List<Pet> mPets;

            public PetAdapter(List<Pet> pets)
            {
                mPets = pets;
            }

            @NonNull
            @Override
            public PetHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
                LayoutInflater layoutInflater = LayoutInflater.from(getActivity());
                return new PetHolder(layoutInflater,parent);
            }

            @Override
            public void onBindViewHolder(@NonNull PetHolder petHolder, int i) {
                Pet pet = mPets.get(i);
                petHolder.bind(pet);
            }

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

        private RecyclerView mPetRecyclerView;
        private PetAdapter mAdapter;

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

        @Nullable
        @Override
        public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
            View view = inflater.inflate(R.layout.activity_pet_list,container,false);
            mPetRecyclerView = (RecyclerView) view.findViewById(R.id.pet_recycler_view);
            mPetRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
            updateUI();
            return view;
        }

        private void updateUI()
        {
            PetRecord petRecord = PetRecord.get(getActivity());
            List<Pet> pets = petRecord.getPets();

            mAdapter = new PetAdapter(pets);
            mPetRecyclerView.setAdapter(mAdapter);
        }
    }

我希望在 recyclerview 中有一个包含宠物编号、日期和时间的 100 个项目的列表,但我得到了一个 recyclerview 中完全没有显示任何内容。

【问题讨论】:

  • 我不确定是否是这种情况,但您能否更新您将布局管理器设置为此的行 mPetRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity(), RecyclerView.VERTICAL);
  • 是的,不幸的是它没有工作它给了我一个错误,说无法解析构造函数 LinearLayoutManager
  • 以防万一,您能否也发布您的项目布局和片段布局?
  • 是的,我的错误 new LinearLayoutManager(getActivity(), RecyclerView.VERTICAL, false) 是正确的构造函数
  • 是的,即使将其放入构造函数中它仍然无法正常工作,是的,我会为您发布项目和片段布局

标签: java android arraylist android-recyclerview android-arrayadapter


【解决方案1】:

视图应该在onCreateViewHolder 中创建,并且应该传递给视图持有者类。然后在你的ViewHolder 类中你还没有创建视图但是你已经使用itemView 来初始化布局的视图。

public class PetListFragment extends Fragment {
   Context context;

   @Override
    public void onAttach(Context context) {
        super.onAttach(context);
        this.context = context; 
        //this is one of the best way to get context of the activity to which the particular activity is associated with
      }
    private class PetHolder extends RecyclerView.ViewHolder
    {
        private Pet mPet;
        private TextView mTitleTextView;
        private TextView mDateTextView;

        public PetHolder(@NonNull View itemView)
        {
             super(itemView);
            mTitleTextView = (TextView) itemView.findViewById(R.id.pet_list_title);
            mDateTextView = (TextView) itemView.findViewById(R.id.pet_list_date);
        }

        public void bind(Pet pet)
        {
            mPet = pet;
            mTitleTextView.setText(mPet.getmTitle());
            mDateTextView.setText(mPet.getmDate().toString());
        }
    }

    private class PetAdapter extends RecyclerView.Adapter<PetHolder>
    {
        private List<Pet> mPets;
        private Context context;
        public PetAdapter(List<Pet> pets,Context context) 
        {
            this.context=context;
            mPets = pets;
        }

        @NonNull
        @Override
        public PetHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
            LayoutInflater layoutInflater = LayoutInflater.from(context);
            View view=layoutInflater.inflate(R.layout.list_item_pet,parent,false);
            return new PetHolder(view);
        }

        @Override
        public void onBindViewHolder(@NonNull PetHolder petHolder, int i) {
            Pet pet = mPets.get(i);
            petHolder.bind(pet);
        }

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

    private RecyclerView mPetRecyclerView;
    private PetAdapter mAdapter;

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

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.activity_pet_list,container,false);
        mPetRecyclerView = (RecyclerView) view.findViewById(R.id.pet_recycler_view);
        mPetRecyclerView.setLayoutManager(new LinearLayoutManager(context));
        updateUI();
        return view;
    }

    private void updateUI()
    {
        PetRecord petRecord = PetRecord.get(context);
        List<Pet> pets = petRecord.getPets();

        mAdapter = new PetAdapter(pets,context);
        mPetRecyclerView.setAdapter(mAdapter);
    }
}

【讨论】:

    【解决方案2】:

    首先,你应该调用:

    mPetRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
    

    设置适配器之后,而不是之前。这就是它的工作原理。另外,您是否有用于项目设计的 .xml 文件?应该在你说的适配器上添加它:

    @NonNull
    @Override
    public PetHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        LayoutInflater layoutInflater = LayoutInflater.from(getContext();
        layoutInflater.inflate(R.layout.insert_your_design_element, parent,false);
        return new PetHolder(layoutInflater,parent);
    }
    

    【讨论】:

    • 我把xml代码放在评论区,如果你想看,谢谢你的帮助
    • LayoutInflater 行出现不兼容的类型错误
    • 将layoutinflater创建(返回LayoutInflater)和inflate方法调用自身(返回View)分开。 LayoutInflater layoutInflater = LayoutInflater.from(getContext(); layoutInflater.inflate(R.layout.insert_your_design_element, parent,false);
    • 我像你说的那样分离了代码,不幸的是这些项目仍然没有显示在 recyclerview 中
    【解决方案3】:

    setAdapter 之后应该调用 notifyDataSetChanged

        recyclerView = layout.findViewById(R.id.list_recyclerView);
        recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
        recyclerView.addItemDecoration(new DividerItemDecoration(getActivity(), DividerItemDecoration.VERTICAL));
        ListAdapter adapter = new ListAdapter(getActivity());
        recyclerView.setAdapter(adapter);
        adapter.setList(searchList);
        adapter.notifyDataSetChanged();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-10
      • 1970-01-01
      • 1970-01-01
      • 2017-04-22
      • 2018-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-20
      相关资源
      最近更新 更多