RecyclerView 适配器显示空白卡片视图
RecyclerView adapter is showing blank cardview
我在 sub api21 设备上遇到了一个棘手的问题。我正在使用 RecyclerView.Adapter 适配器给 android.support.v7.widget.CardView 充气。这个想法是卡片只会添加卡片中存在的信息。如果没有信息,则卡片根本不会显示。所以我以编程方式创建这些卡片。
这里是 api21 和 api19 的屏幕截图
注意 api19 如何显示其中没有值的卡片。我认为问题是由适配器调用没有值的 onCreateViewHolder 引起的。有没有办法绕过onCreate?还是绑定?或者有没有办法让 sub api21 处理卡的方式有所不同?
卡片视图XML
<android.support.v7.widget.CardView
xmlns:card_view="http://schemas.android.com/apk/res-auto"
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/card_info"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clickable="false"
android:focusable="true"
card_view:cardCornerRadius="5dp"
android:layout_margin="5dp"
card_view:cardUseCompatPadding="true">
<LinearLayout
android:id="@+id/card_info_lin"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"/>
适配器
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {
switch(viewType) {
case VIEW_ENGINE:
itemViewEngine = LayoutInflater
.from(viewGroup.getContext())
.inflate(R.layout.card_info, viewGroup, false);
cardInfo.clear();
return new ViewHolderEngine(itemViewEngine, cardInfo);
case VIEW_TIRES:
itemViewTires = LayoutInflater
.from(viewGroup.getContext())
.inflate(R.layout.card_info, viewGroup, false);
cardInfo.clear();
return new ViewHolderTires(itemViewTires, cardInfo);
default: //General
itemViewGeneral = LayoutInflater
.from(viewGroup.getContext())
.inflate(R.layout.card_info, viewGroup, false);
cardInfo.clear();
return new ViewHolderGeneral(itemViewGeneral, cardInfo);
}
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, int i) {
cardInfo = vehicleInfo.get(i);
switch (getItemViewType(i)) {
case VIEW_GENERAL:
new ViewHolderGeneral(itemViewGeneral, cardInfo);
break;
case VIEW_ENGINE:
new ViewHolderEngine(itemViewEngine, cardInfo);
break;
case VIEW_TIRES:
new ViewHolderTires(itemViewTires, cardInfo);
break;
}
}
}
Viewholder Class(第 1 个,共 3 个)
class ViewHolderGeneral extends RecyclerView.ViewHolder {
private static final String TAG = "adapter_info_ViewHolder_gen";
private TypedArray headerColors;
private ArrayList<String> labels = new ArrayList<>();
public ViewHolderGeneral(View view, final ArrayList<String> cardInfo) {
super(view);
View layout = view.findViewById(R.id.card_info_lin);
DisplayMetrics metrics = layout.getContext().getResources().getDisplayMetrics();
...set up cards
您看到的差异很可能是由于 CardView
在子 API21 上使用了自己的 padding/shadow 机制。解决此问题的方法是让您的适配器在实际上没有数据时报告它有数据。换句话说,如果卡片因为项目为空而为空,则不要在计数中报告此项目(或跟踪它们)。
我在 sub api21 设备上遇到了一个棘手的问题。我正在使用 RecyclerView.Adapter 适配器给 android.support.v7.widget.CardView 充气。这个想法是卡片只会添加卡片中存在的信息。如果没有信息,则卡片根本不会显示。所以我以编程方式创建这些卡片。
这里是 api21 和 api19 的屏幕截图
注意 api19 如何显示其中没有值的卡片。我认为问题是由适配器调用没有值的 onCreateViewHolder 引起的。有没有办法绕过onCreate?还是绑定?或者有没有办法让 sub api21 处理卡的方式有所不同?
卡片视图XML
<android.support.v7.widget.CardView
xmlns:card_view="http://schemas.android.com/apk/res-auto"
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/card_info"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clickable="false"
android:focusable="true"
card_view:cardCornerRadius="5dp"
android:layout_margin="5dp"
card_view:cardUseCompatPadding="true">
<LinearLayout
android:id="@+id/card_info_lin"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"/>
适配器
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {
switch(viewType) {
case VIEW_ENGINE:
itemViewEngine = LayoutInflater
.from(viewGroup.getContext())
.inflate(R.layout.card_info, viewGroup, false);
cardInfo.clear();
return new ViewHolderEngine(itemViewEngine, cardInfo);
case VIEW_TIRES:
itemViewTires = LayoutInflater
.from(viewGroup.getContext())
.inflate(R.layout.card_info, viewGroup, false);
cardInfo.clear();
return new ViewHolderTires(itemViewTires, cardInfo);
default: //General
itemViewGeneral = LayoutInflater
.from(viewGroup.getContext())
.inflate(R.layout.card_info, viewGroup, false);
cardInfo.clear();
return new ViewHolderGeneral(itemViewGeneral, cardInfo);
}
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, int i) {
cardInfo = vehicleInfo.get(i);
switch (getItemViewType(i)) {
case VIEW_GENERAL:
new ViewHolderGeneral(itemViewGeneral, cardInfo);
break;
case VIEW_ENGINE:
new ViewHolderEngine(itemViewEngine, cardInfo);
break;
case VIEW_TIRES:
new ViewHolderTires(itemViewTires, cardInfo);
break;
}
}
}
Viewholder Class(第 1 个,共 3 个)
class ViewHolderGeneral extends RecyclerView.ViewHolder {
private static final String TAG = "adapter_info_ViewHolder_gen";
private TypedArray headerColors;
private ArrayList<String> labels = new ArrayList<>();
public ViewHolderGeneral(View view, final ArrayList<String> cardInfo) {
super(view);
View layout = view.findViewById(R.id.card_info_lin);
DisplayMetrics metrics = layout.getContext().getResources().getDisplayMetrics();
...set up cards
您看到的差异很可能是由于 CardView
在子 API21 上使用了自己的 padding/shadow 机制。解决此问题的方法是让您的适配器在实际上没有数据时报告它有数据。换句话说,如果卡片因为项目为空而为空,则不要在计数中报告此项目(或跟踪它们)。