Как получить класс, который расширяет базовый класс из базового класса, используя дженерики? - PullRequest
0 голосов
/ 30 апреля 2018

У меня есть класс 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 и т. Д.

Так что в clss, который простирается BaseAdapter, я могу просто позвонить:

public class MyAdapter extends BaseAdapter<Data> {

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

}

А в Деятельности / Фрагменте или там, где 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);
        }

чтобы мне не приходилось делать это для каждого списка

Ответы [ 2 ]

0 голосов
/ 30 апреля 2018

Это мой класс 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<BeanCart,AdapterDemo.MyViewHolder>

0 голосов
/ 30 апреля 2018

Прежде всего, этот случай связан с наследованием , которое вы используете. Здесь вы можете использовать универсальное наследование следующим образом:

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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...