2015-06-10 3 views
2

Я создаю RecyclerView, который будет расширяться, когда пользователь коснется его и закроется, когда пользователь коснется его снова. Ниже приведен мой код:RecyclerView Viewholder reusing

public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.RecViewHolder> { 
    ArrayList<String> values; 
    ArrayList<Integer> expandedPosition; 
    public static class RecViewHolder extends RecyclerView.ViewHolder { 
     ... 
     private boolean resultsOpened = false; 
     ... 
     RelativeLayout favHeaderLayout; 
     RelativeLayout favResultsLayout; 

     public RecViewHolder (View itemView) { 
      super(itemView); 
      favHeaderLayout.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        if (!resultsOpened) { 
         expandLayout(); 
        } else { 
         favResultsLayout.setVisibility(View.GONE); 
         resultsOpened = false; 
        } 
       } 
      }); 

     } 

     public void expandLayout() { 
      favResultsLayout.setVisibility(View.VISIBLE); 
      resultsOpened = true; 
      //I populate my expanded layout here 
     } 
    } 

    public RecyclerViewAdapter (Context context, ArrayList<String> values) { 
     this.context = context; 
     this.values= values; 
    } 

    @Override 
    public RecViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.layout_file, parent, false); 
     RecViewHolder recViewHolder= new RecViewHolder(v); 
     return recViewHolder; 
    } 

    @Override 
    public void onBindViewHolder(RecViewHolder recViewHolder , int position) { 
    } 

    @Override 
    public void onAttachedToRecyclerView(RecyclerView recyclerView) { 
     super.onAttachedToRecyclerView(recyclerView); 
    } 

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

} 

Когда я касаюсь первого вида, он должен расширяться. Однако, когда у адаптера больше данных, и я касаюсь первого вида, вид расширяется, а еще один вид внизу RecyclerView (например, 8-й вид) также расширяется. Как я могу убедиться, что только те взгляды, которые были затронуты, расширяют, остальная часть остается закрытой?

EDIT

Я пытался хранить расширенное положение Просмотров в ArrayList и onBindViewHolder, проверить, какие виды будут расширены и не расширять их только:

public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.RecViewHolder> { 
    ArrayList<String> values; 
    ArrayList<Integer> expandedPosition; 
    public static class RecViewHolder extends RecyclerView.ViewHolder { 
     ... 
     private boolean resultsOpened = false; 
     ... 
     RelativeLayout favHeaderLayout; 
     RelativeLayout favResultsLayout; 

     public RecViewHolder (View itemView) { 
      super(itemView); 


     } 

    } 

    public RecyclerViewAdapter (Context context, ArrayList<String> values) { 
     this.context = context; 
     this.values= values; 
    } 

    @Override 
    public RecViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.layout_file, parent, false); 
     RecViewHolder recViewHolder= new RecViewHolder(v); 
     return recViewHolder; 
    } 

    @Override 
    public void onBindViewHolder(RecViewHolder recViewHolder , int position) { 
     recViewHolder.favResultsLayout.setVisibility(View.GONE); 
     for(int i= 0; i < expandedPosition.size(); i ++){ 
      recViewHolder.favResultsLayout.setVisibility(View.VISIBLE); 
     } 
     recViewHolder.favHeaderLayout.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        if (!expandedPosition.contains(position)) { 
         expandLayout(recViewHolder); 
         expandedPosition.add(position); 
        } else { 
         recViewHolder.favResultsLayout.setVisibility(View.GONE); 
         for(int i = 0; i < expandedPosition.size(); i ++){ 
          if (expandedPosition.get(i) == position){ 
            expandedPosition.remove(i); 
          } 
         } 
        } 
       } 
      }); 
    } 
    public void expandLayout() { 
      favResultsLayout.setVisibility(View.VISIBLE); 
      //I populate my expanded layout here 
     } 
    @Override 
    public void onAttachedToRecyclerView(RecyclerView recyclerView) { 
     super.onAttachedToRecyclerView(recyclerView); 
    } 

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

} 

Еще не повезло :(

+0

Как вы определяете свой favResultsLayout? –

+0

Очевидно, что вам нужно хранить расширенные элементы (набор позиций расширенного элемента должен быть в порядке) в адаптере или в самом элементе (теперь не представляется возможным теперь с помощью String вы использовать специальный класс, например 'Item {public String String1; public boolean Expanded}') и использовать эту информацию для настройки держателя вида в 'onBindViewHolder' .... счетчик посещений, используемый адаптером! = количество элементов подстилающих данных ... remeber об этом – Selvin

+0

Спасибо за ответ! Ниже приведены коды для favResultsLayout favResultsLayout = (RelativeLayout) itemView.findViewById (R.id.fav_results_layout); XML-: ! <- GridView здесь -> SpencerRoi

ответ

1

В качестве названия класса говорится, что речь идет об утилизации ...

public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.RecViewHolder> { 
    ArrayList<String> values; 
    SparseBooleanArray expanded = new SparseBooleanArray(); 
    public static class RecViewHolder extends RecyclerView.ViewHolder { 
     //EDIT!!!!! 
     public RecViewHolder (View itemView, final RecyclerViewAdapter adapter) { 
     //rest of the code ... 
     favHeaderLayout.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       final int currentPosition = getAdapterPosition(); 
       //is a view at current position expanded? 
       if(adapter.expanded.get(currentPosition)) 
        //if so it shouldn't be 
        adapter.expanded.delete(getAdapterPosition(currentPosition)); 
       else 
        //if not, expand 
        adapter.expanded.put(currentPosition, true); 
       //wheeee inform the adapter to rebind 
       adapter.notifyItemChanged(currentPosition); 
       //setupExpanded(expanded.get(currentPosition)); 
      } 
     }); 
     } 
     protected void setupExpanded(boolean state) { 
     //ONLY hide show layouts based on state 
     } 
    } 
    @Override 
    public RecViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.layout_file, parent, false); 
     RecViewHolder recViewHolder= new RecViewHolder(v, this); 
     return recViewHolder; 
    } 

    @Override 
    public void onBindViewHolder(RecViewHolder recViewHolder , int position) { 
     //this line should be self explanatory 
     recViewHolder.setupExpanded(expanded.get(position)); 
    } 

    //rest of the code 
} 
+0

Hi Selvin, Спасибо за отличное объяснение! Теперь работает! : D – SpencerRoi

+0

У меня есть еще один вопрос, хотя ... Когда я расширяю макет, во время первого расширения полоса прокрутки остается в позиции favHeaderLayout. Однако последующее расширение заставляет полосу прокрутки перемещаться к середине favResultsLayout. В любом случае, чтобы заставить полосу прокрутки всегда оставаться в позиции favHeaderLayout при нажатии? – SpencerRoi

+0

Да, уведомите адаптер, что элемент изменился – Selvin