2015-10-02 75 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

歡迎您提出問題,如果有需要的話。 –