Android:自定义光标适配器问题

Android:自定义光标适配器问题,android,cursor,adapter,Android,Cursor,Adapter,我想知道是否有人能给我指出正确的方向,或者给我一双眼睛看看我的listview自定义游标适配器类哪里出了问题 基本上,我让它“工作”,从这个意义上说,它将用数据库中的名字填充listview,而不会移动到下一行。但是,现在,它将抛出一个错误,并且不会进入列表,因此任何帮助都是非常感谢的 基本上,我难以实现的是从数据库中读取名称和图像路径,并使用自定义适配器将其应用于row.xml。以下是我的代码: public class CustomAdapter extends SimpleCursorAd

我想知道是否有人能给我指出正确的方向,或者给我一双眼睛看看我的listview自定义游标适配器类哪里出了问题

基本上,我让它“工作”,从这个意义上说,它将用数据库中的名字填充listview,而不会移动到下一行。但是,现在,它将抛出一个错误,并且不会进入列表,因此任何帮助都是非常感谢的

基本上,我难以实现的是从数据库中读取名称和图像路径,并使用自定义适配器将其应用于row.xml。以下是我的代码:

public class CustomAdapter extends SimpleCursorAdapter {

private LayoutInflater mInflater;
private Context context;
private int layout;

//private Cursor c;
String animal_name;
String img_path;

public CustomAdapter(Context context,int layout, Cursor c, String[] from, int[] to){
super(context, layout, c, from, to);

//this.c = c;
this.context = context;
this.layout = layout;
}



@Override
public View getView(int position, View convertView, ViewGroup parent){

    View row = convertView;         
    ViewWrapper wrapper = null;

    Cursor c = getCursor();

    animal_name =  c.getString((c.getColumnIndexOrThrow(MyDBManager.KEY_ANIMALNAME)));
    img_path = c.getString((c.getColumnIndexOrThrow(MyDBManager.KEY_IMGPATH)));     

    if(row == null){
        LayoutInflater inflater = LayoutInflater.from(context); 

        row = inflater.inflate(R.layout.row, null);
        // row is passed in as "base" variable in ViewWrapper class.
        wrapper = new ViewWrapper(row);

        row.setTag(row);
    }
    else{ 
        wrapper=(ViewWrapper)row.getTag();
    }

    wrapper.getLabel().setText(animal_name);
    wrapper.getIcon().setImageResource(R.id.icon);

    return (row);
}       
}

}

并已按如下方式设置适配器

CustomAdapter mAdapter = new CustomAdapter(this, R.layout.row, myCursor, new String[]{"animal_name"}, new int[]{R.id.animal});
    this.setListAdapter(mAdapter);

非常感谢您的帮助。

您的问题是您正在执行row.setTag(row)。您应该改为将标签设置为ViewWrapper

在游标适配器中,您应该覆盖bindview和newView,而不是getView

从10000英尺起,其工作方式如下
如果视图为空,GetView调用newView,并在新视图之后调用bindView。

您的问题是您正在执行row.setTag(row)。您应该改为将标签设置为ViewWrapper

在游标适配器中,您应该覆盖bindview和newView,而不是getView

从10000英尺起,其工作方式如下 如果视图为空,GetView调用newView,并在新视图之后调用bindView

所有适配器类都可以遵循重写getView()的ArrayAdapter模式来定义 排成一排。但是,CursorAdapter及其子类有 getView()。 getView()方法检查要回收的提供的视图。如果为null,则getView()调用 newView(),然后是bindView()。如果不为null,则getView()只调用bindView()。 如果您正在扩展CursorAdapter,它用于显示数据库或数据库的结果 内容提供程序查询时,应覆盖newView()和bindView(),而不是 getView()。所有这一切只是删除您在getView()中的if()测试,并将 该测试的每个分支采用独立的方法,类似于以下内容:

所有适配器类都可以遵循重写getView()的ArrayAdapter模式来定义 排成一排。但是,CursorAdapter及其子类有 getView()。 getView()方法检查要回收的提供的视图。如果为null,则getView()调用 newView(),然后是bindView()。如果不为null,则getView()只调用bindView()。 如果您正在扩展CursorAdapter,它用于显示数据库或数据库的结果 内容提供程序查询时,应覆盖newView()和bindView(),而不是 getView()。所有这一切只是删除您在getView()中的if()测试,并将 该测试的每个分支采用独立的方法,类似于以下内容:

CustomAdapter mAdapter = new CustomAdapter(this, R.layout.row, myCursor, new String[]{"animal_name"}, new int[]{R.id.animal});
    this.setListAdapter(mAdapter);
public View newView(Context context, Cursor cursor, 
                ViewGroup parent) { 
  LayoutInflater inflater=context.getLayoutInflater(); 
  View row=inflater.inflate(R.layout.row, null); 
  ViewWrapper wrapper=new ViewWrapper(row);  
  row.setTag(wrapper); 
  return(row); 
} 

public void bindView(View row, Context context, Cursor cursor) { 
  ViewWrapper wrapper=(ViewWrapper)row.getTag(); 
  // actual logic to populate row from Cursor goes here 
}