2011-09-20 14 views
5

मैं पंक्तियों के लिए अनुकूलित दृश्य के साथ एक सूची बनाने के लिए कोशिश कर रहा हूँ है, प्रत्येक पंक्ति एक छवि देख सकते हैं और दो पाठ विचारों शामिल होंगे।ArrayAdapter डेटा सेट में तत्वों की संख्या शून्य

आदेश करने के लिए तो मैं ArrayAdapter वर्ग (PostersArrayAdapter कहा जाता है) और व्यवस्था डेटा और पंक्ति लेआउट के बीच सही संबंध बनाने के लिए getView() विधि अधिरोहित बढ़ाया।

हालांकि, जब मैं कुछ डेटा के साथ पोस्टरडेटा वर्ग (मेरे कार्यान्वयन) की एक सरणी के साथ पोस्टरअरे ऐडाप्टर बनाने का प्रयास करता हूं तो परिणाम यह है कि एडाप्टर खाली है, मतलब getCount() शून्य देता है और सूची दृश्य खाली है।

किसी को भी कर सकते हैं सुझाव क्या मैं गलत कर रहा हूँ? मैं यहां एक कोड पर भरोसा कर रहा हूं जो मुझे मिला - http://www.vogella.de/articles/AndroidListView/article.html

बहुत बहुत धन्यवाद!

यहाँ प्रासंगिक कोड है:

public class PostersListActivity extends ListActivity { 
final private int NUM_OF_PICS = 2; 
private ContentGetter cg; 
private PosterData[] posters; 
private ListView  listView; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    cg = new ContentGetter(NUM_OF_PICS); 
    try 
    { 
     posters = cg.parseIndexFile(); 
     int res = cg.DownloadPosterPics(1); 

    } 
    catch (ClientProtocolException e) 
    { 
     e.printStackTrace(); 
    } 
    catch (IOException e) 
    { 
     e.printStackTrace(); 
    } 

    // Use our own list adapter 
    listView = (ListView)findViewById(android.R.id.list); 
    //listView.setAdapter((ListAdapter) new ArrayAdapter<String>(this,R.layout.list_item,R.id.title,titles)); 
    PostersArrayAdapter postersAdapter = new PostersArrayAdapter(this, posters); 
    Log.d("PostersListActivity.onCreate()","Number of elementes in the data set of the adapter is " + postersAdapter.getCount()); 
    listView.setAdapter(postersAdapter); 
} 


public class PostersArrayAdapter extends ArrayAdapter<PosterData> { 
    private final Activity context; 
    private final PosterData[] posters; 

    public PostersArrayAdapter(Activity context, PosterData[] posters) { 
     super(context, R.layout.list_item); 
     this.context = context; 
     this.posters = posters; 
    } 

    // static to save the reference to the outer class and to avoid access to 
    // any members of the containing class 
    class ViewHolder { 
     public ImageView logo; 
     public TextView title; 
     public TextView names; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     // ViewHolder will buffer the assess to the individual fields of the row 
     // layout 

     ViewHolder holder; 
     // Recycle existing view if passed as parameter 
     // This will save memory and time on Android 
     // This only works if the base layout for all classes are the same 
     View rowView = convertView; 
     if (rowView == null) 
     { 
      LayoutInflater inflater = context.getLayoutInflater(); 
      rowView = inflater.inflate(R.layout.list_item, null, true); 
      holder = new ViewHolder(); 
      holder.title = (TextView) rowView.findViewById(R.id.title); 
      holder.names = (TextView) rowView.findViewById(R.id.names); 
      holder.logo = (ImageView) rowView.findViewById(R.id.logo); 
      rowView.setTag(holder); 
     } 
     else 
     { 
      holder = (ViewHolder) rowView.getTag(); 
     } 

     holder.title.setText(posters[position].getTitle()); 
     holder.names.setText(posters[position].getNames()); 
     holder.logo.setImageResource(R.drawable.icon); 

     return rowView; 
    } 
} 
} 

यहाँ सूची दृश्य लेआउट मैं उपयोग कर रहा हूँ है (PosterData वर्ग दो स्ट्रिंग क्षेत्रों के साथ सिर्फ एक वर्ग है):

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent"> 
    <TextView android:id="@+id/textView1" 
     android:textAppearance="?android:attr/textAppearanceLarge" 
     android:layout_height="wrap_content" 
     android:layout_width="wrap_content" 
     android:text="@string/selectPoster" 
     android:layout_gravity="center_horizontal"> 
    </TextView> 
    <ListView android:id="@android:id/list" 
     android:layout_height="wrap_content" 
     android:layout_width="match_parent"> 
    </ListView> 
</LinearLayout> 

और यहाँ है सूची तत्व लेआउट का उपयोग कर रहा हूं:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="wrap_content" android:layout_height="wrap_content"> 

    <LinearLayout android:id="@+id/linearLayout1" 
     android:layout_height="match_parent" 
     android:layout_width="wrap_content" > 

     <ImageView android:id="@+id/logo" 
      android:src="@drawable/icon" 
      android:layout_height="wrap_content"    
      android:layout_width="22px" 
      android:layout_marginTop="4px" 
      android:layout_marginRight="4px" 
      android:layout_marginLeft="4px"> 
     </ImageView> 

     <LinearLayout android:id="@+id/linearLayout2" 
      android:layout_height="match_parent" 
      android:layout_width="fill_parent" 
      android:orientation="vertical"> 
      <TextView android:id="@+id/title" 
       android:text="TextView" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:textSize="30px"> 
      </TextView> 
      <TextView android:id="@+id/names" 
       android:text="TextView"    
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content"> 
      </TextView>    
     </LinearLayout> 

    </LinearLayout> 
</LinearLayout> 

उत्तर

13

सुनिश्चित करें कि getCount() ठीक से कार्यान्वित किया गया है इसलिए:

 @Override 
    public int getCount(){ 
      return posters!=null ? posters.length : 0; 
    } 

संपादित करें:

ArrayAdapter(Context context, int textViewResourceId) 

निर्माता आप निर्माता के लिए वस्तुओं के अपने सरणी गुजर नहीं कर रहे हैं फोन करके।

आप

ArrayAdapter(Context context, int textViewResourceId, T[] objects) 

निर्माता जो भी पैरामीटर के रूप में ऑब्जेक्ट की श्रेणी लेता बुला जाना चाहिए।

+0

ठीक है, अब यह सही संख्या लौटाता है। इससे भी बेहतर, अब सूची सही ढंग से दिखाई देती है (सूची खाली होने से पहले)। GetCount विधि को ओवरराइड करने से यह हल क्यों हुआ? –

+0

मुझे लगता है कि ऐसा इसलिए है क्योंकि आप सही सुपर कन्स्ट्रक्टर –

+0

पर कॉल नहीं कर रहे हैं, सही कॉल करने से getCount को ओवरराइड करने की आवश्यकता को रोका जा सकेगा? आपको क्यों लगता है कि मैं सही कॉल नहीं कर रहा हूं? किस सिद्धांत ने आपको इस निष्कर्ष पर पहुंचाया? –

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