【发布时间】:2016-04-28 11:20:09
【问题描述】:
我有一个默认布局,它在 RecyclerView 列表中包含一堆空白 CardView,基本上是一个欢迎屏幕,供用户向他们展示 CardView 的外观。然后用户启动一些数据的输入屏幕并单击“保存”按钮将数据保存到 CardView 中。用户单击保存后,布局应从具有空白 CardViews 的默认布局更改为包含用户数据的新的单个 CardView。稍后,如果用户删除了他们所有的 CardViews,那么视图应该切换回默认的空白 CardViews。
我正在努力解决如何在 onCreateViewHolder 中将代码设置为适配器,因为 getItemCount() 的默认值已经是正值(因为 RecyclerView 列表中已经有 4 或 5 个空白 CardView),这将一旦用户创建 4 或 5 个 CardView,稍后与相同的 getItemCount() 数量发生冲突。有关如何设置默认布局然后切换到新布局的任何想法,如果列表中的用户创建的 CardViews 清空,则可以恢复为默认布局?
以下是我在适配器中为两种布局布局测试的失败尝试。我意识到它不起作用,因为默认布局的 ItemCount 从来没有为零,因为已经有 4 或 5 个空白 CardView:
...
public class ContactAdapter extends RecyclerView.Adapter<ContactAdapter.ContactViewHolder> {
private List<ContactInfo> contactList;
public ContactAdapter(List<ContactInfo> contactList) {
this.contactList = contactList;
}
@Override
public int getItemCount() {
return contactList.size();
}
@Override
public ContactViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
if(contactList.size()== 0) {
View itemView = LayoutInflater.
from(viewGroup.getContext()).
inflate(R.layout.defaultcard_layout, viewGroup, false);
return new ContactViewHolder(itemView);
}
else {
View itemView = LayoutInflater.
from(viewGroup.getContext()).
inflate(R.layout.singlecard_layout, viewGroup, false);
return new ContactViewHolder(itemView);
}
}
修改了Adapter和removeItem代码:
...
private LayoutInflater mLayoutInflater;
private List<Contact> mContacts;
private OnItemTapListener mOnItemTapListener;
public ListContactsAdapter(Context context, List<Contact> contacts) {
Context mContext;
mContext = context;
mLayoutInflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
mContacts = contacts;
}
public void removeItem(Contact contact, int position) {
mContacts.remove(contact);
if (mContacts.size()==0) {
// if no more contacts in list,
// we rebuild from scratch
mContacts.clear();
notifyDataSetChanged();
} else {
// else we just need to remove
// one item
mContacts.remove(position);
notifyItemRemoved(position);
}
}
【问题讨论】:
-
你应该实现方法getItemViewType。这应该返回 2 作为值,因为您需要处理两种不同类型的视图。然后您应该能够确定每个列表元素的类型并将其用于构建布局。有关实现示例,请参阅here。
-
好的,我去看看。
-
好的,让我知道这是否可行:为默认布局设置唯一的 ViewType。然后当用户单击保存创建一个新的 CardView 时,然后使用第二个布局。稍后,如果用户删除了第二个布局中的所有 CardView,则该 ViewType 的 getItemCount() 将为零,代码将切换到默认布局并刷新视图。
-
我支持@thetonrifles 的建议。由于这两种布局的 itemCount 不同(首先您有 4、5 张空卡片,然后只有一张带有一些信息的卡片),您应该通过实现两种视图类型来区分这两种状态。将每种视图类型与不同的 ViewHolder 相关联,例如 EmptyCardViewHolder 用于第一个卡片状态,然后使用更好的名称用于 BigCardViewHolder。请注意,在您发布的代码中,
onCreateViewHolder的“int i”参数实际上是一个 viewType,您将使用它来决定哪个 ViewHolde -
...你应该回来。
标签: android android-layout android-recyclerview