2010-10-12 3 views
0

У меня была эта проблема в течение некоторого времени, и у меня пока нет ответа. У меня есть этот пользовательский адаптер курсора, который я использую для заполнения списка из базы данных sqlite. Теперь моя проблема в том, что я хочу заполнить список на основе определенных условий. Например, если условие имеет важное значение, listview должен отображать только данные, которые соответствуют этим критериям и т. Д. У меня уже есть методы работы, которые соответствующим образом обрабатывают базу данных.Странное поведение с пользовательским адаптером курсора android

теперь моя проблема заключается в том, что я не могу показаться, чтобы заполнить ListViews на основе этих методов и условий без:

1) создает копию точно такой же адаптер пользовательского курсора, а просто изменить переменные имена. 2) создание копии точного формата xml и изменение идентификатора.

Как я уже сказал, он работает таким образом, но я чувствую, что у меня есть ненужные классы и макет 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; 
    } 

ответ

0
  1. Если изменить данные, которые вы хотите отобразить, вам нужно будет запустить свежий запрос на базу данных и получить Cursor назад, что отражает изменение данных. В зависимости от характера изменений это может потребовать свежий CursorAdapter или просто вызов changeCursor(). Если новый запрос возвращает те же столбцы, и вы хотите, чтобы они отображались одинаково, возможно, достаточно changeCursor(). В противном случае вам нужно будет создать новый CursorAdapter и позвонить setAdapter() на свой ListView, чтобы переключиться на него.

  2. Вам нужна только макет строки, если вы действительно меняете раскладку строк. Вам не нужно менять идентификаторы только для усмешек. Поскольку вы не делаете этого в коде, который вы показали выше, я не понимаю, о чем конкретно вас беспокоит.

+0

спасибо за ответ, я просто показал вам код для моего адаптера адаптера, поэтому у вас будет представление о том, как оно было выложено. Я не изменяю макет строки, я использую точно то же самое. как вы сказали, я дам ваше предложение попробовать и дам вам знать, как это работает. – irobotxxx

+0

Извините, где я могу вызвать метод changeCursor(). для этого, похоже, не существует метода. Я редактировал свой код, чтобы показать вам методы в базе данных. как вы можете видеть, они называют одно и то же. – irobotxxx

+0

@manuelJ: 'changeCursor()' - это метод в 'CursorAdapter'. – CommonsWare

Смежные вопросы