0

我有一个带有三个 textView 的自定义 listView。数据来自具有三个 ArrayList 的类,其中两个是字符串,最后一个是整数。当我在 logCat via 上显示 ArrayList 值时,我在向列表中填充和添加项目时没有问题log.d,所有三个 ArrayList 都有各自的项目。

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

以下是文件: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语句来显示我的 ArrayLists 的内容时,它显示我的 quantityArray 有元素 [0, 1, 2, 3, 4, 5, 6, 7, 9]。

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

我认为我的 CustomListAdapter 有问题。

有什么想法吗?

4

2 回答 2

0

我知道了。

我变了

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

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

于 2013-07-31T03:26:35.390 回答
0

没有您实际设置视图的位置,例如,它不做任何事情,如果 convertView 为 null,则不能调用它的任何方法, convertView,如果它不为 null,将ViewHolder在您的上下文中,您需要做的是拥有一个扩展某种类型的视图的对象,实例化它,给它设置值的方法,诸如此类。

例如,这是我在显示简单消息的适配器中使用的:

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);
    }
}
于 2013-07-31T02:51:14.893 回答