ListViewをリフレッシュする際に問題があります。私はListView
Activity
と呼んでいますが、カーソルを使ってSQL文でDBからデータを取得し、をカスタムアダプター(BaseAdapter
)で描画しても問題ありません。DBからの新しいデータでカーソルを含むリストビューを更新する
の項目を検索するには、EditText
を先頭に置いて、実際のビュー、同じアクティビティを入力したテキストでフィルタします。 I getText()
をEditText
から削除し、このテキストを使用して結果をフィルタリングする新しいSQL文章を作成します。カーソルが正しいフィルタ結果を持っていることを確認しましたが、adapter.notifyDataSetChanged()
を使用してListView
を更新しようとしましたが、何も起こりません(エラーまたは強制終了なし)。
データベースを操作するこの単純な検索機能を手に入れるためのヒントを教えてもらえますか?私はArrayLists + getFilter() + SimpleCursorAdapter
と同様の多くの質問を見つけましたが、私のDBとカスタムアダプタでは動作しません。
活動 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;
}
}
)私は、このリンクがhwlpなると思いますあなた... ありがとう... –
user4232
CursorAdapterクラスを拡張し、このコンストラクタを使用してみてください。http://developer.android.com/reference/android/support/v4/widget/CursorAdapter.html#CursorAdapter%28android.content.Context 、%20android.database。Cursor、%20boolean%29 –
私はCursorAdapterに変更しようとしましたが、ListViewは正常に動作しますが、まだリフレッシュされません。私は再クエリ()カーソルを試して、何も起こらない、adapter.changeCursor(newCursor)例外をスローする "close SQLiteClosableの参照を取得しようとする"しかし、私はすべてのSQL objetを閉じない...私はどのように難しい単純にListViewを更新する:(ありがとう – Pelanes