适配器中的多种不同布局

Jem*_*ahi 2 android android-adapter android-databinding

我有一个小问题。我试图在我的 RecyclerView 中显示多个不同的布局。我设法以两种不同的方式做到了这一点。但我觉得我的代码和逻辑可以看起来好多了

我的项目本身遵循 MVVM 设计模式。所以我使用本机数据绑定。这就是为什么我的逻辑变得有问题的原因。

第一种方法

我尝试这样做的第一种方法只是将所有内容压缩到一个大的布局文件中。然后根据帖子的类型隐藏和显示。

  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());
  }
Run Code Online (Sandbox Code Playgroud)

所以首先我只是显示和隐藏正在使用和没有使用的视图。我还为一些视图添加了额外的逻辑。

这个解决方案感觉非常糟糕,因为它包含了很多硬编码,并且业务逻辑被添加到片段中。

第二种方法

我为每个帖子添加了一个新的布局文件。他们都有自己的绑定。这最大限度地减少了代码。

    if (item.getType() == POST_TEXT) {
        AdapterFeedType1Binding binding = DataBindingUtil.inflate(inflater,R.layout.adapter_feed_type_1,holder.binding.mainFrame,true);
        binding.setGameFeedItem(item);
    }
Run Code Online (Sandbox Code Playgroud)

但是有更好的方法吗?所以我不必为每种类型的帖子创建一个新的绑定类?

Geo*_*unt 5

第二种选择更好。仍然会有多个生成的绑定类,但如果你这样做,你可以通过一个接口访问它们:

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();
}
Run Code Online (Sandbox Code Playgroud)

只要所有变量的名称都相同(gameFeedItem在这种情况下),该系统就可以工作。我假设了一个具有 Binding 作为公共 final 字段的ViewHolder命名MyViewHolder