簡體   English   中英

ListView的自定義適配器不起作用

[英]Custom adapter for listview not working

我在為我的列表創建適配器時遇到麻煩,該列表填充了從Web服務查詢中獲取的數組json。

編輯

public class CustomListViewAdapter extends ArrayAdapter<RowItem> {

Context context;
private ArrayList<RowItem> originalList;
private ArrayList<RowItem> items;
private CountryFilter filter;

public CustomListViewAdapter(Context context, int resourceId,
        List<RowItem> items) {
    super(context, resourceId, items);
    this.context = context;
    this.items = new ArrayList<RowItem>();
    this.items.addAll(items);
    this.originalList = new ArrayList<RowItem>();
    this.originalList.addAll(items);
}

/*private view holder class*/
private class ViewHolder {
    ImageView imageView;
    TextView txtNombre;
    TextView txtTicket;
    TextView txtAsiento;
    TextView txtNumero;
    TableLayout tblLayout;
    TableRow row;

}

@Override
public Filter getFilter() {
 if (filter == null){
  filter  = new CountryFilter();
 }
 return filter;
}

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

@Override
public RowItem getItem(int position) {
    return items.get(position);
}

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

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    ViewHolder holder = null;
    RowItem rowItem = getItem(position);

    LayoutInflater mInflater = (LayoutInflater) context
            .getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
    if (convertView == null) {
        convertView = mInflater.inflate(R.layout.lista, null);
        holder = new ViewHolder();
        holder.row = (TableRow)convertView.findViewById(R.id.tableRow2);
        holder.txtNombre = (TextView)holder.row.getChildAt(0);
        holder.txtTicket = (TextView)holder.row.getChildAt(1);
    } else
        holder = (ViewHolder) convertView.getTag();

    holder.txtNombre.setText(rowItem.getNombre());
    //holder.imageView.setImageResource(rowItem.getImageId());
    holder.txtTicket.setText(rowItem.getTicket());

    return convertView;
}

private class CountryFilter extends Filter
{

 @Override
 protected FilterResults performFiltering(CharSequence constraint) {

  constraint = constraint.toString().toLowerCase();
  FilterResults result = new FilterResults();
  if(constraint != null && constraint.toString().length() > 0)
  {
  ArrayList<RowItem> filteredItems = new ArrayList<RowItem>();

  for(int i = 0, l = originalList.size(); i < l; i++)
  {
   RowItem asistente = originalList.get(i);
   if(asistente.toString().replace('á', 'a').toLowerCase().contains(constraint) || asistente.toString().replace('é', 'e').toLowerCase().contains(constraint) || asistente.toString().replace('í', 'i').toLowerCase().contains(constraint) || asistente.toString().replace('ó', 'o').toLowerCase().contains(constraint) || asistente.toString().replace('ú', 'u').toLowerCase().contains(constraint))
        filteredItems.add(asistente);
  }
  result.count = filteredItems.size();
  result.values = filteredItems;
  }
  else
  {
   synchronized(this)
   {
    result.values = originalList;
    result.count = originalList.size();
   }
  }
  return result;
 }

 @SuppressWarnings("unchecked")
 @Override
 protected void publishResults(CharSequence constraint, FilterResults results) {
     items = (ArrayList<RowItem>)results.values;
      notifyDataSetChanged();
      clear();
      for(int i = 0, l = items.size(); i < l; i++){
          System.out.println("RESULTADO:"+items.get(i));
          add(items.get(i));
          notifyDataSetInvalidated();
      }
    }
   }
 }

我的問題是在getView函數中。 收費后,我給了我錯誤:

08-06 11:48:42.505: E/AndroidRuntime(10018): FATAL EXCEPTION: main
08-06 11:48:42.505: E/AndroidRuntime(10018): java.lang.NoSuchFieldError: com.google.zxing.client.android.R$id.tabla_cuerpo
08-06 11:48:42.505: E/AndroidRuntime(10018):    at com.google.zxing.client.android.CustomListViewAdapter.getView(CustomListViewAdapter.java:70)

我的布局:

<?xml version="1.0" encoding="utf-8"?>
<TableLayout android:id="@+id/tabla_cuerpo" xmlns:android="http://schemas.android.com/apk/res/android" android:layout_height="wrap_content" android:layout_width="match_parent">
    <TableRow android:id="@+id/tableRow1" android:layout_width="match_parent" android:layout_height="wrap_content">
        <TextView android:gravity="center_horizontal"  android:id="@+id/textView0" android:layout_width="wrap_content" android:layout_height="wrap_content"  android:text="Validaciones"/>
    </TableRow>
    <TableRow android:id="@+id/tableRow2" android:layout_width="match_parent" android:layout_height="wrap_content">
        <TextView  android:layout_margin="1dip" android:id="@+id/txtNombre" android:layout_weight="0.3" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textAppearance="?android:attr/textAppearanceMedium" android:text="Celda1"/>
        <TextView  android:layout_margin="1dip" android:id="@+id/txtTicket" android:layout_weight="0.3" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textAppearance="?android:attr/textAppearanceMedium" android:text="Celda2"/>
        <TextView  android:layout_margin="1dip" android:id="@+id/txtAsiento" android:layout_weight="0.3" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textAppearance="?android:attr/textAppearanceMedium" android:text="Celda3"/>
    </TableRow>
</TableLayout>

當我加載視圖並且無法上傳數據時,就會出現問題。 奇怪的是,我在另一個項目中使用與JSON相同格式的相同代碼,並且可以正常工作。 我已經在getView事件適配器中看到了幾個自定義代碼,這些代碼確實屬於我,但是我認為我的錯誤出在我的元素上,無法找到解決方法。

@OverridegetView方法是搞亂。

請同時覆蓋getCount和getItemId。

用代碼更新答案:

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

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

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

並且請不要使用getChildAt(VIEW ID),而必須使用findViewByID

      holder.txtNombre = (TextView)holder.row.getChildAt(R.id.txtNombre);
      holder.txtTicket = (TextView)holder.row.getChildAt(R.id.txtTicket);

謝謝@PPartisan的提示

順便說一句,您可以使用更少的ID進行相同的操作:

<?xml version="1.0" encoding="utf-8"?>

    <TextView android:gravity="center_horizontal"  android:id="@+id/textView0" android:layout_width="wrap_content" android:layout_height="wrap_content"  android:text="Validaciones"/>

</TableRow>
<TableRow  android:layout_width="match_parent" android:layout_height="wrap_content">
    <TextView  android:layout_margin="1dip" android:id="@+id/txtNombre" android:layout_weight="0.3" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textAppearance="?android:attr/textAppearanceMedium" android:text="Celda1"/>

    <TextView  android:layout_margin="1dip" android:id="@+id/txtTicket" android:layout_weight="0.3" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textAppearance="?android:attr/textAppearanceMedium" android:text="Celda2"/>

    <TextView  android:layout_margin="1dip" android:id="@+id/txtAsiento" android:layout_weight="0.3" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textAppearance="?android:attr/textAppearanceMedium" android:text="Celda3"/>

</TableRow>

將布局擴大到convertView變量后,就可以訪問所有字段視圖convertview.findViewByID(ID)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM