许多 Recyclerviews 需要很多适配器吗?

Do i need many Adapters for many Recyclerviews?

我正在学习如何正确开发 android 应用程序。现在我正在开发一个应用程序,它应该显示具有不同 Recyclerview 的不同片段。直到现在我只有一个 Recyclerview 和一个适配器。在适配器中,来自 Recyclerview 的 Textviews 通过 ViewHolder 进行分配。

现在我的问题是:这是如何工作的?我是否需要一个用于不同 Recyclerview 的新适配器,或者是否可以 "fill" 来自单个适配器的许多 Recyclerview 的 TextView?

如果您所有的 ListViews 或 RecyclerViews 显示相同的数据以及相同的 Textviews 和 ImageViews 等,那么您可以重复使用您的适配器。

但是,如果他们不以完全相同的方式使用数据,您应该制作一个具有自己功能的新适配器。

因为您有多个列表显示完全相同的数据的可能性很小,所以通常每个 ListView 或 RecyclerView 都有自己的专用适配器。


您可以这样做,以便适配器检查它属于什么(哪个 ListView 或 RecyclerView)并根据该检查使用数据,但这很讨厌并且与 Single Responsibility Principle.

您可以使用超级 class 适配器,并将其扩展以用于不同的情况。这提供了编写更少代码和重用超级 class 中的东西的可能性。

这是我项目中的一个示例(具有过滤器可能性的超抽象 RecyclerViewAdapter):

public abstract class GenericRecycleAdapter<T, K extends Holders.TextImageHolder> extends RecyclerView.Adapter implements Filterable {
    private final Context context;
    protected List<T> mList = new ArrayList<T>() {
    };
    private List<T> originalData = null;
    private Action1<List> task;
    private ItemFilter mFilter = new ItemFilter();
    private int lastPosition;

    public GenericRecycleAdapter(List<T> list, Context context) {
        this.context = context;
        if (list != null) {
            this.mList = list;
        }

        this.originalData = list;
    }


    public void refresh(List<T> list) {
        if (list != null) {
            this.mList = list;
        }
        this.originalData = list;
        notifyDataSetChanged();
    }

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

    public Context getContext() {
        return context;
    }

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View v = LayoutInflater.from(parent.getContext())
                .inflate(getLayout(), parent, false);
        return getCustomHolder(v);
    }

    public Holders.TextImageHolder getCustomHolder(View v) {
        return new Holders.TextImageHolder(v) {
            @Override
            public void onClick(View v) {
                onItem(mList.get(this.getAdapterPosition()));
                onPosition(this.getAdapterPosition());
            }
        };
    }

    protected void onPosition(int position) {

    }

    protected abstract void onItem(T t);

    public abstract int getLayout();

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
        onSet(mList.get(position), (K) holder);
        onSetPosition((K) holder, position);
        setAnimation(((K) holder).getContainer(), position);
    }

    protected void onSetPosition(K holder, int position) {

    }

    public abstract void onSet(T item, K holder);

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

    public void addObserverToFilter(Action1<List> task) {
        this.task = task;
    }

    @Override
    public Filter getFilter() {
        return mFilter;
    }

    private class ItemFilter extends Filter {
        @Override
        protected FilterResults performFiltering(CharSequence constraint) {

            String filterString = constraint.toString().toLowerCase();

            FilterResults results = new FilterResults();

            final List<T> list = originalData;

            int count = list.size();
            final ArrayList<T> nlist = new ArrayList<>(count);

            String filterableString;

            for (int i = 0; i < count; i++) {
                filterableString = list.get(i).toString();
                if (filterImplementation(filterString, filterableString.toLowerCase())) {
                    nlist.add(list.get(i));
                }
            }

            results.values = nlist;
            results.count = nlist.size();

            return results;
        }

        @SuppressWarnings("unchecked")
        @Override
        protected void publishResults(CharSequence constraint, FilterResults results) {
            mList = (ArrayList<T>) results.values;
            notifyDataSetChanged();
            if (task != null) {
                task.call(mList);
            }

        }

    }

    public List<T> getFilteredList() {
        return mList;
    }

    public List<T> getOriginalList() {
        return originalData;
    }

    protected boolean filterImplementation(String key, String door) {
        return door.startsWith(key);
    }

    protected void setAnimation(View viewToAnimate, int position)

    {
        if (viewToAnimate == null) {
            return;
        }
        if (position > lastPosition) {
            Animation animation = AnimationUtils.loadAnimation(context, android.R.anim.slide_in_left);
            viewToAnimate.startAnimation(animation);
            lastPosition = position;
        }

    }
}

和处理程序:

public class Holders {

    public static class TextImageHolder extends RecyclerView.ViewHolder implements View.OnClickListener {


        private final View container;

        public TextImageHolder(View itemView) {
            super(itemView);
            container = itemView.findViewById(R.id.container); 
            //add other view
            container.setOnClickListener(this);

        }



        @Override
        public void onClick(View v) {

        }
    }


}

另一个视图的用法示例:

public class ChildAdapter extends GenericRecycleAdapter<String,Holders.TextImageHolder> {


    public ChildAdapter (List<String> list, Context context) {
        super(list, context);
    }

    @Override
    protected void onItem(String s) {
//triggers when container is clicked
    }

    @Override
    public int getLayout() {
        return R.layout.some_row; //the id's here should be the same as in the Handler
    }

    @Override
    public void onSet(String item, Holders.TextImageHolder holder) {
        holder.text.setText(item);
    }

}