listview的自定义适配器无法正常工作

时间:2015-08-06 14:55:50

标签: android json android-layout listview

我在列表中创建了一个适配器,但是我从我的网络服务查询中获得了一个数组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事件适配器中看到了几个自定义代码,但我认为我的错误在于我的元素,无法找到解决方法。

2 个答案:

答案 0 :(得分:1)

@Override方法的{p> getView正在搞乱。

答案 1 :(得分:0)

请覆盖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

的Thx

顺便说一下,你可以用更少的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)