2015-12-24 9 views
14

मुझे रीसाइक्लिंग व्यू के आइटमों के बीच एक छोटी पट्टी जोड़ने की आवश्यकता है। यह पट्टी सूची में विभिन्न वस्तुओं के बाद आ सकती है। इसे गतिशील रूप से किया जाना चाहिए। मुझे फ़िटबिट द्वारा किए गए कुछ को कार्यान्वित करने की आवश्यकता है: enter image description hereएंड्रॉइड में रीसाइक्लिंग व्यू के आइटम्स के बीच गतिशील दृश्य कैसे जोड़ें?

मुझे पहली पंक्ति की भी आवश्यकता है यानी "यह सप्ताह" शीर्ष पर चिपकने वाला है, भले ही पृष्ठ स्क्रॉल हो।

+3

आपको दो दृश्य प्रकारों का उपयोग करना होगा। [यह सवाल] देखें (http: // stackoverflow।कॉम/प्रश्न/26245139/कैसे-से-निर्माण-रीसाइक्लर्विव-साथ-एकाधिक-दृश्य-प्रकार) यह देखने के लिए कि इसे कैसे कार्यान्वित किया जाए। यह आप प्राप्त करने के लिए एक सुराग हो सकता है। – Fllo

+0

हां, मैंने केवल वर्तमान में इसका उपयोग किया है। लेकिन एक मुद्दा अभी भी लिंग है - अगर हम स्क्रॉल करते हैं तो भी फिटबिट स्क्रीन के शीर्ष पर चिपकने वाला हेडर पंक्ति कैसे रखता है? – Sid

+4

आप इसे [लाइब्रेरी] (https://github.com/timehop/sticky-headers-recyclerview) आज़मा सकते हैं आप आइटम और हेडर के लिए कस्टम लेआउट सेट कर सकते हैं, इसलिए मुझे लगता है कि यह – Cilenco

उत्तर

5

आपको getItemViewType(int) का उपयोग करके विभिन्न दृश्य प्रकारों की अवधारणा का उपयोग करना चाहिए। फिर onCreateViewHolder(ViewGroup, int) पर आप जांच सकते हैं कि आपको किस प्रकार का फुलाया जाना चाहिए/बनाना चाहिए।

उदाहरण:

@Override 
public int getItemViewType(int position) { 
    // you should return the view type, based on your own dynamic logic 
} 

@Override 
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    switch (viewType) { 
     // handle each view type accordingly 
    } 
} 
+0

क्या आप एक लिंक या उदाहरण प्रदान कर सकते हैं? – mrid

0

आप बस getItemViewType() का उपयोग करके, अपने RecyclerView में कई दृश्य प्रकार की अवधारणा का उपयोग कर सकते हैं और onCreateViewHolder() में viewType पैरामीटर का ख्याल रखना।

उदाहरण के लिए आप मॉडल नीचे का उपयोग कर सकते हैं:

public class Data{ 
      int field1; 
      float filed2; 
      int rowType // 1,2,2,...N this will fill by you whenever you will  
         //creating arraylist for your recyclerview 
    } 


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

    ArrayList<Data> mItems; 

    class ViewHolderRowType1 extends RecyclerView.ViewHolder { 
     ... 
    } 

    class ViewHolderRowType2 extends RecyclerView.ViewHolder { 
     ... 
    } 

    .... 
    class ViewHolderRowTypeN extends RecyclerView.ViewHolder { 
     ... 
    } 

    @Override 
    public int getItemViewType(int position) { 
     return mItems.get(position).rowType; 
     //or 
     //return positon%2; // This will based on your condition   
    } 

    @Override 
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     switch (viewType) { 
      case 0: return new ViewHolderRowType0(...); 
      case 1: return new ViewHolderRowType1(...); 
      ... 
      case N: return new ViewHolderRowTypeN(...); 
     } 
    } 

    @Override 
    public void onBindViewHolder(RecyclerView.ViewHolder vh, int position) { 

    //Just check which view type is going to bind and then fill the data accordingly in your rows 


     if(vh instanceof ViewHolderRowType1){ 
     // Fill the data for first view type 


     } else if (vh instanceof ViewHolderRowType2) { 
     // Fill the data for second view type 


     } else if (vh instanceof ViewHolderRowTypeN){ 
     // Fill the data for Nth view type 


     } 

    } 

अपने चिपचिपा "इस दृश्य कमजोर" के लिए, आप इसे अपने RecyclerView के शीर्ष पर जोड़ने और फिर RecyclerView

की
0

पुस्तक घटना से इसे संभाल कर सकते हैं ऐसे RecyclerView

  1. अपनी आवश्यकता (अधिमान्य) के आधार पर प्रत्येक लेआउट और छुपा/शो में शीर्षलेख जोड़ें।
  2. या शीर्षलेख और सामग्री के लिए दो अलग-अलग लेआउट का उपयोग करें (बेहतर नहीं है क्योंकि यह एडाप्टर में आइटम्स की कुल गणना में समस्या का कारण बन सकता है)।

अपने कस्टम POJO/GetterSetter कक्षा में, headerStatus (या तो बूलियन या पूर्णांक) के लिए एक क्षेत्र को जोड़ने, हैडर दिखाने या नहीं पहचान करने के लिए।

अब एडाप्टर में public int getItemViewType(int position) ओवरराइड करें।

static final int TYPE_ITEM = 0; 
 
static final int TYPE_SEPARATOR = 1; 
 
@Override 
 
public int getItemViewType(int position) { 
 
\t if (mData.get(position).getHeaderStatus() == 0) 
 
\t \t return TYPE_ITEM; 
 
\t else 
 
\t \t return TYPE_SEPARATOR; 
 
}

अब getView() में लेआउट से बढ़ाने का समय आपके द्वारा

int rowType = getItemViewType(position);

पंक्ति प्रकार की जांच कर सकते मामले 1 के लिए, आप दिखाई शीर्षक और करने की जरूरत है इसमें उचित डेटा सेट करें। मामले 2 के लिए, आपको उस हेडर लेआउट को बढ़ाने और इसमें उचित डेटा जोड़ने की आवश्यकता है।

0

उपयोग करने के लिए आप "उचित" तरीके से करना चाहते हैं, हैक्स के बिना आसान है आप अपने खुद के LayoutManager लिखना चाहिए, और हाथ से उन मामलों को संभालते हैं। यह उतना कठिन नहीं है जितना लगता है, लेकिन कुछ प्रयास करेंगे।

+0

क्या आप लेआउट प्रबंधक का कोई उदाहरण प्रदान कर सकते हैं? –

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