不了解自定义游标适配器

时间:2012-02-21 04:21:33

标签: android cursor

对于我的应用程序,我使用了一对listview。到目前为止一直使用simplecursoradapter并且工作得很好,除了我的列表视图在行中有TextView和EditText。我遇到了其他人遇到的问题,例如从edittext中提取数据以用于其他活动,以及滚动文本由于回收而跳转到不同的字段。经过研究似乎是最好的方法,这是建立一个自定义游标适配器,但我无法解决如何做到这一点。

public void fillData() {
    Cursor e = mydbhelper.getUserWord();
        startManagingCursor(e);
        String[] from = new String[] {dbadapter.KEY_USERWORD,};
        int[] to = new int[] {R.id.textType,};
       editadapter = new SimpleCursorAdapter(this, R.layout.edit_row, e, from, to);
       ListView list = getListView();
       View footer = getLayoutInflater().inflate(R.layout.footer_layout, list, false);
       list.addFooterView(footer);
       setListAdapter(editadapter);

这是我用于相关活动的内容,但我无法理解这将如何填充到自定义游标适配器中。

还不确定这个自定义适配器是否应该与我的其余代码(例如我的菜单项,edittext验证器,onclick事件等)在一个单独的类中,并在类的开头调用自定义用于其他所有内容。

修改 能够从http://www.vogella.de/articles/AndroidListView/article.html#overview

中找出我需要的东西

不确定我之前是怎么没有碰到它的,但它帮助我建立了一个基础来解决它。 TY提供所有帮助。我觉得我对自定义游标适配器的工作方式有了更好的了解。

3 个答案:

答案 0 :(得分:0)

创建和使用自定义游标适配器非常简单,只需将CursorAdapter类扩展到一个类中,但是在活动中你已经扩展了一个类,你不能在活动类中扩展CursorAdapter,所以你需要创建一个新类,但是你可以在Activity类中创建一个私有类,因此它可以使用Activity类的字段too.say CustomCursorAdapter。 CursorAdapter类有各种方法init,您可以扩展它以实现您的目的。比如,根据您的要求更改适配器的视图,覆盖newView()和bindView(),newView创建一个新视图(从xml中膨胀,或者通过创建新对象),而bindView()是绑定一些现有视图的值。看一个例子:

public class ExampleCursorAdapter extends CursorAdapter {
    public ExampleCursorAdapter(Context context, Cursor c) {
        super(context, c);
    }

    @Override
    public void bindView(View view, Context context, Cursor cursor) {
        TextView summary = (TextView)view.findViewById(R.id.summary);
        summary.setText(cursor.getString(
                cursor.getColumnIndex(ExampleDB.KEY_EXAMPLE_SUMMARY)));
    }

    @Override
    public View newView(Context context, Cursor cursor, ViewGroup parent) {
        LayoutInflater inflater = LayoutInflater.from(context);
        View v = inflater.inflate(R.layout.item, parent, false);
        bindView(v, context, cursor);
        return v;
    }
}

答案 1 :(得分:0)

对于

Also not sure if this custom adapter should be in a separate class from the rest of my       code (like my menu items, edittext validator, onclick events etc.) and call the custom at the start of the class for everything else.

是的,它应该在一个单独的类中。

在您的活动中,

ListView lv = (ListView)findViewById(R.id.list);

Cursor c = getFromDb();
CustomCursorAdapter adapter = new CustomCursorAdapter(getApplicationContext() , c);
lv.setAdapter(adapter);

现在创建CustomCursorAdapter

public class CustomCursorAdapter extends CursorAdapter {

public CustomCursorAdapter(Context context , Cursor c) {
    super(context,c);

    // TODO Auto-generated constructor stub
}

@Override
public void bindView(View view, Context context, Cursor cursor) {
    // TODO Auto-generated method stub

}

@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {
    // TODO Auto-generated method stub

             //Inflate your layout with textview and edittext
             //setText with values from cursor
             //return the view

    return null;
}

}

答案 2 :(得分:-2)

尝试自定义适配器而不是自定义游标适配器      ...

  public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.addnew);

    ItemsAdapter itemsAdapter = 
        new ItemsAdapter(AddNew.this, R.layout.addnew_typelist_row, types);

    listtype.setAdapter(itemsAdapter);
}

public class ItemsAdapter extends BaseAdapter {
    ArrayList<String> items = new ArrayList<String>();
    String type;
    int color;
    ViewHolder holder;
    Context context;
    int resID;

    public ItemsAdapter(Context context, int resID, ArrayList<String> items) {
        this.items = items;
        this.context = context;
        this.resID=resID;
    }

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

        View v = convertView; 
        TextView name = null ;

        if(convertView == null) {
            LayoutInflater inflater = LayoutInflater.from(context);
            v = inflater.inflate(resID, null);

            holder=new ViewHolder();
            holder.lt = (RelativeLayout)v.findViewById(R.id.ltlistrow);
            holder.name = (TextView)v.findViewById(R.id.desc);

            v.setTag(holder);

        } else {
            holder = (ViewHolder)v.getTag();
            v = convertView;
        }

        String nam = items.get(position);
        if (nam != null) {
            holder.name.setText(items.get(position));
        }

        return v;
    }

    public static class ViewHolder{
        TextView name;
        RelativeLayout lt ;
    }
}

自定义适配器可以是新类,也可以是内部类。使用编辑文本扩展布局并将其设置为getView中的列表项。希望它有所帮助