2015-10-14 88 views
0

我檢查了以前的答案和文件關於這個主題,但我不能適應我的情況。我有兩個數組列表,裏面充滿了我的特殊類對象。我在xml中有兩種不同類型的行。我想創建兩個不同的行,並在我的適配器類中填充相關的ArrayList項目。粗體代碼:自定義ListView行Android

public class KanalAdapter extends BaseAdapter { 

Context context; 
ArrayList<OfficialKanal> officialKanals; 
ArrayList<NormalKanal> normalKanals; 
LayoutInflater lala; 
public KanalAdapter(Context context , ArrayList<OfficialKanal> officiallar, ArrayList<NormalKanal> normaller){ 
    this.context = context; 
    officialKanals = officiallar; 
    Log.i("tago" , "tagtag"); 
    normalKanals = normaller; 
    lala = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
} 

public int getCount() { 
    return normalKanals.size()+officialKanals.size(); 
} 

public Object getItem(int i) { 
    return ?? 
} 

public long getItemId(int i) { 
    return ?? 
} 

@Override 
public int getItemViewType(int position) { 
    return ?? 
} 

@Override 
public int getViewTypeCount() { 
    return 2; 
} 

public View getView(int position, View convertView, ViewGroup viewGroup) { 
    KanalHolder holder; 
    int type = getItemViewType(position); 
    if(convertView==null){ 
     holder = new KanalHolder(); 
     switch (type){ 
      case 0: 
       convertView = lala.inflate(R.layout.normalkanal,null); 
       holder.image1 = (ImageView) convertView.findViewById(R.id.imageView5); 
       holder.tv1 = (TextView) convertView.findViewById(R.id.textView4); 
       Log.i("tago", "tagtagtag"); 
       holder.tv2 = (TextView) convertView.findViewById(R.id.textView8); 
       holder.buton1=(Button) convertView.findViewById(R.id.button8); 
       break; 
      case 1: 

       break; 

     } 
     convertView.setTag(holder); 
    }else{ 
     holder = (KanalHolder)convertView.getTag(); 
    } 
    holder.tv1.setText(normalKanals.get(position).getKanaladi()); 
     holder.image1.setImageResource(R.mipmap.aliprof); 
    return convertView; 
} 


static class KanalHolder{ 
    public ImageView image1; 
    public TextView tv1 , tv2; 
    public Button buton1; 
} 

我可以處理getView部分,但我應該如何使用其他方法?

回答

1

這裏是解決

首先,將Kanal對象全部放入一個ArrayList。不需要兩個ArrayList,也可以使它爲typ e Object

我沒有測試它,但這應該適合你,或者至少你會明白。

ArrayList<Object> kanals = new ArrayList<>(); 
int OFFICIAL_KANAL = 1, NORMAL_KANAL = 2; 

public KanalAdapter(Context context , ArrayList<OfficialKanal> officiallar, ArrayList<NormalKanal> normaller){ 

    ArrayList<Object> kanals = new ArrayList<>(); 

    for (int i = 0; i < officiallar.size(); i++) { 
     kanals.add(officiallar.get(i)); 
    } 

    for (int i = 0; i < normaller.size(); i++) { 
     kanals.add(normaller.get(i)); 
    } 

} 

public Object getItem(int i) { 
    return kanals.get(i); 
} 

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

@Override 
public int getItemViewType(int position) { 
    //here is the main logic 
    //android will take care of listview 

    Object item = getItem(position); 
    if(item instanceof NormalKanal) 
     return NORMAL_KANAL; 
    if(item instanceof OfficialKanal) 
     return OFFICIAL_KANAL; 

    return -1; 
} 

@Override 
public int getViewTypeCount() { 
    return 2; //because we have two different views. 
} 

@Override 
public View getView(int position, View convertView, ViewGroup viewGroup) { 
    KanalHolder holder; 
    Object currentKanal = getItem(position); 
    if(convertView==null){ 

     holder = new KanalHolder(); 

     if(currentKanal instanceof NormalKanal) { 
     //inflate 
     } 

     if(currentKanal instanceof NormalKanal) { 
     //inflate etc.. 
     } 

     convertView.setTag(holder); 

    }else{ 
     holder = (KanalHolder)convertView.getTag(); 
    } 

    if(currentKanal instanceof NormalKanal) { 
     //setText or setImage etc.. 
    } 

    if(currentKanal instanceof NormalKanal) { 
     //setText or setImage etc.. 
    } 

    return convertView; 
} 
+0

謝謝你的詳細解答 – Bad0

0

您可以擴展ArrayAdapter<Object>並傳遞一個包含兩個項目對象的數組列表,然後您將不必重寫這些方法。

我推薦創建抽象類來包裝你的兩個類,並讓它們實現這個抽象,這樣你就可以擴展ArrayAdapter<Your Abstract>而不是使用Object。

並檢查了這個問題:Android ListView with different layouts for each row

getview會看起來像那麼 「這個片段被從回答上面的鏈接檢查它的更多細節

@Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder = null; int type = getItemViewType(position); System.out.println("getView " + position + " " + convertView + " type = " + type); if (convertView == null) { holder = new ViewHolder(); switch (type) { case TYPE_ITEM: convertView = mInflater.inflate(R.layout.item1, null); holder.textView = (TextView)convertView.findViewById(R.id.text); break; case TYPE_SEPARATOR: convertView = mInflater.inflate(R.layout.item2, null); holder.textView = (TextView)convertView.findViewById(R.id.textSeparator); break; } convertView.setTag(holder); } else { holder = (ViewHolder)convertView.getTag(); } holder.textView.setText(mData.get(position)); return convertView; }   } 
+0

我檢查了幾次,但沒有解決。謝謝你的回答,但它不符合我的問題,或者我不明白。 – Bad0

+0

我不明白什麼仍然不會與你合作 –

+0

我可以使用arrayadapter與一個arraylist(兩個不同arraylist的總和)。但是,我怎麼能根據這兩個不同的arraylist顯示兩個不同的xml行? – Bad0