2015-10-14 98 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