[英]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事件適配器中看到了幾個自定義代碼,這些代碼確實屬於我,但是我認為我的錯誤出在我的元素上,無法找到解決方法。
@Override
為getView
方法是搞亂。
請同時覆蓋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.