在ListView中显示ArrayList项包含2个textviews

时间:2012-03-09 09:04:00

标签: android listview android-listview custom-adapter

我想在ListView中显示有两个不同textViews的arrayList项。  我正在使用ListViewCustomAdapter和getView(),getItem()...方法。

这是我的代码: MyCustom.java:

public class MyCustom extends BaseAdapter {
  public Activity context;  
  public LayoutInflater inflater; 
  ArrayList mylist;

  public MyCustom(Activity context,ArrayList viewList) {
        super();
        this.context=context;
        this.mylist=viewList;

        inflater=(LayoutInflater)context.getSystemService(context.LAYOUT_INFLATER_SERVICE);

  }

  @Override
  public int getCount() {
    // TODO Auto-generated method stub
    return mylist.size();
  }

  @Override
  public Object getItem(int position) {
    // TODO Auto-generated method stub
    return position;
  }

  @Override
  public long getItemId(int position) {
    // TODO Auto-generated method stub
    return position;
  }


  @Override
  public View getView(int position, View convertView, ViewGroup parent) {
    // TODO Auto-generated method stub

    View List;
    if(convertView==null)
    {
        List=new View(context);
        LayoutInflater mLayoutinflater=(LayoutInflater)context.getSystemService(context.LAYOUT_INFLATER_SERVICE);
        List=mLayoutinflater.inflate(R.layout.listitem_row, parent, false);
    }
    else
    {
        List=(View)convertView;

    }

    TextView t1=(TextView)List.findViewById(R.id.txtViewTitle);
    t1.setText((CharSequence) mylist.get(position));

    TextView t2=(TextView)List.findViewById(R.id.txtViewDescription);
    t2.setText(mylist.get(position).toString());


    return List;
  }
}

以上代码,存在如下所述的问题。 这将在ListView的两个textview中将arrayList项显示为相同。 例如: MYLIST = [ 'A1', 'A2', 'B1', 'B2'] 这是我的arraylist并传递给MyCustomAdapter。

在运行时,'a1'将同时显示在textviews中。依此类推。

我想在textView1中显示'a1',而'a2'在textView2中显示..而b1是......所以......

我想我可能在getItem(),getItemId(),getcount()方法中遇到问题。 请帮助我...

3 个答案:

答案 0 :(得分:2)

从你的问题中可以清楚地看到你要显示[a1,a2,b1,b2,c1,c2 ......] 如

a1a2
b1b2
c1c2

因此您需要将代码更改为以下内容:

@Override
public int getCount() {
    // TODO Auto-generated method stub
    if(myList.size()%2==0)
        return mylist.size()/2;
    else
        return myList.size()/2+1;
}

和getView方法如下:

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    // TODO Auto-generated method stub

    View List;
    if(convertView==null)
    {
        List=new View(context);
        LayoutInflater mLayoutinflater=(LayoutInflater)context.getSystemService(context.LAYOUT_INFLATER_SERVICE);
        List=mLayoutinflater.inflate(R.layout.listitem_row, parent, false);
    }
    else
    {
        List=(View)convertView;

    }

    TextView t1=(TextView)List.findViewById(R.id.txtViewTitle);
    t1.setText((CharSequence) mylist.get(position*2));


    TextView t2=(TextView)List.findViewById(R.id.txtViewDescription);
    if(position*2<getCount())
           t2.setText(mylist.get(position*2+1).toString());


    return List;
}

答案 1 :(得分:0)

你的适配器getview是完美的,但你的逻辑错了.. 我更喜欢用2个字符串制作类对象, 等。

public class MyClass
{
  String one;
  String two;
}

并将您的列表设为

ArrayList<MyClass> mylist = new ArrayList<MyClass>();

然后像你想要的那样设置文本。

TextView t1=(TextView)List.findViewById(R.id.txtViewTitle);
t1.setText(mylist.get(position).one);           //String one= "a1" according to position in mylist
                                                //it will be = "b1" on next position
                                              //no need of casting to CharSequence

TextView t2=(TextView)List.findViewById(R.id.txtViewDescription);
t2.setText(mylist.get(position).two);           //String two= "a2"

答案 2 :(得分:0)

在某些适配器方法中有错误的实现。

getItem()应该从列表中的位置返回对象:

@Override
public Object getItem(int position) {
    return myList.get(position);
}

然后,在getView

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    //  Create view
    //   ...

    String[] item = (String[])getItem(position);  //  Get the current object at 'position'


    //  Update your view here
    TextView t1=(TextView)List.findViewById(R.id.txtViewTitle);
    t1.setText(item[0]);

    TextView t2=(TextView)List.findViewById(R.id.txtViewDescription);
    t2.setText(item[1]);
}

如果你想显示两个不同的字符串,我建议你的列表应该是这样的

[new String[]{"a1", "a2"}, new String[]{"b1", "b2"}, ...]