2011-12-28 9 views
16

अभी मेरे ग्रिड व्यू को पॉप्युलेट करने के लिए मैं अपनी प्रत्येक एंड्रॉइड क्रियाकलापों (जो उनमें से अधिकतर हैं) पर विस्तारित बेसएडाप्टर क्लास का उपयोग कर रहा हूं।एंड्रॉइड: अलग-अलग वर्ग फ़ाइल पर बेसएडाप्टर और getLayoutInflater

इसे पढ़ने और बनाए रखने में आसान बनाने के लिए, मैं एक अलग वर्ग फ़ाइल में सभी बेसएडाप्टर कोड डालने की कोशिश कर रहा हूं।

getLayoutInflater के बाद से GridView भर दें, मैं LayoutInflater उपयोग कर रहा हूँ, और यहाँ जहां सामान मुश्किल हो जाता है है ...

() android.Activity से आता है, यह सिर्फ चाल से काम नहीं चलेगा। मैंने अपने एडाप्टर.जावा (ग्रिड व्यूज़ को कक्षाबद्ध करने के लिए कक्षा) को विस्तारित गतिविधि वर्ग बनाने की कोशिश की, और फिर बेसएडाप्टर क्लास (जिस तरह से मैं इसे अभी करता हूं) बनाने के अंदर, लेकिन मैं इसे ठीक से काम करने में सक्षम नहीं हूं। एक

//MainClass.java 
Adapter MyGridAdapter = new Adapter(); 
MyGrid = (GridView)findViewById(R.id.grid); 
MyGrid.setAdapter(MyGridAdapter.new ImageAdapter(this, 6, nombreTema)); 

एप्लिकेशन रन है, लेकिन जब पॉप्युलेट करने के लिए कोशिश कर रहा है, मुझे मिल गया:,

//Adapter.java 
package com.cimp.matitec; 

import greendroid.app.GDActivity; 
import android.content.Context; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.BaseAdapter; 
import android.widget.ImageView; 
import android.widget.TextView; 

public class Adapter extends GDActivity{ 

public class ImageAdapter extends BaseAdapter 
{ 
    Context MyContext; 
    int count; 
    String[] nombre; 

    public ImageAdapter(Context _MyContext, int n, String[] nombre) 
    { 
     MyContext = _MyContext; 
     count = n; 
     this.nombre = nombre; 
    } 

    public int getCount() 
    { 
        /* Set the number of element we want on the grid */ 
     return count; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) 
    { 
     View MyView = convertView; 

     if (convertView == null) 
     { 
     /*we define the view that will display on the grid*/ 

     //Inflate the layout 
     LayoutInflater li = getLayoutInflater(); 
     MyView = li.inflate(R.layout.grid_item, null); 

     // Add The Text!!! 
     TextView tv = (TextView)MyView.findViewById(R.id.grid_item_text); 
     tv.setText(nombre[position]+""); 

     // Add The Image!!!   
     ImageView iv = (ImageView)MyView.findViewById(R.id.grid_item_image); 
     iv.setImageResource(R.drawable.ic_launcher); 
     } 

     return MyView; 
    } 

    @Override 
    public Object getItem(int arg0) { 
     // TODO Auto-generated method stub 
     return null; 
    } 

    @Override 
    public long getItemId(int arg0) { 
     // TODO Auto-generated method stub 
     return 0; 
    } 
} 
} 

बाहर से यह कॉल करने के लिए मैं निम्नलिखित है:

यहाँ कैसे Adapter.java लग रहा है NullPointerException getLayoutInflater()।

कोई जानता है कि मैं क्या खो रहा हूं, या इसे ठीक से कैसे काम करना है?

+0

क्या जीडीएक्टिविटी 'गतिविधि' का विस्तार करती है? – Squonk

+0

यूप, ओई परिप्रेक्ष्य से एक Greendroid गतिविधि –

+0

है, एडाप्टर एक गतिविधि नहीं है, आपका कोड उचित नहीं है। आप सादगी की खोज करते हैं लेकिन समय और जटिलता के साथ समाप्त होते हैं, जिस तरह से Google अनुशंसित सबसे सही नहीं हो सकता है, लेकिन यह कम से कम आईएमओ सबसे उचित और कुशल है। – yorkw

उत्तर

45

से सीधे LayoutInflater ऑब्जेक्ट प्राप्त करने के कई तरीके हैं।

LayoutInflater li = (LayoutInflater) myContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

कृपया LayoutInflater के लिए दस्तावेज़ देखें: तथ्य की बात के रूप में, getLayoutInflater() शायद इस के लिए सिर्फ एक सुविधा विधि है।

+0

मैंने शुरू किया और शुरू करते समय कुछ ऐसा करने की कोशिश की, डुनो क्यों उस समय काम नहीं किया, लेकिन अब यह करता है :)। बहुत बहुत धन्यवाद। –

3

इस पढ़ें ...

Application Fundamentals

... आवेदन घटक अनुभाग में पर क्रियाएँ विशेष रूप से बिट।

का उपयोग कर Activity को तुरंत चालू करने का प्रयास न करें। एक Activity एक विशेष केस एंड्रॉइड क्लास है और इसे नियमित जावा क्लास की तरह नहीं माना जाना चाहिए। एक Activity केवल Intent का उपयोग शुरू करना चाहिए और इसे तुरंत चालू करने के लिए एंड्रॉइड ओएस की ज़िम्मेदारी है।

दूसरे शब्दों में, यह कभी नहीं ...

Adapter MyGridAdapter = new Adapter(); 

इसके अलावा, Adapter एक Android विजेट क्लास का नाम तो नहीं अपने खुद के वर्गों में से एक के नाम के लिए एक अच्छा विकल्प है।

संपादित करें: इसके अलावा एक सहायक वर्ग बनाने और गतिविधि के Context इसे करने के लिए पारित करने के बारे में इस सवाल का here को मेरा उत्तर देखें।

+0

काम करने की ज़रूरत है, मैं पहले से ही ऐसा कर रहा हूं, मैं बेस एडाप्टर को संदर्भ भेजता हूं ... समस्या यह है कि मुझे 'विधि getLayoutInflater() को ImageAdapter प्रकार के लिए अपरिभाषित किया गया है, यही कारण है कि मैं विस्तार कर रहा हूं गतिविधि –

+0

आपने स्पष्ट रूप से मेरे उत्तर पर टिप्पणी नहीं पढ़ी है जहां मैं दूसरे व्यक्ति को अपने मामले में 'mContext.getSystemService (...)' का उपयोग करने के लिए समझाता हूं। यह आपके 'MyContext' पर लागू होता है (जिसे सम्मेलन द्वारा निचले केस अक्षर से शुरू करना चाहिए)। आप 'MyContext.getLayoutInflater() 'वैकल्पिक रूप से' getAplicationContext() का उपयोग कर सकते हैं। GetLayoutInflater() 'को काम करना चाहिए। किसी भी तरह से, 'new' के साथ 'गतिविधि' को तुरंत चालू करने का प्रयास न करें। – Squonk

+0

मैंने जो पोस्ट किया है उसे पढ़ा है, और इसे आजमाया है ... मैं 'लेआउट इन्फ्लेटर ली = MyContext.getLayoutInflater(); '(मैं बाद में मामलों को ठीक कर दूंगा, क्योंकि कुछ कोड मेरा नहीं है) और यह दिखाता है 'विधि getLayoutInflater() को संदर्भ संदर्भ –

1

आप जब वर्ग की एक वस्तु है कि baseadapter कुछ इस LayoutInflater inflater = ((Activity)MyContext)).getLayoutInflater;

की तरह यह एक गतिविधि MyContext डाली हैं प्रदान करता है और उसके बाद GetLayoutInflater() कहा जा सकता है बनाने MainActivity के संदर्भ पास करना चाहिए !!

2

सबसे अच्छा तरीका एक स्थिर विधि LayoutInflator ऑब्जेक्ट कॉन्टेक्स्ट के साथ ऑब्जेक्ट कॉन्टेक्स्ट के साथ ऑब्जेक्ट प्राप्त करने के लिए एकमात्र पैरामीटर के रूप में उपयोग करना है।

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