2013-07-30 14 views
0

我有一个自定义的listView与三个textViews。数据来自一个包含三个ArrayLists的类,其中两个是字符串,最后一个是Integer。我没有任何问题,因为我看到当我通过log.d在logCat上显示ArrayList值时,所有三个ArrayLists都有其尊重项目,所以我没有任何问题。Android - ArrayList <Integer>无法在自定义列表中正确显示VIew

在我看来,我显示数据的方式有问题。

以下是文件: list_row_layout.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" > 

    <TextView 
    android:id="@+id/variant" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_alignParentLeft="true" 
    android:layout_alignParentTop="true" 
    android:text="variant" /> 

    <TextView 
    android:id="@+id/quantity" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_alignParentRight="true" 
    android:layout_alignParentTop="true" 
    android:text="quantity" /> 

    <TextView 
    android:id="@+id/unit" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_alignParentTop="true" 
    android:layout_marginRight="221dp" 
    android:layout_toLeftOf="@+id/quantity" 
    android:text="unit" /> 

</RelativeLayout> 

这里是我的activity_order_form.xml有ListView控件元素的一部分。

<RelativeLayout 
    android:id="@+id/relativeLayout3" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_alignParentBottom="true" 
    android:layout_alignParentLeft="true" 
    android:layout_below="@+id/relativeLayout2" 
    android:orientation="vertical" > 

    <TextView 
     android:id="@+id/textViewVariantB" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_marginLeft="94dp" 
     android:text="Variant" 
     android:textAppearance="?android:attr/textAppearanceLarge" /> 

    <TextView 
     android:id="@+id/textViewUnit" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentRight="true" 
     android:layout_alignParentTop="true" 
     android:layout_marginRight="123dp" 
     android:text="Unit" 
     android:textAppearance="?android:attr/textAppearanceLarge" /> 

    <ListView 
     android:id="@+id/listViewProductOrder" 
     android:layout_width="match_parent" 
     android:layout_height="350dp" 
     android:layout_alignParentBottom="true" 
     android:layout_alignParentLeft="true" 
     android:layout_alignParentRight="true" 
     android:layout_below="@+id/textViewVariantB" > 

    </ListView> 
</RelativeLayout> 

这里是存储ArrayList的类。

public class CurrentOrderClass { 

    private String productName; 

    //ArrayLists 
    private ArrayList<String> variantArray = new ArrayList<String>(); 
    private ArrayList<String> unitArray = new ArrayList<String>(); 
    private ArrayList<Integer> quantityArray = new ArrayList<Integer>(); 


    //TODO ArrayList functions 
    public ArrayList<String> getUnitArray() { 
    return unitArray; 
    } 

    public void setUnitArray(ArrayList<String> unitArray) { 
    this.unitArray = unitArray; 
    } 

    public void addToUnitArray(String unit){ 
    this.unitArray.add(unit); 
    } 



    public ArrayList<Integer> getQuantityArray() { 
    return quantityArray; 
    } 

    public void setQuantityArray(ArrayList<Integer> quantityArray) { 
    this.quantityArray = quantityArray; 
    } 

    public void addToQuantityArray(int quantity){ 
    this.quantityArray.add(quantity); 
    } 



    public ArrayList<String> getVariantArray() { 
    return variantArray; 
    } 

    public void setVariantArray(ArrayList<String> variantArray) { 
    this.variantArray = variantArray; 
    } 

    public void addToVariantArray(String variantArray){ 
    this.variantArray.add(variantArray); 
    } 
} 

这里是CustomListAdapter.java文件

public class CustomListAdapter extends BaseAdapter { 

    private ArrayList<CurrentOrderClass> listData; 

    private LayoutInflater layoutInflater; 

    public CustomListAdapter(Context context, ArrayList<CurrentOrderClass> listData) { 
    this.listData = listData; 
    layoutInflater = LayoutInflater.from(context); 
    } 

    @Override 
    public int getCount() { 
    return listData.size(); 
    } 

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

    @Override 
    public long getItemId(int position) { 
    return position; 
    } 

    public View getView(int position, View convertView, ViewGroup parent) { 
    ViewHolder holder; 
    if (convertView == null) { 
     convertView = layoutInflater.inflate(R.layout.list_row_layout, null); 
     holder = new ViewHolder(); 
     holder.variantView = (TextView) convertView.findViewById(R.id.variant); 
     holder.unitView = (TextView) convertView.findViewById(R.id.unit); 
     holder.quantityView = (TextView) convertView.findViewById(R.id.quantity); 
     convertView.setTag(holder); 
    } else { 
     holder = (ViewHolder) convertView.getTag(); 
    } 

    holder.variantView.setText(listData.get(position).getVariantArray().get(position).toString()); 
    holder.unitView.setText(listData.get(position).getUnitArray().get(position).toString()); 
    holder.quantityView.setText(String.valueOf(listData.get(position).getQuantityRow())); 

    return convertView; 
} 

    static class ViewHolder { 
    TextView variantView; 
    TextView unitView; 
    TextView quantityView; 
    } 

public void setListData(ArrayList<CurrentOrderClass> data){ 
    listData = data; 
} 

} 

这是我OrderForm.java活动的一部分,这说明的onCreate和填充ListView控件的方法。

public class OrderForm extends Activity { 

    public TextView tv; 
    private int variantPosition; 
    CustomListAdapter customListAdapter; 
    CurrentOrderClass currentOrder = new CurrentOrderClass(); 

    @Override 
     public void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      setContentView(R.layout.activity_order_form); 
      tv = (TextView)findViewById(R.id.textViewProduct); 

      //set variants here 
      popolateItem(); 

      //set current order listview here 
      ArrayList image_details = getListData(); 
      final ListView lv1 = (ListView) findViewById(R.id.listViewProductOrder); 

      customListAdapter = new CustomListAdapter(this, image_details); 
      lv1.setAdapter(customListAdapter); 

    } 

    private ArrayList getListData() { 

     ArrayList results = new ArrayList(); 

     if(currentOrder.getQuantityArray().size() > 10){ 
     loopUntil = currentOrder.getQuantityArray().size(); 

     for(int i = 0; i < loopUntil; i++){ 
      currentOrder.getQuantityArray(); 
      currentOrder.getUnitArray(); 
      currentOrder.getVariantArray(); 
      results.add(currentOrder); 
     } 

    } 
    else{ 
     loopUntil = 10; 

     for(int i = 0; i < loopUntil; i++){ 
      currentOrder.getQuantityArray().add(i); 
      currentOrder.getUnitArray().add("Sample text here." + i); 
      currentOrder.getVariantArray().add("Another sample text here" + i); 
      results.add(currentOrder); 
     } 
    } 
    return results;  
    } 
} 

当我执行一个Log.d语句来显示我的ArrayList的内容,它表明我quantityArray具有元素[0,1,2,3,4,5,6,7,9]。

我知道我可以将quantityArray从ArayList转换为ArrayList,但我不想这样做。

我认为我的CustomListAdapter有问题。

有什么想法?

回答

0

我知道了。

我改变

holder.quantityView.setText(String.valueOf(listData.get(position).getQuantityRow()));

holder.quantityView.setText(String.valueOf(listData.get(position).getQuantityArray().get(position)));

0

没有你实际设置视图的地方,因为它没有做任何事情,如果convertView为null,你不能调用它的任何方法,convertView如果它不为null,将是在你的上下文中,你需要做的是有一个扩展某种类型视图的对象,实例化它,给它设置值的方法,类似的东西。

例如这里是我在显示简单的信息适配器使用:

public class MessageView extends RelativeLayout { 

    private TextView mBody; 

    private String mBodyString = ""; 

    private boolean mDrawn = false; 

    private boolean mLocal = false; 

    public MessageView(Context context) { 
     super(context); 
     this.drawView(); 
    } 

    public MessageView(Context context, String body) { 
     super(context); 
     mBodyString = body; 
     this.drawView(); 
    } 

    public MessageView(Context context, String body, boolean local) { 
     super(context); 
     mBodyString = body; 
     mLocal = local; 
     this.drawView(); 
    } 

    private void drawView() { 
     if (mDrawn) 
      return; 
     mDrawn = true; 

     this.removeAllViews(); 
     LayoutInflater li = (LayoutInflater) this.getContext() 
       .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

     RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(
       LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT); 
     params.addRule(RelativeLayout.ALIGN_PARENT_TOP); 

     if(mLocal){ 
      this.addView(li.inflate(R.layout.list_item_message_device, this, false), 
        params); 
     }else{ 
      this.addView(li.inflate(R.layout.list_item_message_remote, this, false), 
        params); 
     } 

     mBody = (TextView) this.findViewById(R.id.tMessage); 
     mBody.setText(mBodyString); 
    } 

    public void setLocal(){ 
     this.setLocal(true); 
    } 

    public void setLocal(boolean local){ 
     mLocal = local; 
     mDrawn = false; 
     this.drawView(); 
    } 

    public void setMessage(String body){ 
     mBodyString = body; 
     mBody.setText(mBodyString); 
    } 
} 
+0

这是奇怪,因为我可以看到并设置两个的ArrayList 在ListView。 – Razgriz

+0

我认为我读的是错误的,但是在if/else中else语句会抛出一个NullPointerException(如果它曾经运行过)。 – FabianCook

+0

它不,它工作得很好。 – Razgriz

相关问题