2015-04-11 17 views
8

Utworzyłem RecyclerView with Cards jako główny typ widoku. Próbuję osiągnąć to, że gdy użytkownik kliknie element, typ ViewType tego elementu zostanie zmieniony z kart na inny typ widoku (na przykład listę widoków tekstowych umieszczonych poziomo przewijalnie).Jak zmienić viewType elementu RecyclerView onClick

Mój kod RecyclerView Adapter jest następujący:

W poniższym kawałek kodu Stworzyłem arrraylist typów enum śledzić klikniętego stanu każdego wiersza w recyclerview, a potem mam rozmiar mój zestaw danych i zainicjowany mój ArrayList dla każdego wiersza z SHOW_PRIMARY_CONTENT

public class DisplayItemsAdapter extends RecyclerView.Adapter<DisplayItemsAdapter.ViewHolder> { 

private static ArrayList<clickedState> itemClickedState; 
private enum clickedState { 
    SHOW_PRIMARY_CONTENT, 
    SHOW_SECONDARY_CONTENT 
} 

private ArrayList<ItemData> mDataset = new ArrayList<>(); 

public DisplayItemsAdapter(ArrayList<ItemData> dataset) { 
    mDataset = dataset; 
    itemClickedState = new ArrayList<>(); 
    for (int i = 0; i < mDataset.size(); i++) { 
     itemClickedState.add(i, clickedState.SHOW_PRIMARY_CONTENT); 
    } 
} 

poniżej jest moja klasa ViewHolder który posiada odniesienia do wszystkich moich poglądów dzieci, implementuje View.OnClickListener. Dlaczego implementuje View.OnClickListener jest tak, że może przełączać między stanami kliknięć, aby odpowiednio zmienić typ widoku.

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

    TextView tvItemName; 
    TextView tvItemNumber; 

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

     tvItemName = (TextView) itemView.findViewById(R.id.tvItemName); 
     tvItemNumber = (TextView) itemView.findViewById(R.id.tvItemNumber); 

     tvTicketClass = (TextView) itemView.findViewById(R.id.tvTicketClass); 
    } 

    @Override 
    public void onClick(View v) { 
     itemClickedState.add(getAdapterPosition(), clickedState.SHOW_SECONDARY_CONTENT); 
    } 
} 

To gdzie ja dostaję wartość viewType zwrócony przez getItemViewType i powracający napompowane graficzny wzór

@Override 
public DisplayItemsAdapter.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) { 
    View v1 = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.display_Items_row, viewGroup, false); 
    View v2 = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.display_Items_ticket_class, viewGroup, false); 
    if (viewType == 0) { 
     return new ViewHolder(v1); 
    } else { 
     return new ViewHolder(v2); 
    } 
} 

to tutaj I m wiążące poglądy z wartościami według viewType zwracanej przez viewholder viewholderusing. getItemViewType

@Override 
public void onBindViewHolder(DisplayItemsAdapter.ViewHolder viewHolder, final int position) { 
    if (viewHolder.getItemViewType() == 0) { 
     viewHolder.tvItemName.setText(mDataset.get(position).strItemName); 
     viewHolder.tvItemNumber.setText(mDataset.get(position).strItemNumber); 
    } else if (viewHolder.getItemViewType() == 1) { 
     for (int i = 0; i < mDataset.get(position).strClass.length; i++) { 
      viewHolder.tvTicketClass.setText(mDataset.get(position).strClass[i]); 
     } 
    } 
} 

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

i wreszcie moje logikę getItemViewType

@Override 
public int getItemViewType(int position) { 
    if (itemClickedState.get(position) == clickedState.SHOW_SECONDARY_CONTENT) 
     return 1; 
    return 0; 
} 
} 

Czego nie mogłem zrozumieć, to dlaczego nic się nie pokazuje po uruchomieniu kodu ,,, Wszystko wydaje mi się trafne. Pomóż mi !!!!

Odpowiedz

4

patrz mój przykład:

// RecycleItemObject.java 
public class RecycleItemObject { 
     public static int LAYOUT_ITEM_PORTRAIN = 0; 
     public static int LAYOUT_ITEM_LANDSCAPE = 1; 
     private int type; 
     .................... 
     /** 
     * @return get layout type of item 
     */ 
     public int getType() { 
     return type; 
     } 

     /** 
     * set layout type of item 
     * @param type 
     */ 
     public void setType(int type) { 
     this.type = type; 
     } 
    } 

// adapter 
public Holder onCreateViewHolder(ViewGroup parent, int viewType) { 
    View view; 
    if (viewType == RecycleItemObject.LAYOUT_ITEM_PORTRAIN) { 
     view = LayoutInflater.from(context).inflate(R.layout.item_recycle_view_main, parent, false); 
    } else { 
     view = LayoutInflater.from(context).inflate(R.layout.item_recycle_view_main_land, parent, false); 
    } 
} 

// event click item 
@onClick.... 
curentObject.setType(RecycleItemObject.LAYOUT_ITEM_LANDSCAPE); 
// notify item only 
notifyItemChanged(itemPosition); 

ze mną działać dobrze

2

nadzieję, że zorientowali się problem. Jeśli nie, to zrobiłem to za Ciebie. Linia buggy jest

@Override 
    public void onClick(View v) { 
     itemClickedState.add(getAdapterPosition(), clickedState.SHOW_SECONDARY_CONTENT); 
    } 

Oto, co robisz jest dodanie nowego elementu do

itemClickedState.add(getAdapterPosition(), clickedState.SHOW_SECONDARY_CONTENT); 

To będzie wstawić nowy element i rozmiar mdataList i itemClickState różni i stąd mis dopasowywania się dzieje.

Zamiast tego należy użyć itemClickedState.set(getAdapterPosition(), clickedState.SHOW_SECONDARY_CONTENT); . Po drugie, nie rozumiem, co to jest tvTicketClass. Jeśli jest to pojedynczy widok TextView, należy najpierw połączyć ciąg znaków i wykonać je w postaci tvTicketClass.settext(concatenatedstrClass). Mam nadzieję, że otrzymasz pomoc z tego posta. Jeśli masz jakiekolwiek dalsze problemy, proszę zgłoś komentarz.

Powiązane problemy