适配器中的多种不同布局
Multiple different layouts in adapter
我有个小问题。我试图在我的 RecyclerView 中显示多个不同的布局。我设法以两种不同的方式做到了这一点。但我觉得我的代码和逻辑看起来会好得多
我的项目本身就是遵循 MVVM 设计模式。所以我正在使用本机数据绑定。这就是我逻辑有问题的原因。
第一种方法
我尝试这样做的第一种方法就是将所有内容压缩到一个大布局文件中。然后根据 post 的类型隐藏和显示。
private void onBindImagePost(CommentFeedViewHolder holder, CommentFeedItem item) {
holder.mBinding.adapterCommentFeedDraweeView.setVisibility(View.VISIBLE);
holder.mBinding.adapterCommentFeedTopic.setVisibility(View.VISIBLE);
holder.mBinding.adapterCommentFeedYoutubeContainer.setVisibility(View.GONE);
holder.mBinding.adapterCommentFeedVideoContainer.setVisibility(View.GONE);
holder.mBinding.adapterCommentFeedPieChartContainer.setVisibility(View.GONE);
holder.mBinding.adapterCommentFeedDraweeView.setImageURI(item.getUri());
}
所以首先我只显示和隐藏正在使用和未使用的视图。我还为某些视图添加了额外的逻辑。
这个解决方案感觉非常糟糕,因为它包含很多硬编码,并且在片段中添加了业务逻辑。
第二种方法
我为每个 post 添加了一个新的布局文件。他们都有自己的绑定。
这最小化了代码。
if (item.getType() == POST_TEXT) {
AdapterFeedType1Binding binding = DataBindingUtil.inflate(inflater,R.layout.adapter_feed_type_1,holder.binding.mainFrame,true);
binding.setGameFeedItem(item);
}
但是有更好的方法吗?所以我不必为每种类型的 post?
创建新的绑定 class
第二个选项更好。仍然会有多个生成的绑定 类,但是如果你这样做的话,你可以通过一个接口访问它们:
private static final int[] LAYOUT_IDS = {
R.layout.adapter_feed_type_1,
R.layout.adapter_feed_type_2,
...};
public MyViewHolder onCreateViewHolder (ViewGroup parent, int viewType) {
int layoutId = LAYOUT_IDS[viewType];
ViewDataBinding binding = DataBindingUtil.inflate(inflater, layoutId,
parent, false);
MyViewHolder viewHolder = new MyViewHolder(binding);
return viewHolder;
}
public void onBindViewHolder (MyViewHolder holder, int position) {
Item item = getItemAtPosition(position); // your method
holder.binding.setVariable(BR.gameFeedItem, item);
holder.binding.executePendingBindings();
}
只要所有变量的名称都相同(在本例中为gameFeedItem
),这个系统就可以工作。我假设一个名为 MyViewHolder
的 ViewHolder
具有绑定作为 public final 字段。
我有个小问题。我试图在我的 RecyclerView 中显示多个不同的布局。我设法以两种不同的方式做到了这一点。但我觉得我的代码和逻辑看起来会好得多
我的项目本身就是遵循 MVVM 设计模式。所以我正在使用本机数据绑定。这就是我逻辑有问题的原因。
第一种方法
我尝试这样做的第一种方法就是将所有内容压缩到一个大布局文件中。然后根据 post 的类型隐藏和显示。
private void onBindImagePost(CommentFeedViewHolder holder, CommentFeedItem item) {
holder.mBinding.adapterCommentFeedDraweeView.setVisibility(View.VISIBLE);
holder.mBinding.adapterCommentFeedTopic.setVisibility(View.VISIBLE);
holder.mBinding.adapterCommentFeedYoutubeContainer.setVisibility(View.GONE);
holder.mBinding.adapterCommentFeedVideoContainer.setVisibility(View.GONE);
holder.mBinding.adapterCommentFeedPieChartContainer.setVisibility(View.GONE);
holder.mBinding.adapterCommentFeedDraweeView.setImageURI(item.getUri());
}
所以首先我只显示和隐藏正在使用和未使用的视图。我还为某些视图添加了额外的逻辑。
这个解决方案感觉非常糟糕,因为它包含很多硬编码,并且在片段中添加了业务逻辑。
第二种方法
我为每个 post 添加了一个新的布局文件。他们都有自己的绑定。 这最小化了代码。
if (item.getType() == POST_TEXT) {
AdapterFeedType1Binding binding = DataBindingUtil.inflate(inflater,R.layout.adapter_feed_type_1,holder.binding.mainFrame,true);
binding.setGameFeedItem(item);
}
但是有更好的方法吗?所以我不必为每种类型的 post?
创建新的绑定 class第二个选项更好。仍然会有多个生成的绑定 类,但是如果你这样做的话,你可以通过一个接口访问它们:
private static final int[] LAYOUT_IDS = {
R.layout.adapter_feed_type_1,
R.layout.adapter_feed_type_2,
...};
public MyViewHolder onCreateViewHolder (ViewGroup parent, int viewType) {
int layoutId = LAYOUT_IDS[viewType];
ViewDataBinding binding = DataBindingUtil.inflate(inflater, layoutId,
parent, false);
MyViewHolder viewHolder = new MyViewHolder(binding);
return viewHolder;
}
public void onBindViewHolder (MyViewHolder holder, int position) {
Item item = getItemAtPosition(position); // your method
holder.binding.setVariable(BR.gameFeedItem, item);
holder.binding.executePendingBindings();
}
只要所有变量的名称都相同(在本例中为gameFeedItem
),这个系统就可以工作。我假设一个名为 MyViewHolder
的 ViewHolder
具有绑定作为 public final 字段。