【问题标题】:recyclerView reference from a child layout, included <include/> in a parent layout来自子布局的 recyclerView 引用,包含在父布局中的 <include/>
【发布时间】:2019-04-01 03:13:19
【问题描述】:

我有一个包含另一个布局的片段。访问此布局中的任何其他视图(TextViews、ImageViews、CardViews)都没有问题,具体的 RecyclrvView 除外。

这篇文章 -> How to use recyclerview with include layout properly?

我已经提供了xml布局、片段类、SetViewHolder类以及下面的适配器视图。

注意:我的 adapterView 使用来自 recyclerView 的 SetViewHolder 类。

XML 布局

<VideoView
    android:layout_width="match_parent"
    android:layout_height="250dp"
    app:layout_anchorGravity="top|center"
    android:id="@+id/vvLive"/>

<androidx.core.widget.NestedScrollView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:scrollbars="vertical"
    android:id="@+id/bottomSheet"
    android:background="@color/lightGray"
    app:layout_behavior="@string/bottom_sheet_behavior"
    app:behavior_peekHeight="375dp">


    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:padding="10dp">

        <include
            layout="@layout/home_intro_category"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="center" />

        <include
            android:id="@+id/slide_show1"
            layout="@layout/image_slide_show_card_holder"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:layout_marginTop="20dp" />


    </LinearLayout>



</androidx.core.widget.NestedScrollView>

片段类

public class HomeFrag extends Fragment {

private BottomSheetBehavior bottomSheetBehavior;
private HomeViewModel viewModel;
private TextView tvHeaderCS1, tvSubCS1;
private SlideAdapter adapter;
RecyclerView rvSlide1;

@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    ViewGroup viewGroup = (ViewGroup) inflater.inflate(R.layout.home_frag, container, false);
    viewModel = ViewModelProviders.of(this).get(HomeViewModel.class);

    return viewGroup;
}

@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    //initialize views
    View bottomSheet = view.findViewById(R.id.bottomSheet);
    bottomSheetBehavior = BottomSheetBehavior.from(bottomSheet);
    bottomSheetBehavior.setState(BottomSheetBehavior.STATE_HALF_EXPANDED);
    CardView cvSlide1 = view.findViewById(R.id.slide_show1);
    rvSlide1 = cvSlide1.findViewById(R.id.rvItems);
    tvHeaderCS1 = cvSlide1.findViewById(R.id.hdMain);
    tvSubCS1 = cvSlide1.findViewById(R.id.hdSub);

}

@Override
public void onResume() {
    super.onResume();

    viewModel.populateList().observe(this, new Observer<String>() {
        @Override
        public void onChanged(String s) {
            try {
                GsonBuilder builder = new GsonBuilder();
                Gson gson = builder.create();
                List<Item> itemsList = new ArrayList<>();
                JSONArray array = new JSONArray(s);

                for(int i=0;i<array.length();i++){
                    Item item = gson.fromJson(array.getString(i), Item.class);
                    itemsList.add(item);
                }

                LinearLayoutManager linearLayout = new LinearLayoutManager(getContext(), LinearLayoutManager.HORIZONTAL, false);
                adapter = new SlideAdapter(getActivity(), itemsList);
                rvSlide1.setLayoutManager(linearLayout);
                rvSlide1.setAdapter(adapter); //no problem with adapter, but not showing anything****


                //slide shows headers and subs
                tvHeaderCS1.setText("Items Recently On Air");
                tvSubCS1.setText("");

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

        }
    });

}

适配器类

public class SlideAdapter extends RecyclerView.Adapter<SetViewHolder> {

private Activity activity;
List<Item> items;

public SlideAdapter(Activity activity, List<Item> items) {
    this.activity = activity;
    this.items = items;
}

@NonNull
@Override
public SetViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.slideshow_card_item, parent, false);
    return new SetViewHolder(view);
}

@Override
public void onBindViewHolder(@NonNull SetViewHolder holder, int position) {
    holder.tvProductNameSlide.setText(items.get(position).getItemName());
    holder.tvPreviousPriceSlide.setText(String.valueOf(items.get(position).getItemPreviousPrice()));
    holder.tvSalePriceSlide.setText(String.valueOf(items.get(position).getItemSalePrice()));
    Glide.with(activity).load(items.get(position).getItemURL())
            .centerCrop()
            .into(holder.ivProductSlideShow);
}

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

SetViewHolder 类 公共类 SetViewHolder 扩展 RecyclerView.ViewHolder {

public TextView tvProductNameSlide, tvPreviousPriceSlide, tvSalePriceSlide;
public ImageView ivProductSlideShow;

public SetViewHolder(@NonNull View itemView) {
    super(itemView);


    tvProductNameSlide = itemView.findViewById(R.id.tvProductName);
    tvPreviousPriceSlide = itemView.findViewById(R.id.tvPreviousPrice);
    tvSalePriceSlide = itemView.findViewById(R.id.tvSalePrice);
    ivProductSlideShow = itemView.findViewById(R.id.ivProduct);

}

}

我的目标是用另一个布局(cardView)的对象(名称、项目、图像)填充 recyclerView。我已经通过直接在 HomeFrag.class(我使用标签的主片段)中实现 RecyclerView 自行测试了适配器,并且适配器工作得很好。

当我尝试通过从布局内部访问 RecyclerView 来填充它时,我得到一个空的 recyclerview 并且没有运行时崩溃。在执行此操作时,正如用户所建议的那样,我还从适配器内部记录了 getItemCount 方法,以查看我是否真的在接收数据,结果返回的项目大小为 19。

任何帮助将不胜感激。

编辑:根据用户建议的调试方法更新结果。提供了有关片段和子片段属性的更新详细信息。

【问题讨论】:

  • 可能你的 String s 为空?你从观察者那里检查过 s 的值吗?
  • @NishanKhadka 是的,我已经检查了观察者的值。字符串不为空。我已经将 RecyclerView 直接实现到片段中(不使用包含标签)并且它工作得很好。但是当我尝试在包含的布局中引用 recyclerview 时,它没有显示任何内容
  • 让我们在 recyclerview 适配器的 getItemCount() 方法上记录日志,看看填充的列表的大小,如果它不返回 0,那么可能是布局问题.. 其中一个布局被另一个重叠
  • @NishanKhadka 大小返回 19(我的样本数据)。正如我所提到的,我通过在主片段中实现 RecyclerView 来测试适配器,它工作正常。
  • 然后你的 RecyclerView 被填充了,这很可能是你的布局的问题,为什么不尝试在包含的布局上提供固定高度,看看是否会显示 RecyclerView :)

标签: java android android-recyclerview adapter


【解决方案1】:

在您使用RecyclerView 的(包含)布局上,添加app:layout_behavior

<android.support.v7.widget.RecyclerView
    android:id="@+id/conversation"
    app:layout_behavior="@string/appbar_scrolling_view_behavior"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" />

另外,尝试再做一件事:致电setNestedScrollingEnabled(false) 之前 打电话给setAdapter():

recyclerView.setNestedScrollingEnabled(false);

【讨论】:

  • 滚动不是问题。 RecyclerView 中的所有视图都没有显示。我已经尝试在实际的 homeFrag 中实现 RecyclerView,它工作正常。无论哪种方式,我尝试了您的建议,但仍然没有解决。谢谢你的努力。
猜你喜欢
  • 1970-01-01
  • 2021-04-10
  • 1970-01-01
  • 2021-12-16
  • 1970-01-01
  • 2011-08-03
  • 2022-01-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多