2012-04-02 6 views
0

ListViewをリフレッシュする際に問題があります。私はListViewActivityと呼んでいますが、カーソルを使って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; 
} 
} 
+0

)私は、このリンクがhwlpなると思いますあなた... ありがとう... – user4232

+0

CursorAdapterクラスを拡張し、このコンストラクタを使用してみてください。http://developer.android.com/reference/android/support/v4/widget/CursorAdapter.html#CursorAdapter%28android.content.Context 、%20android.database。Cursor、%20boolean%29 –

+0

私はCursorAdapterに変更しようとしましたが、ListViewは正常に動作しますが、まだリフレッシュされません。私は再クエリ()カーソルを試して、何も起こらない、adapter.changeCursor(newCursor)例外をスローする "close SQLiteClosableの参照を取得しようとする"しかし、私はすべてのSQL objetを閉じない...私はどのように難しい単純にListViewを更新する:(ありがとう – Pelanes

答えて

1

はこのお試しください:

/* 
* Listener que actuará cuando se escriba en el EditText 
*/ 
buscador.setOnKeyListener(new OnKeyListener() { 

    @Override 
    public boolean onKey(View v, int keyCode, KeyEvent event) { 
     // TODO Auto-generated method stub 
     String texto = ""; 
     texto = buscador.getText().toString(); 
     c = hanyuDB.rawQuery(" SELECT * FROM Caracteres WHERE significado LIKE '%"                       + texto + "%'", null); 

     AdapterListaCaracteres adapter2 = new AdapterListaCaracteres(getApplicationContext(), c, false); 
     listaCaracteres.setAdapter(adapter2); 
     return false; 
    } 

}); 
/*********************************************/ 

幸運を、

ALEX

0

再初期化するアダプタの代わりnotifydatasetchanged():

adapter = new AdapterListaCaracteres(this,c); 
    listaCaracteres.setAdapter(adapter); 
+0

ありがとうございますが、もし私がそうしたら、LogCatのForce Closeを取得します: 04-02 10:19:53.984 :E/AndroidRuntime(565):キャッチされていないハンドラ:キャッチされていない例外のためにメインスレッドが終了する 04-02 10:19:54.004:E/AndroidRuntime(565):java.lang.NullPointerException 04-02 10/19:54.004:E/AndroidRuntime(565):\t es.hsk.ap.caracteres.AdapterListaCaracteres.getView(AdapterListaCaracteres.java:56) 04-02 10:19:54.004:E/AndroidRuntime(565): \t android.widget.AbsListView.obtainView(AbsListView.java:1274) 04-02 10:19:54.004:E/AndroidRuntime(565):\t android.widget.ListView.measureHeightOfChildren(ListView.java:1147) – Pelanes

+0

アダプタのヌルを1回設定してから再初期化します。 –

+0

アダプタをnullにしようとしましたが、setAdapterを実行しようとしているときに同じNullPointerExceptionがスローされます。私もListView.setAdapter(null)を配置しようとし、setAdapter(アダプタ)、しかし同じ:( – Pelanes

0

これで動作します!代わりの

buscador.setOnKeyListener(new OnKeyListener() { 

     @Override 
     public boolean onKey(View v, int keyCode, KeyEvent event) { 

buscador.addTextChangedListener(new TextWatcher() 
{ 

おかげであなたの助けのためのすべての人々私の友人が(!おかげでムニは)のEditTextでdinamicallyリストビューの結果をフィルタリングするためのより良い方法を発見しました。

EDIT:@AlexMuniと私自身の答えを更新

は、onKey()方法は、エミュレータ上で完璧に動作しますが、実際のデバイスでは正常に動作しません。

私は最終的に、従来の方法と完全にそれを行っている:

buscador = (EditText)findViewById(R.id.buscador); 
    buscador.addTextChangedListener(new TextWatcher() 
    { 
     @Override 
     public void onTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) 
     { 
      texto = buscador.getText().toString(); 
      c = hanyuDB.rawQuery(
        " SELECT * FROM Caracteres WHERE significado LIKE '%" 
          + texto + "%'", null); 
      AdapterListaCaracteres adapter2 = new AdapterListaCaracteres(ListaCaracteres.this, c, false); 
      listaCaracteres.setAdapter(adapter2); 
     } 

     @Override 
     public void beforeTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) 
     { 
     } 

     @Override 
     public void afterTextChanged(Editable arg0) 
     { 
     } 
    });  
関連する問題