【问题标题】:How to get the class that extends Base class from within Base class using generics?如何使用泛型从基类中获取扩展基类的类?
【发布时间】:2018-10-10 08:31:31
【问题描述】:

我有一个 BaseAdapter 类,我在其中为扩展 BaseAdapter 的所有适配器类中的列表数据实现“刷新器”,如下所示:

RecyclerView.Adapter adapter = mRecyclerView.getAdapter();
        if (adapter instanceof "Adapter Class that extends BaseAdapter") {
            ((Adapter Class that extends BaseAdapter") adapter).refreshData(data);
        } else {
            adapter = new Adapter Class that extends BaseAdapter"();
            (("Adapter Class that extends BaseAdapter") adapter).refreshData(topicDetails);
            mRecyclerView.setAdapter(adapter);
        }

其中refreshData(T data) 是一个通用的抽象方法,也在BaseAdapter 中实现notifyDataChanged 等。

所以在扩展 BaseAdapter 的 clss 中,我可以调用:

public class MyAdapter extends BaseAdapter<Data> {

        @Override
        public void refreshData(Data data) {
            insertItems(data);
            notifyDataSetChanged();
    }

}

在 Activity/Fragment 或 RecyclerView 所在的任何地方:

mRecyclerView.refreshData(mAdapter) 什么的。我不确定如何从 BaseAdapter 中获取“扩展 BaseAdapter 的适配器类”

tldr

基本上我想写一个通用的方法来做:

RecyclerView.Adapter adapter = mRecyclerView.getAdapter();
        if (adapter instanceof "Adapter Class that extends BaseAdapter") {
            ((Adapter Class that extends BaseAdapter") adapter).refreshData(data);
        } else {
            adapter = new Adapter Class that extends BaseAdapter"();
            (("Adapter Class that extends BaseAdapter") adapter).refreshData(topicDetails);
            mRecyclerView.setAdapter(adapter);
        }

这样我就不必为每个列表都这样做

【问题讨论】:

  • 你找到解决办法了吗?

标签: android generics inheritance


【解决方案1】:

首先,这种情况与您使用的继承有关。在这里您可以像这样使用泛型继承

RecyclerView.Adapter adapter = mRecyclerView.getAdapter();

if (adapter instanceof BaseAdapter) {
    ((BaseAdapter) adapter).refreshData(topicDetails); //You will get unchecked call here but it won't cause a problem
} else {
    adapter = new BaseAdapter<>();
    ((BaseAdapter) adapter).refreshData(topicDetails); //You will get unchecked call error here but it won't cause a problem
    mRecyclerView.setAdapter(adapter);
}

【讨论】:

    【解决方案2】:

    这是我的 BaseAdapter 类。

    /* general recyclerview adapter */
    
    public abstract class BaseRecyclerAdapter<T, VH extends RecyclerView.ViewHolder> extends RecyclerView.Adapter<VH> {
    
        public final List<T> itemList;
        public OnItemClickListener onItemClickListener;
    
        public BaseRecyclerAdapter(List<T> itemList, OnItemClickListener onItemClickListener) {
            this.itemList = itemList;
            this.onItemClickListener = onItemClickListener;
        }
    
        public BaseRecyclerAdapter(List<T> itemList) {
            this.itemList = itemList;
        }
    
        public void clear() {
            itemList.clear();
            notifyDataSetChanged();
        }
    
        public void add(List<T> itemListToAdd) {
            itemList.addAll(itemListToAdd);
            notifyDataSetChanged();
        }
    
    
        @Override
        public int getItemCount() {
            return itemList.size();
        }
    
        public interface OnItemClickListener<Object> {
            void onItemClick(View view, Object object);
        }
    }
    

    并像使用它

    public class AdapterDemo extends BaseRecyclerAdapter<BeanCart,AdapterDemo.MyViewHolder> {
    
    
        public AdapterDemo(List<BeanCart> itemList) {
            super(itemList);
        }
    
        @NonNull
        @Override
        public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
            return null;
        }
    
        @Override
        public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {
    
        }
        class MyViewHolder extends RecyclerView.ViewHolder {
    
    
            MyViewHolder(View itemView) {
                super(itemView);
            }
        }
    }
    

    这里你将传递两个类类型

    T> 列表类型

    VH> 视图支架

    点赞public class AdapterDemo extends BaseRecyclerAdapter&lt;BeanCart,AdapterDemo.MyViewHolder&gt;

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-22
      • 2018-01-13
      • 2018-01-10
      • 2023-04-01
      相关资源
      最近更新 更多