2016-02-13 52 views
0

我已經實現了ViewHolder模式爲我的列表視圖像這樣: -的ListView ViewHolder組件返回空的Android

public class HomeListAdapter : BaseAdapter 
    { 

     public HomeListAdapter(List<Models.MyModel> myList, Activities.HomeActivity homeActivity) 
     { 
      // TODO: Complete member initialization 
      this.myList = myList; 
      this.homeActivity = homeActivity; 
      prefs = PreferenceManager.GetDefaultSharedPreferences(homeActivity); 

      inflater = LayoutInflater.FromContext(homeActivity); 

     } 
     public override int Count 
     { 
      get { return myList.Count; } 
     } 
     public override int ViewTypeCount 
     { 
      get 
      { 
       return 2; 
      } 
     } 

     public override Java.Lang.Object GetItem(int position) 
     { 
      return position; 
     } 



     public override long GetItemId(int position) 
     { 
      return 0; 
     } 
     public override int GetItemViewType(int position) 
     { 
      if (position == 0 || position == 1) 
      { 
       return 1; 
      } 
      else 
      { 
       return 2; 
      } 
     } 
     public override View GetView(int position, View convertView, ViewGroup parent) 
     { 
      View rootView = convertView; 
      MyViewHolder mHolder; 
      var mData = myList[position]; 

      int item = GetItemViewType(position); 
      if(rootView ==null) 
      { 
       mHolder = new MyViewHolder(); ; 
       switch(item) 
       { 
        case 1: 
         rootView = homeActivity.LayoutInflater.Inflate(Resource.Layout.phone_home_big_row2, null); 
         mHolder.txtDate = convertView.FindViewById<TextView>(Resource.Id.txtDate); 
         mHolder.txtTitle = convertView.FindViewById<TextView>(Resource.Id.txtTitle); 

         mHolder.txtDetail = convertView.FindViewById<TextView>(Resource.Id.txtDetail); 
         mHolder.imgPlaceholderImage = convertView.FindViewById<ImageView>(Resource.Id.imgPlaceholderImage); 
         mHolder.txtCategory = convertView.FindViewById<TextView>(Resource.Id.txtCategory); 
         break; 
        case 2: 
         rootView = homeActivity.LayoutInflater.Inflate(Resource.Layout.phone_home_list_row, null); 
         mHolder.txtTitle = convertView.FindViewById<TextView>(Resource.Id.txtTitle); 
         mHolder.txtDate = convertView.FindViewById<TextView>(Resource.Id.txtDate); 
         mHolder.viewColor = convertView.FindViewById<View>(Resource.Id.viewColor); 
         mHolder.imgPlaceholderImage = convertView.FindViewById<ImageView>(Resource.Id.imgPlaceholderImage); 
         break; 
       } 

       rootView.Tag = mHolder; 
      } 
      else 
      { 
       mHolder = (MyViewHolder)rootView.Tag; 
      } 

      switch(item) 
      { 
       case 1: 
        mHolder.txtTitle.Text = mData.Title; 
      if (mHolder.txtDetail != null) 
      { 
       mHolder.txtDetail.Text = mData.BodyText; 
       mHolder.txtDetail.Ellipsize = TextUtils.TruncateAt.End; 
       mHolder.txtDetail.SetMaxLines(3); 
       mHolder.txtDetail.SetTextColor(Color.Black); 
      } 
      if (mHolder.txtCategory != null) 
      { 
       mHolder.txtCategory.Text = mData.NewsSourceTitle; 
       mHolder.txtCategory.SetTextColor(Color.White); 

       mHolder.txtCategory.SetBackgroundColor(Color.ParseColor(mData.Color)); 
      } 
      if (!string.IsNullOrEmpty(mData.PublishedDate)) 
      { 
       mHolder.txtDate.Text = DateTime.Parse(mData.PublishedDate).ToString("dd MMMM yyyy", CultureInfo.InvariantCulture); 
      } 

        break; 
       case 2: 
        mHolder.txtTitle.Text = mData.Title; 

        if (mHolder.viewColor != null) 
        { 
         mHolder.viewColor.SetBackgroundColor(Color.ParseColor(mData.Color)); 
        } 
        if (!string.IsNullOrEmpty(mData.PublishedDate)) 
        { 
         mHolder.txtDate.Text = DateTime.Parse(mData.PublishedDate).ToString("dd MMMM yyyy", CultureInfo.InvariantCulture); 
        } 


        break; 

      } 






      return rootView; 
     } 
     public class MyViewHolder : Java.Lang.Object 
     { 

      public TextView txtTitle { get; set;} 
      public TextView txtDate{ get; set;} 
      public TextView txtDetail{ get; set;} 
      public ImageView imgPlaceholderImage { get; set; } 
      public View viewColor { get; set; } 
      public TextView txtCategory { get; set; } 
     } 
    } 
} 

但我一直mHolder.txtTitle和其他組件爲空,即使mHolder不爲空。我需要根據他們的職位膨脹兩種不同的佈局。我在做什麼錯了?任何幫助表示讚賞。謝謝。所有的

+0

在switch case中,使用rootView.FindViewById而不是convertView.FindViewById。 – Harry

+0

使用「(TextView)rootView.findViewById(R.id.txtDate);」而不是「convertView.FindViewById (Resource.Id.txtDate);」 – Sabari

回答

0

您的問題所產生的回報在特定位置的項目,因爲你的代碼,有時是指rootView有時候爲了convertView

在這一行,你convertView執行findViewByID()

mHolder.txtTitle=convertView.FindViewById<TextView>(Resource.Id.txtTitle); 

但是,你永遠不會檢查是否convertView爲null,並賦予它一個新的View,如果它是。相反,您創建了convertView的新參考,您稱其爲rootView,檢查是否爲爲空,如果是,則指定新的View根視圖。因此,rootView現在非空,但convertView仍然是。

public override View GetView(int position,View convertView,ViewGroup parent) 
    { 
    View rootView=convertView; 
    //... 
    if(rootView==null) 
    { 
     mHolder=new MyViewHolder();; 
     switch(item) 
     { 
     case 1: 
      rootView = homeActivity.LayoutInflater.Inflate(Resource.Layout.phone_home_big_row2,null); 
      mHolder.txtDate=convertView.FindViewById<TextView>(Resource.Id.txtDate); 
         // ^^^^^^^^^^ convertView can still be null!!! 
      //... 
     } 

我建議你刪除對rootView所有引用在你的代碼,只是convertView直接合作。這就是爲什麼它提供給你的方法。

+0

是的。這是問題。感謝您的詳細解答。這確實解決了我的問題,但現在當我向下滾動應用程序崩潰時出現錯誤'java.lang.ArrayIndexOutOfBoundsException:length = 2; index = 2' –

+0

如果您有新問題,請發佈新問題。一個問題,一個答案。如果需要,你可以在你的文章中引用這個問題作爲背景,但在你的新問題中提供所有需要的信息。很高興你解決了這個問題。如果您遇到崩潰,請發佈您的代碼和崩潰日誌,以便我們檢查它。 – rothloup

0

首先,你應該從爲getItem overrided方法

public override Java.Lang.Object GetItem(int position) 
    { 
     return myList(position); 
    }