2017-12-30 8 views
-1

내 리사이클 뷰 어댑터 클래스에서 나는 여기에 아주 작은 질문을 가지고있다. 나는 List<FeaturedTags>을 사용하고 있으며 잘 작동한다.RecyclerView 어댑터 재사용

이제 우리는 새로 도입 한 클래스 소위 'FeaturedLangTags, FeaturedTags & FeaturedLangTags 사이의 유일한 차이는 Lang 필드의 단지 추가되었습니다. 그러나 우리는이 랭 (Lang) 필드를 화면에 표시하기 위해 사용하지 않습니다.

재활용보기의 출력은 기존 FeaturedTags 어댑터와 정확히 비슷합니다. 여기에 나는 기존 어댑터 클래스를 다시 사용하여 List<FeaturedLangTags> 항목을 표시하는 방법을 알고 싶습니다.

간단한 방법 중 하나는 기존 어댑터를 복제하고 FeaturedLangTags 목록을 전달하는 것입니다. 그러나 여기서 많은 코드가 중복됩니다. 나는 기존 수업을 어떻게 트위크 할 수 있는지 알고 싶습니다.

답변

2

두 조건에서 모두 사용할 수있는 일반 List<T> 어댑터를 만듭니다.

public abstract class GenericAdapter<T> extends RecyclerView.Adapter<RecyclerView.ViewHolder> { 

    private Context context; 
    private ArrayList<T> items; 

    public abstract RecyclerView.ViewHolder setViewHolder(ViewGroup parent); 

    public abstract void onBindData(RecyclerView.ViewHolder holder, T val); 

    public GenericAdapter(Context context, ArrayList<T> items){ 
     this.context = context; 
     this.items = items; 
    } 

    @Override 
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     RecyclerView.ViewHolder holder = setViewHolder(parent); 
     return holder; 
    } 

    @Override 
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { 
     onBindData(holder,items.get(position)); 
    } 

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

    public void addItems(ArrayList<T> savedCardItemz){ 
     items = savedCardItemz; 
     this.notifyDataSetChanged(); 
    } 

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


adapter = new GenericAdapter<DataModel>(context,modelList) { 
     @Override 
     public RecyclerView.ViewHolder setViewHolder(ViewGroup parent) { 
      final View view =   LayoutInflater.from(context).inflate(R.layout.item_view_holder, parent, false); 
      ItemViewHolder viewHolder = new ItemViewHolder(context, view); 
      return viewHolder; 
     } 

     @Override 
     public void onBindData(RecyclerView.ViewHolder holder1, DataModel val) { 
       DataModel userModel = val; 

       ItemViewHolder holder = (ItemViewHolder)holder1; 
       holder.name.setText(userModel.getName()); 
       holder.fatherName.setText(userModel.getFatherName()); 
     } 
    }; 
    mRecyclerView.setAdapter(adapter); 
0

FeaturedTagsFeaturedLangTags에 대한 공용 인터페이스 또는 수퍼 클래스를 만든 다음 동일한 어댑터를 사용하십시오.

AdapterDelegates과 같이 어댑터에 대한보다 일반적인 접근 방식을 사용하십시오.

0

어댑터에 대해 두 개의 다른 생성자를 생성하고이를 수행 할 수 있습니다.

+0

이다하지만, 어떻게 데이터를 페치한다? 즉 onBindViewHolder 메서드입니까? – Naruto

0

당신이 가질 수있는 두 클래스가 하나의 공통 인터페이스를 구현은 CommonInterface가

getItemViewType 

메소드를 오버라이드 (override), 어댑터에서

YourList<CommonInterface> 

유형

의 목록을 확인 말한다. 여기 연산자의 인스턴스를 사용하여 클래스의 유형을 확인하고 정수보기 유형을 반환합니다. lang이 없다고 말하면 정수 0과 함께 표시됩니다. 1

이제 onCreateViewHolder에서 viewType을 두 번째 매개 변수로 전달합니다. 이것을 사용하면보기에 맞게 레이아웃을 확장 할 수 있습니다.

당신의 onBindViewHolder에서

, 당신은 매개 변수에 전달 된 홀더에

getItemViewType 

를 확인할 수 있으며, 원하는 개체를 명시 적으로 인터페이스를 캐스팅. 그런 다음 평소대로 사용하십시오. 이러한 다중 - 뷰 타입

참조 Recycler view multiple view types

관련 문제