如何在适配器之外使用相同的getView / onBindView代码而不重复它

时间:2015-02-26 04:10:23

标签: android android-fragments adapter android-recyclerview recycler-adapter

我想知道如何更有效地重用某些代码来显示一个适应getView()[BaseAdapter],onBindView()[RecyclerView]或onCreateView()[Fragment]的视图填充视图?

  

自定义RecyclerView适配器,用于填充整个cardViews列表

@Override
public void onBindViewHolder(ViewHolder viewHolder, final int i) {
    MyThing thing = things.get(i);


    /*    Repeatable Code    */

    if (thing.getIcon() == 0) {
        viewHolder.thingIcon.setImageResource(0);
    } else {
        viewHolder.thingIcon.setImageResource(ThingIconSet
                .getIconResId(thing.getIcon()));
    }
etc..etc..etc

现在我还想以完全相同的方式在此适配器外部填充单个cardView,而不保留此布局的两个副本,您建议我做什么?

  

SingleItemFragment显示来自适配器或其他任何地方的单个项目

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {

    // Inflating the root view
    View rootView = inflater.inflate(R.layout.single_cardview_layout,
            container, false);

    /*    Repeated Code    */

    if (thing.getIcon() == 0) {
        viewHolder.thingIcon.setImageResource(0);
    } else {
        viewHolder.thingIcon.setImageResource(ThingIconSet
                .getIconResId(thing.getIcon()));
    }

谢谢

1 个答案:

答案 0 :(得分:1)

我在library中写过类似的问题。解决方案是从Adapter解耦视图创建和视图绑定,并将它放在每个视图/元素/ RecyclerView项目的单个类中。

所以我实现了一个Generic adapter,它接受​​任何实现interface的类(我称之为IItem)。此接口定义了为View创建RecyclerView所需的方法,用于定义类型和处理每个类型。基本上以下是最重要的:

int getType();
int getLayoutRes();
View generateView(Context ctx);
View generateView(Context ctx, ViewGroup parent);
VH getViewHolder(ViewGroup parent);
void bindView(VH holder);

适配器可以执行项目的任何实现,并可视化它们。关于item的好处是您甚至可以通过RecyclerView方法使用generateView这些项目。

为了使其更灵活,更易于实施,我添加了AbstractItem

您可以在此处查看整个实施:https://github.com/mikepenz/FastAdapteritem概念外,它还提供了RecyclerView项目中最常需要的许多功能。大多数事情都非常通用,以尽可能提高灵活性。

实现应该让您大致了解如何实现您的需求(或者您可以使用库)。 你会需要: - “项目”的界面 - 能够处理这些“项目”的适配器 - “项目” - 实施,提供RecyclerView Adapter

所需的方法