gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 23:25:19 24 4
gpt4 key购买 nike

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

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

现在我有 3 个适配器用于这些 Activity 中的 3 个 RecyclerView。我正在尝试创建一个适配器,因为功能几乎相同。

我的问题是如何拥有一个可以接受例如 ArrayList<Product> 的适配器或 ArrayList<Customer> ,或者如果这甚至是最好的方法。只要指出正确的方向,我们将不胜感激!

最佳答案

您的思考方向是正确的。我已经创建了一个类来解决您的问题:

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
}
};

关于Android RecyclerView.Adapter 允许在单个适配器中列出不同的对象类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53699672/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com