我编写了一个盘点应用程序,其核心是使用API从MySQL数据库中提取数据,并在需要时创建不同的对象,例如产品,订单,客户。
在我的设置屏幕中,每个按钮都有一个按钮,分别用于不同的活动,在RecyclerView中显示相关信息,用户可以添加/编辑/删除这些对象。
现在我在这些活动中为3个RecyclerViews提供了3个适配器。我正在尝试创建一个适配器,因为功能几乎相同。
我的问题是如何拥有一个可以接受ArrayList<Product>
或ArrayList<Customer>
的适配器,或者这是否是解决该问题的最佳方法。朝着正确方向的一点将不胜感激!
答案 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)
根据您的情况,您可以:
如果选择第二个选项(已使用),则必须使所有类继承一个抽象类。例如,您可以创建一个称为数据的类,然后客户,产品和订单将扩展数据类。然后,您在适配器中使用ArrayList<Data>