2015-10-02 25 views
0

我正在学习如何正确开发android应用程序。现在我正在开发一个应用程序,该应用程序应该显示具有不同Recyclerviews的不同片段。到现在为止,我只有一个RecyclerView和一个适配器。在适配器中,Recyclerview的Textviews通过ViewHolder分配。许多Recyclerviews需要许多适配器吗?

现在我的问题:这是如何工作的?我是否需要一个新的适配器用于不同的RecyclerView,或者是否可以从一个SINGLE适配器“填充”来自许多Recyclerviews的TextView?

回答

4

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

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

由于机会很渺茫,您有多个列表显示完全相同的数据,通常这样每个ListView或RecyclerView都有自己的专用适配器。


你可以让这个适配器检查它属于什么(它的ListView或RecyclerView),并根据该检查的数据,但这是讨厌的,并与Single Responsibility Principle冲突。

+0

我认为单身适配器与“属于检查”..但正如你所说..它是讨厌.. :) 我会制作其他适配器。 我会尽快将其标记为答案。 –

+1

@CodingJohn不错的选择。同样在这种情况下,如果其中一个列表的功能应该改变,你不必担心其他东西会被破坏 - 因为它们都有自己的适配器 –

+0

是的,这是真的。而且它更容易重用一些代码,如果你已经这样做了:) –

1

您可以使用超类适配器,并将其扩展以用于不同情况。这使得编写更少的代码和重用超类中的东西成为可能。

这里是我的项目一个例子(超级抽象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); 
    } 

} 
+0

这看起来很酷,看起来很棒。我会马上试一试!谢谢! –

+0

欢迎您提出问题,如果有需要的话。 –