2015-04-11 6 views
8

पर मैंने कार्ड के साथ एक रीसाइक्लिंग व्यू को प्राथमिक दृश्यता के रूप में बनाया है। जो मैं प्राप्त करने की कोशिश कर रहा हूं वह यह है कि जब उपयोगकर्ता किसी आइटम पर क्लिक करता है तो उस आइटम का व्यू टाइप टाइप कार्ड से दूसरे व्यूटाइप में बदल जाता है (उदाहरण के लिए एक सूची टेक्स्टव्यू क्षैतिज स्क्रॉल करने योग्य)।एक रीसाइक्लर व्यू आइटम के दृश्य प्रकार को कैसे बदलें,

RecyclerView एडाप्टर के लिए मेरे कोड इस प्रकार है:

कोड के नीचे टुकड़ा में मैं enum प्रकार की एक arrraylist बनाया है recyclerview में प्रत्येक पंक्ति के क्लिक किया राज्य का ट्रैक रखने के, तो मैं के आकार मिल गया मेरी डाटासेट और 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); 
    } 
} 

नीचे मेरी ViewHolder कक्षा जो मेरे सभी बच्चे विचारों के लिए संदर्भ रखती है साथ प्रत्येक पंक्ति के लिए मेरी ArrayList प्रारंभ, यह View.OnClickListener लागू करता है। यह क्यों लागू होता है View.OnClickListener ऐसा है कि यह क्लिक किए गए राज्यों के बीच टॉगल कर सकता है ताकि तदनुसार दृश्य टाइप बदल सके।

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); 
    } 
} 

यह वह जगह है जहाँ मैं viewType का मूल्य हो रही है getItemViewType द्वारा लौटाए गए और लेआउट

@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); 
    } 
} 

तो यहाँ फुलाया को वापस लौटाती मैं viewType viewholderusing viewholder द्वारा लौटाए गए के अनुसार मूल्यों के साथ देखा गया बाध्यकारी हूँ। 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(); 
} 

और अंत में मेरी getItemViewType तर्क

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

जो मुझे समझ में नहीं आया वह यह है कि जब मैं कोड चलाता हूं तो कुछ भी क्यों नहीं दिखाता है, सबकुछ मेरे लिए मान्य लगता है। मेरी मदद करो !!!!

उत्तर

4

मेरी उदाहरण देखें:

// 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); 

मेरे साथ यह ठीक काम

2

आशा है कि आप अपनी समस्या पता लगा है। यदि नहीं तो, मैंने इसे एफ या आप किया है। गाड़ी लाइन

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

यहाँ तुम क्या कर रहे हो

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

के लिए एक नया आइटम जोड़ रहा है यह एक नया आइटम और mdataList के आकार से जोड़ दिया जाएगा और itemClickState अलग है और इसलिए गलत मिलान होता है।

इसके बजाय itemClickedState.set(getAdapterPosition(), clickedState.SHOW_SECONDARY_CONTENT); का उपयोग करें। और दूसरी बात मुझे समझ में नहीं आता कि tvTicketClass है। यदि यह एक एकल टेक्स्ट व्यू है, तो आपको पहले स्ट्रिंग को जोड़ना चाहिए और उन्हें tvTicketClass.settext(concatenatedstrClass) करना चाहिए। आशा है कि आपको इस पोस्ट से मदद मिलेगी। अगर कोई और मुद्दा है, तो कृपया टिप्पणी करें।

संबंधित मुद्दे