2016-01-03 39 views
0

我有一個列表視圖與不同的樣式項目,一個標題樣式(黑色)與該日期的項目的日期和項目階梯。不同佈局樣式的列表視圖回收

現在我向下滾動信息不在正確的項目。有時標題會在黑色欄中顯示,有時候日期會顯示在項目窗口中。

此外,圖像是不正確的。我在我正在構建的應用程序中使用像這樣的listview適配器,但從來沒有這樣做,這是我第一次在單個listview中使用不同的佈局。

我使用Aquery進行圖像加載。

請指出我的錯誤,請。

Greathings

enter image description here

粘結劑的Java

public class BinderData_TvGids extends BaseAdapter { 
    LayoutInflater inflater; 
    List<HashMap<String,String>> TvGids; 
    ViewHolder holder; 

    public BinderData_TvGids() {} 

    public BinderData_TvGids(Activity act, List<HashMap<String, String>> map) { 
     this.TvGids = map; 
     inflater = (LayoutInflater) act.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    } 

    public int getCount() { 
     return TvGids.size(); 
    } 

    public Object getItem(int arg0) { 
     return null; 
    } 

    public long getItemId(int position) { 
     return 0; 
    } 

    public View getView(int position, View convertView, ViewGroup parent) { 
     File ext = Environment.getExternalStorageDirectory(); 
     File cacheDir = new File(ext, "/android/data/apk/case"); 
     AQUtility.setCacheDir(cacheDir); 
     AQuery aq = new AQuery(convertView); 

     ViewHolder holder = null; 
     View vi=convertView; 
     if(TvGids.get(position).get("header").equals("true")) { //headers worden meegegeven uit array, deze krijgen een apparten layout 
      if (convertView == null) { 
       vi = inflater.inflate(R.layout.list_row_tvgids_header, null); 
       holder = new ViewHolder(); 
       holder.titel = (TextView) vi.findViewById(R.id.titel); // naam 
       vi.setTag(holder); 
      } else { 
       holder = (ViewHolder) vi.getTag(); 
      } 
      if (holder.titel != null) 
       holder.titel.setText(TvGids.get(position).get("datum")); // naam 
      return vi; 
     } else { 
      if (convertView == null) { 
       vi = inflater.inflate(R.layout.list_row_tvgids, null); 
       holder = new ViewHolder(); 
       holder.poster =(ImageView)vi.findViewById(R.id.poster); // poster 
       holder.zenderlogo =(ImageView)vi.findViewById(R.id.ZenderLogo); // poster 
       holder.titel = (TextView) vi.findViewById(R.id.titel); // naam 
       holder.starttijd = (TextView) vi.findViewById(R.id.starttijd); // naam 
       holder.loader =(ProgressBar)vi.findViewById(R.id.progress); // progressbar 
       vi.setTag(holder); 
      } else { 
       holder = (ViewHolder) vi.getTag(); 
      } 

      if (holder.poster != null & holder.loader != null) 
        if(!TvGids.get(position).get("film_key").contains("TV") && !TvGids.get(position).get("film_key").contains("BS")) { 
         holder.poster.setVisibility(View.INVISIBLE); 
         aq.id(holder.poster).progress(holder.loader).image("http://cdn.be/hosting/movie/" + TvGids.get(position).get("film_key") + "/null/200/poster.jpg", false, true, 0, R.drawable.poster_x, null, AQuery.FADE_IN_NETWORK); 
        } else { 
         holder.loader.setVisibility(View.INVISIBLE); 
        } 
      if (holder.zenderlogo != null) 
       aq.id(holder.zenderlogo).image("http://cdn.be/hosting/zender/rw.php?zender=" + TvGids.get(position).get("zender") + "&size=166&opacity=50", false, true, 0, 0, null, AQuery.FADE_IN); 
      if (holder.starttijd != null) 
       holder.starttijd.setText(TvGids.get(position).get("starttijd")); // naam 
      if (holder.titel != null) 
       holder.titel.setText(TvGids.get(position).get("titel")); // naam 
      return vi; 
     } 
    } 

    static class ViewHolder{ 
     TextView starttijd; 
     TextView titel; 
     ImageView poster; 
     ImageView zenderlogo; 
     ProgressBar loader; 
    } 
} 

回答

0

現在你的ListView不知道標題和正常項目之間的區別。它認爲你所有的物品都是一樣的。這會在您真正開始回收視圖時導致問題,因爲您將得到錯誤的行佈局,如convertView

你需要做以下任一操作策略:

  1. 使用getItemViewType()getViewTypeCount()。使用這些方法ListView現在將知道有不同的項目類型,並將正確地回收它們,但它要求getCount()返回項目數量加上標題數量(我不確定您的當前實現是否執行此操作)。我會向您推薦一個名爲The World of ListView的視頻,以更詳細地解釋這一點。

  2. 將標題置於佈局XML中的常規項目,並僅使用此佈局。默認情況下使標題可見性爲GONE。如果項目應顯示標題,請將標題可見性設置爲VISIBLE。這將爲所有列表項目使用一種佈局,但會犧牲視圖層次結構中的某些額外視圖。

基本上,#1正確實現兩種不同類型的列表項,而#2通過使實際列表項相同的項目則正好相反。


還有另外一種選擇:使用RecyclerView,並使用ItemDecoration代替實施頭。我會讓你自己去探索這個。

+0

我已經做了選項2,它現在工作正常,坦克。 – user3142817

0

請重寫BaseAdapter的getItemViewType()
並嘗試下面的代碼。

public int getItemViewType (int position) { 
    if(TvGids.get(position).get("header").equals("true")){ 
     return 0; 
    }else{ 
     return 1; 
    } 
} 
+0

對不起,Karakuri的選項2是第一個。 – user3142817