使用自定义游标适配器android的奇怪行为

时间:2010-10-12 10:53:43

标签: android

我一直有这个问题已经有一段时间了,还没有得到答案。我有这个自定义Cursor适配器,我用它来填充sqlite数据库中的列表视图。现在我的问题是我想根据某些条件填充列表视图。例如,如果条件很重要,列表视图应该只显示符合该条件的数据,依此类推。我已经有了相应查询数据库的工作方法。

现在我的问题是,我似乎无法根据这些方法和条件填充listviews:

1)创建完全相同的自定义游标适配器的副本,只需更改名称变量。 2)创建精确xml布局的副本并更改id。

正如我所说,它以这种方式工作,但我觉得我有不必要的类和xml布局,因为它完全一样。我知道我做错了什么,我只是不知道是什么。请任何帮助和解释将不胜感激。这是CustomCursorAdapter的代码代码的必要部分:

 public class ViewItems extends ListActivity implements OnItemClickListener{

     DBAdapter adapter;
     Cursor cursor;
     ListView list;

     public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.view_list);
      adapter = new DBAdapter(this);
      adapter.open();
      fillData();

      list = (ListView)findViewById(android.R.id.list); // default android listView id
      list.setOnItemClickListener(this);


     }

     // Different method calls
     protected void fillImportantData() {
      Cursor cursor = adapter.retrieveImportant();
      startManagingCursor(cursor);

        String[] from = new String[]{DBAdapter.NAME, DBAdapter.DATE, DBAdapter.TIME, DBAdapter.PRIORITY};
        int[] to = new int[]{R.id.viewNameId, R.id.viewDateId, R.id.viewTimeId};

        customCursorAdapter items = new customCursorAdapter(this, R.layout.view_items, cursor, from, to);
        setListAdapter(items);   
     }



     public class customCursorAdapter extends SimpleCursorAdapter {
      private int layout;
      Context context;

      public customCursorAdapter(Context context, int layout, Cursor cursor, String[]from, int[] to) {
       super(context, layout, cursor, from, to);
       this.layout = layout;
       this.context = context;

      }


      @Override
      public void bindView(View view, Context context, Cursor cursor) {
       ViewHolder holder;

       if(view != null){
        holder = new ViewHolder();
        holder.viewName = (TextView)view.findViewById(R.id.viewNameId);
        holder.viewStartDate = (TextView)view.findViewById(R.id.viewDateId);
        holder.viewStartTime = (TextView)view.findViewById(R.id.viewTimeId);

        view.setTag(holder);
       }else{
        holder = (ViewHolder)view.getTag();
       }

       int namecol = cursor.getColumnIndex(DBAdapter.NAME); 
       String name = cursor.getString(namecol);


       if(holder.viewName != null){
       holder.viewName.setText(name);
       holder.viewName.setTextColor(Color.RED);
       }

       String startDate = cursor.getString(cursor.getColumnIndex(DBAdapter.DATE));
       holder.viewStartDate.setText(startDate);

       String startTime = cursor.getString(cursor.getColumnIndex(DBAdapter.TIME));
       holder.viewStartTime.setText(startTime);
      }


      @Override
      public View newView(Context context, Cursor cursor, ViewGroup parent) {

       LayoutInflater inflater = LayoutInflater.from(context);
       final View view = inflater.inflate(layout, parent, false);

       return view;
      }


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


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

     }

     static class ViewHolder{
      TextView viewName;
      TextView viewStartDate;
      TextView viewStartTime;

     }

    }


// methods in database

public Cursor retrieveAll(){
  String[] resultColumns = new String[] {KEY_ID, NAME DATE, TIME, PRIORITY};
    Cursor cursor = db.query(DATABASE_TABLE, resultColumns, null, , null, null, null);
     return cursor; 
    }

public Cursor retrieveImportant(){
  String[] resultColumns = new String[] {KEY_ID, NAME DATE, TIME, PRIORITY};
  String[] condition = {"important"};
  Cursor cursor = db.query(DATABASE_TABLE, resultColumns, PRIORITY + "=" + "?", condition, null, null, null);
     return cursor; 
    }

1 个答案:

答案 0 :(得分:0)

  1. 如果您更改了要显示的数据,则需要在数据库上运行一个新查询并获得反映该更改数据的Cursor后退。根据更改的性质,这可能需要新的CursorAdapter或仅需要调用changeCursor()。如果新查询返回相同的列并且您希望它们以相同的方式显示,则changeCursor()可能就足够了。否则,您需要创建一个新的CursorAdapter并在setAdapter()上致电ListView切换到它。

  2. 如果您真的要更改行布局,则只需要不同的行布局。您无需仅为grins更改ID。由于您没有在上面显示的代码中执行此操作,因此我不清楚您特别担心的是什么。