我一直有这个问题已经有一段时间了,还没有得到答案。我有这个自定义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;
}
答案 0 :(得分:0)
如果您更改了要显示的数据,则需要在数据库上运行一个新查询并获得反映该更改数据的Cursor
后退。根据更改的性质,这可能需要新的CursorAdapter
或仅需要调用changeCursor()
。如果新查询返回相同的列并且您希望它们以相同的方式显示,则changeCursor()
可能就足够了。否则,您需要创建一个新的CursorAdapter
并在setAdapter()
上致电ListView
切换到它。
如果您真的要更改行布局,则只需要不同的行布局。您无需仅为grins更改ID。由于您没有在上面显示的代码中执行此操作,因此我不清楚您特别担心的是什么。