2015-06-27 14 views
19

मेरे पास एक imageView & एक gridview ..GridView, पहला आइटम दोनों स्तंभ तक फैला

मेरे लेआउट डिजाइन यहाँ ..

enter image description here

मैं एकल में इन दोनों विचारों संयोजित करना चाहते हैं gridview

मेरे सवाल:

कैसे gridview पहला आइटम स्थापित करने के लिए दोनों स्तंभों में फैला होता है?

+0

आपने क्या प्रयास किया? – mdelolmo

+1

मैंने एक उत्तर जोड़ा। मैं सुझाव देना चाहता हूं कि आप अपने प्रश्न का शीर्षक और सामग्री बदल दें, बस इस समाधान के लिए खोज रहे अन्य लोग इसे ढूंढ सकें। शायद कुछ ऐसा है: "दो कॉलम के साथ ग्रिड व्यू, पहला आइटम दोनों स्तंभों को फैलाता है"। –

उत्तर

48

अपने प्रश्न शोध में, मैं नया कुछ सीखा: मैं RecyclerView के लिए GridLayoutManager को देखने के लिए हुआ है और मैंने देखा है आप एक कस्टम SpanSizeLookup सेट कर सकते हैं कि। यदि आप क्षैतिज स्क्रॉल कर रहे हैं तो अब एक "अवधि" केवल एक कॉलम है यदि आप लंबवत स्क्रॉल कर रहे हैं और एक पंक्ति। तो SpanSizeLookup आप उदाहरण के लिए निर्दिष्ट कर सकते हैं, आइटम 0 2 कॉलम लेता है, मद 1 1 कॉलम, आदि लेता

ऐसा लगता है कि समाधान आसान peasy है अगर आप एक GridLayoutManager साथ RecyclerView का उपयोग करें:

@Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     // Create a grid layout with two columns 
     GridLayoutManager layoutManager = new GridLayoutManager(this, 2); 

     // Create a custom SpanSizeLookup where the first item spans both columns 
     layoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() { 
      @Override 
      public int getSpanSize(int position) { 
       return position == 0 ? 2 : 1; 
      } 
     }); 

     RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recyclerview); 
     recyclerView.setLayoutManager(layoutManager); 
     recyclerView.setAdapter(new MyGridAdapter()); 
    } 

मैंने इसे परीक्षण करने के लिए एक परीक्षण प्रोजेक्ट बनाया है और यह सुनिश्चित कर लिया है कि मैंने ऐसा किया जो मैंने किया था, और यह एक आकर्षण की तरह काम करता था।


एडाप्टर के बारे में एक नोट: RecyclerView.AdapterListAdapter साथ संगत नहीं है। आपको अपने एडाप्टर को RecyclerView.Adapter से विस्तारित करने और उचित परिवर्तन करने की आवश्यकता है।

public static class MyViewHolder extends RecyclerView.ViewHolder { 

     ImageView mImageView; 
     TextView mTextView; 

     public MyViewHolder(View itemView) { 
      super(itemView); 
      mImageView = (ImageView) itemView.findViewById(R.id.imageView); 
      mTextView = (TextView) itemView.findViewById(R.id.textView); 
     } 
    } 

    public static class MyGridAdapter extends RecyclerView.Adapter<MyViewHolder> { 

     private int[] mDrawables; 

     public MyGridAdapter() { 
      this.mDrawables = new int[] { 
        R.drawable.images_01, 
        R.drawable.images_02, 
        . 
        . 
        . 
      }; 
     } 

     @Override 
     public int getItemCount() { 
      return mDrawables.length; 
     } 

     @Override 
     public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 

      LayoutInflater inflater = (LayoutInflater) parent.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      View view = inflater.inflate(R.layout.layout_grid_item, parent, false); 
      MyViewHolder holder = new MyViewHolder(view); 
      // set up any onClickListener you need on the view here 
      return holder; 
     } 

     @Override 
     public void onBindViewHolder(MyViewHolder holder, int position) { 

      holder.mImageView.setImageResource(mDrawables[position]); 
      holder.mTextView.setText("Image " + position); 
     } 
    } 

सबसे पहले, एक RecyclerView.ViewHolder उपवर्ग बनाएँ:

यहाँ अनुकूलक मैं अपने परीक्षण परियोजना के लिए बनाया गया है। व्यू धारक पैटर्न अब एडाप्टर दृश्य करने के इस नए तरीके का एक अभिन्न हिस्सा है। आपका ViewHolder आपके दृश्य के लिए सभी बच्चे के विचार सेट अप करेगा।

फिर आपके RecyclerView.Adapter उपclass में, onCreateViewHolder() और onBindViewHolder() ओवरराइड करें। onCreateViewHolder() में आप अपना विचार बढ़ाते हैं और ViewHolder का निर्माण करते हैं। onBindViewHolder() में, आप एडाप्टर डेटा प्राप्त करने के लिए position का उपयोग करते हैं और ViewHolder का उपयोग करके बच्चे के दृश्य सेट अप करते हैं। तो RecyclerView तकनीकी रूप से ViewHolder एस रीसायकल करता है जिसमें View एस शामिल है।

एक बार जब आप अपने एडाप्टर में ये परिवर्तन करते हैं, तो आपको पूरा सेट होना चाहिए।

+0

मैं अपने imageview और ग्रिडव्यू को recyclerview के साथ प्रतिस्थापित करता हूं। इसके बाद अपना कोड लागू करें .. मुझे recyclerView.setAdapter (एडाप्टर) में त्रुटि मिली है; – AndroidDev

+1

अफसोस की बात है, 'RecyclerView.Adapter'' ListAdapter' के साथ संगत नहीं है, इसलिए आपको अपने एडाप्टर को थोड़ा सा पुनर्व्यवस्थित करना होगा। मैं इसके बारे में कुछ जोड़ने के लिए अपना जवाब अपडेट कर दूंगा। –

+0

धन्यवाद आदमी..यह अद्भुत काम करता है..क्या आप साझा कर सकते हैं कि समाधान कैसे प्राप्त करें? क्योंकि मैं इस समस्या के लिए 10 से अधिक दिनों की खोज करता हूं। गुगलिंग का जवाब उत्तर प्रदान नहीं करता .. – AndroidDev

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