想做
它能在ListView中显示两种列表吗?
现在,我显示了一个日志(列表(模式,但我必须在同一页上再显示一个新模式。所以我需要在同一页上显示两种列表模式。我使用了ListView和BaseAdapter,但我不知道要显示2个模式。
如果数据包括C,则显示图案1,如果数据包括G,则显示样式2。
【图片】
ーーーーーー
A、 B、C
D、 E、F
ーーーーーー
A、 B、G
D、 H、I、J
ーーーーーー
A、 B、C
D、 E、F
ーーーーーー
A、 B、C
D、 E、F
ーーーーーー
A、 B、G
D、 H、I、J
ーーーーーー
您可以尝试使用RecyclerView来实现这一点。
当RecyclerView
有多个ViewHolders
时,我们通常会覆盖GetItemViewType
方法。
getItemViewType(int position)
此方法的默认实现将始终返回0,表示只有1种类型的视图。在您的情况下,情况并非如此,因此您需要找到一种方法来断言哪一行对应于哪一种视图类型。
此外,当我们注意到以下方法的viewType参数时:
public override RecyclerView.ViewHolder OnCreateViewHolder(ViewGroup parent, int viewType)
根据视图类型,我们需要扩大正确的布局资源,并相应地创建视图持有者。RecyclerView将以避免不同视图类型冲突的方式处理不同视图类型的回收。
例如:(假设您可以将看门人与对象的字段Type
相匹配(
private const int LAYOUT_ONE = 0;
private const int LAYOUT_TWO = 1;
方法GetItemViewType
:
public override int GetItemViewType(int position)
{
if (items[position].Type == 0)
return LAYOUT_ONE;
else
return LAYOUT_TWO;
}
方法OnCreateViewHolder
public override RecyclerView.ViewHolder OnCreateViewHolder(ViewGroup parent, int viewType)
{
View view = null;
switch (viewType)
{
case LAYOUT_ONE:
view = LayoutInflater.From(parent.Context).Inflate(Resource.Layout.customview_user_writepostbar, parent, false);
return new CreatePostViewHolder(view);
case LAYOUT_TWO:
view = LayoutInflater.From(parent.Context).Inflate(Resource.Layout.customview_postregular, parent, false);
return new PostRegularViewHolder(view);
}
}
方法OnBindViewHolder
public override void
OnBindViewHolder (RecyclerView.ViewHolder holder, int position)
{
int type = GetItemViewType(position);
switch (type)
{
case LAYOUT_ONE:
CreatePostViewHolder vh2 = holder as CreatePostViewHolder;
vh2.userFirstName.Text = UserFirstName + ", share something inspiring!";
break;
case LAYOUT_TWO:
PostRegularViewHolder vh = holder as PostRegularViewHolder;
// other code
break;
default:
break;
}
}