适配器

时间:2016-12-24 09:07:53

标签: 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());
  }

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

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

第二种方式

我为每个帖子添加了一个新的布局文件。他们都拥有自己的约束力。 这最小化了代码。

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

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

1 个答案:

答案 0 :(得分:2)

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

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),此系统就可以使用。我假设一个名为ViewHolder的{​​{1}}将Binding作为公共最终字段。