【发布时间】:2012-04-02 10:00:20
【问题描述】:
我在刷新 ListView 时遇到问题。我调用我的ListViewActivity,我使用带有游标的 SQL 语句从 DB 中获取数据,我使用自定义适配器(扩展 BaseAdapter)绘制 ListView,一切正常。
我想在顶部放置一个EditText 以在我的ListView 上搜索项目,过滤实际视图,相同的活动,输入文本。我 getText() 来自 EditText,并使用此文本创建一个新的 SQL 语句过滤结果。我检查了游标是否有正确的过滤结果,但我使用adapter.notifyDataSetChanged() 尝试更新ListView 但没有任何反应(没有错误或强制关闭)。
谁能帮助我或告诉我一些技巧来获得这个与数据库一起使用的简单搜索功能?我发现很多与ArrayLists + getFilter() + SimpleCursorAdapter 类似的问题,但它不适用于我的数据库和自定义适配器。
活动 ListaCaracteres:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(es.hsk.ap.R.layout.lista_caracteres);
try{
hanyuDBHelper = new HanyuSQLHelper(this);
hanyuDB = hanyuDBHelper.getReadableDatabase();
c = hanyuDB.rawQuery(" SELECT * FROM Caracteres ", null);
}
catch(SQLiteException ex)
{
Toast mensajeError=Toast.makeText(getApplicationContext(), "Error accediendo a los datos", Toast.LENGTH_SHORT);
mensajeError.show();
Log.e("LogLugares", "Error en getReadableDatabase()", ex);
}
adapter = new AdapterListaCaracteres(this,c);
listaCaracteres = (ListView)findViewById(es.hsk.ap.R.id.listaCaracteres);
listaCaracteres.setAdapter(adapter);
buscador = (EditText)findViewById(R.id.buscador);
buscador.addTextChangedListener(new TextWatcher()
{
@Override
public void onTextChanged( CharSequence arg0, int arg1, int arg2, int arg3)
{
}
@Override
public void beforeTextChanged( CharSequence arg0, int arg1, int arg2, int arg3)
{
// TODO Auto-generated method stub
}
@Override
public void afterTextChanged(Editable arg0)
{
// TODO Auto-generated method stub
String texto="";
texto=buscador.getText().toString();
c = hanyuDB.rawQuery(" SELECT * FROM Caracteres WHERE significado LIKE '%"+texto+"%'", null);
adapter.notifyDataSetChanged();
}
});
}
我的自定义适配器,AdapterListaCaracteres 扩展自 BaseAdapter:
public class AdapterListaCaracteres extends BaseAdapter implements ListAdapter{
private Context mContext;
private Cursor datos;
private LayoutInflater inflater;
public AdapterListaCaracteres(Context context, Cursor c){
this.mContext = context;
this.datos = c;
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return datos.getCount();
}
@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return datos.getString(position);
}
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return 0;
}
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
View item = convertView;
ViewHolder holder;
inflater = (LayoutInflater) mContext.getSystemService(Context .LAYOUT_INFLATER_SERVICE);
datos.moveToPosition(position);
if(item==null){
try{
item = inflater.inflate(es.hsk.ap.R.layout.caracter, null);
}
catch(InflateException ex)
{
}
holder = new ViewHolder();
holder.caracter = (TextView)item.findViewById(es.hsk.ap.R.id.caracter);
holder.pinyin = (TextView)item.findViewById(es.hsk.ap.R.id.pinyin);
holder.significado = (TextView)item.findViewById(es.hsk.ap.R.id.significado);
item.setTag(holder);
}
else{
holder = (ViewHolder)item.getTag();
}
holder.caracter.setText(datos.getString(2));
holder.pinyin.setText(datos.getString(3));
holder.significado.setText(datos.getString(4));
return item;
}
static class ViewHolder{
TextView caracter;
TextView pinyin;
TextView significado;
}
}
【问题讨论】:
-
我认为这个链接会帮助你... stackoverflow.com/questions/6837397/…> 谢谢...
-
尝试扩展 CursorAdapter 类并使用此构造函数developer.android.com/reference/android/support/v4/widget/…
-
我尝试更改为 CursorAdapter,ListView 工作正常,但仍然没有刷新。我已经尝试过 requery() 游标,没有任何反应,adapter.changeCursor(newCursor) 抛出异常“尝试在关闭 SQLiteClosable 上获取引用”,但我没有关闭任何 SQL 对象......我很惊讶有多难更新一个简单的 ListView :( 谢谢
-
也尝试了 AsyncTask,但我没有看到将 adapter.notifyDataSetChanged() 调用到活动中发生任何事情,同样如此。我还在 Android 2.1、2.2 和 4.0 上运行了该程序,可能存在错误(对此有很多问题,但没有明确的答案)。
标签: android database listview refresh adapter