Android RecyclerView.Adapter允许在单个适配器中列出不同对象类型吗?

时间:2018-12-10 04:50:04

标签: android android-recyclerview recycler-adapter

我编写了一个盘点应用程序,其核心是使用API​​从MySQL数据库中提取数据,并在需要时创建不同的对象,例如产品,订单,客户。

在我的设置屏幕中,每个按钮都有一个按钮,分别用于不同的活动,在RecyclerView中显示相关信息,用户可以添加/编辑/删除这些对象。

现在我在这些活动中为3个RecyclerViews提供了3个适配器。我正在尝试创建一个适配器,因为功能几乎相同。

我的问题是如何拥有一个可以接受ArrayList<Product>ArrayList<Customer>的适配器,或者这是否是解决该问题的最佳方法。朝着正确方向的一点将不胜感激!

2 个答案:

答案 0 :(得分:1)

您正在思考正确的方向。 我已经创建了一个可以解决您问题的课程:

public abstract class BaseRecyclerAdapter<T, VH extends BaseViewHolder> extends RecyclerView.Adapter<VH> {

    private int mModelLayout;
    private Class<VH> mViewHolderClass;
    private List<T> mList = new ArrayList<>();

    public BaseRecyclerAdapter(Class<VH> viewHolderClass, int modelLayout) {
        mModelLayout = modelLayout;
        mViewHolderClass = viewHolderClass;
    }

    public void setmList(List<T> mList) {
        this.mList = mList;
    }

    @Override
    public int getItemCount() {
        return mList.size();
    }

    public T getItem(int position) {
        return mList.get(position);
    }

    @Override
    public VH onCreateViewHolder(ViewGroup parent, int viewType) {
        ViewGroup view = (ViewGroup) LayoutInflater.from(parent.getContext()).inflate(viewType, parent, false);
        try {
            Constructor<VH> constructor = mViewHolderClass.getConstructor(View.class);
            return constructor.newInstance(view);
        } catch (NoSuchMethodException | InvocationTargetException | InstantiationException | IllegalAccessException e) {
            throw new RuntimeException(e);
        }
    }

    @Override
    public void onBindViewHolder(VH viewHolder, int position) {
        T model = getItem(position);
        populateViewHolder(viewHolder, model, position);
    }

    @Override
    public int getItemViewType(int position) {
        return mModelLayout;
    }

    abstract protected void populateViewHolder(VH viewHolder, T model, int position);

    public void addItem(T t) {
        int index = mList.size();
        mList.add(index, t);
        notifyItemInserted(index);
    }

    public void updateItem(int position, T t) {
        mList.set(position, t);
        notifyItemChanged(position);
    }

    public void removeItem(int position) {
        mList.remove(position);
        notifyItemRemoved(position);
    }

    public void setItems(List<T> items) {
        mList = items;
        notifyDataSetChanged();
    }

    public class BaseViewHolder extends RecyclerView.ViewHolder {
        public BaseViewHolder(View view) {
            super(view);
        }
    }
}

如何使用它:

private BaseRecyclerAdapter<User, UserViewHolder> mBaseRecyclerAdapter = new BaseRecyclerAdapter<User, UserViewHolder>(UserViewHolder.class, R.layout.layout_list_item_friends) {
    @Override
    protected void populateViewHolder(UserViewHolder viewHolder, User model, int position) {
        // You can do here whatever you want
    }
};

答案 1 :(得分:0)

根据您的情况,您可以:

  1. 使RecylerView接受多种类型的布局,每种布局都接受一种对象类型
  2. 使ViewHolder接受各种对象并使用条件来区分布局/行为

如果选择第二个选项(已使用),则必须使所有类继承一个抽象类。例如,您可以创建一个称为数据的类,然后客户,产品和订单将扩展数据类。然后,您在适配器中使用ArrayList<Data>