java - 来自子布局的 recyclerView 引用,包括在父布局中
问题描述
我有一个包含另一个布局的片段。访问此布局中的任何其他视图(TextViews、ImageViews、CardViews)都没有问题,具体的 RecyclrvView 除外。
这篇文章->如何正确使用带有包含布局的recyclerview?<- 解决了用户遇到运行时错误的类似情况。我能够编译和运行应用程序而不会出现任何运行时错误。我遇到的问题是 RecyclerView 不显示来自我制作的适配器的任何信息。我单独测试了适配器,看看这是否是问题所在,因为在没有标签的父布局中单独实现时,它工作得非常好。我可以轻松地将实际布局编码到主片段中,但我需要在整个应用程序中多次重用该特定布局,因此有必要使用标签将其包含在内。
我已经提供了 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。
任何帮助将不胜感激。
编辑:用户建议的调试方法的更新结果。提供了有关片段和子片段属性的更新详细信息。
解决方案
在您使用的(包括)布局上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);
推荐阅读
- python - 如何使 msvcrt.getch() 在 mintty 中的行为与在 cmd 中的行为相同?
- asp.net-core - 如何在 IIS Express 配置文件中定义 launchUrl
- php - 如何禁用 PHPMailer Mail Delivery Failed 消息
- mysql - 在 node.js 中的单个数组中获取所有提要数据
- php - 如何将提醒表添加到我的数据库?
- javascript - 验证在 Typescript 中具有动态键的 Json Schema
- google-bigquery - bigQuery 中分片表和通配符表的区别。如何在 bigquery 中创建分片表
- postgresql - 安装 PgBouncer 时遇到问题(postgresql12-libs)
- git - .gitignore 不忽略文件夹内的文件
- javascript - Laravel 翻译文件中的 Javascript 调用