2012-03-20 14 views
1

私はまだlistViewでcursorAdapterを使用して良いコードを作成しようとしています。onContentChanged()でカスタムCursorAdapterを使用しているAndroid

私は自分のアクティビティでカーソル内のデータを変更すると、自動的にアダプタ内のカーソルを更新し、アダプタともちろんlistViewを更新したいと考えています。

マジックこの機能は次のとおりです。onContentChanged()このアダプタのカーソルが通知されたときに呼び出されるCursorAdapterの関数です。

しかし、私はこの関数を呼び出すことに失敗しています。

コードの摂食部分は、私が間違っている箇所や誤解がある箇所を教えてもらえれば、感謝しています。

活動:

public class EverydayNotesAndroid3Activity extends Activity { 
    /** Called when the activity is first created. */ 

    private Cursor cursorNotes; 
    private NoteDataSource dataNoteConnector; 
    private NotesCursorAdapter notesCursorAdapter; 
    private InputMethodManager imm; 
    private Activity activity; 
    private ListView listView; 
    private int positionItem; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     activity = this; 

     dataNoteConnector = new NoteDataSource(activity); 

     dataNoteConnector.open(); 

     cursorNotes = dataNoteConnector.getAllNotes(); 

     startManagingCursor(cursorNotes); 

     listView = (ListView) findViewById(R.id.main_list); 

     notesCursorAdapter = new NotesCursorAdapter(activity, cursorNotes, 3); 

     listView.setAdapter(notesCursorAdapter); 

     Button b = new Button(activity); 

     b = (Button) findViewById(R.id.done); 

     b.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 

       dataNoteConnector.createNoteTop("Hello stack overflow world"); 


      } 
     }); 

CursorAdapter:

@Override 


public void onContentChanged(){ 
     System.out.println("foux de fafa"); 
     this.notifyDataSetChanged(); 
    } 

私は私の問題は、私は、この関数を呼び出すしたいですが、それが呼び出されないことを思い出してみましょう。

とデータベースのクラスが、データベース上の挿入は大丈夫ですので、それが重要ならば、私は知らない。

public Cursor create 

NoteTop(String note) { 

     idNoteMin++; 
     ContentValues values = new ContentValues(); 
     values.put(DataBaseHelper.DATABASE_ID_NOTE, idNoteMin); 
     values.put(DataBaseHelper.DATABASE_CONTENT_NOTE, note); 
     long insertId = database.insert(DataBaseHelper.DATABASE_TABLE_NOTE, null, 
       values); 
     Cursor cursor = database.query(DataBaseHelper.DATABASE_TABLE_NOTE, 
       allColumns, DataBaseHelper.DATABASE_ID_NOTE + " = " + insertId, null, 
       null, null, null); 
     cursor.moveToFirst(); 
     return cursor; 
    } 

[OK]をので、再び、私の2質問:

1)どのようにすることができます

2)自分のコードが、カスタムのcursorAdapterでlistViewに供給するのに適しているのだろうかと思います。

ご注意いただきありがとうございます。

答えて

2

notifyDataSetChangedでアダプタが通知された後、実際には逆の動作をします。onContentChangedが呼び出されます。

これにあなたのボタンクリックリスナーを変更してみてください:

@Override 
     public void onClick(View v) { 

      dataNoteConnector.createNoteTop("Hello stack overflow world"); 
      notesCursorAdapter.notifyDataSetChanged(); 

     } 
+0

notifyDataSetChangedを呼び出すとうまくいきません。onContentChangedは呼び出されません。 私はそれについて考えようとしているほど、「そんなに簡単なことをするには最高の方法があるに違いない」と思っていますが、それが何であるかは分かりません。私はアンドロイドdevelopperのウェブサイトでさえ、彼らは、リストビューを更新したいときはいつでも、彼らはカーソルを再現し、毎回それをフィードし、新しいアダプタを作成し、カーソルに影響を与え、次にlistViewにアダプタに影響を及ぼす...これは本当に狂気です、私はlistViewとcursorAdapterの適切な使用の例を見たことがないようです –

+0

私は私の答えを編集しました、あなたは何かを試しましたか? –

+0

残念ながら、はい、まだ動作しません。とにかく私のカスタムCursorAdapterに問題がなければならない、それは別の問題であるため、私は自分自身を理解しようとするだろう。助けてくれてありがとう、私はこれをどのようにしたかを教えてくれるだろう(成功すれば)。 –

-1
b.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View v) { 

      dataNoteConnector.createNoteTop("Hello stack overflow world"); 


     } 
} 
+1

これが質問にどのように答えているか説明してください – CocoNess

1

onContentChanged(ようにするには)データをバックアップするたびに解雇変更されている、あなたはのコンストラクタにフラグCursorAdapter.FLAG_REGISTER_CONTENT_OBSERVERを渡す必要がありますCursorAdapter。このように:

mTheAdapter = new CursorAdapter(context, cursor, CursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER); 

これはAPIv11からのみ利用可能です。

私はここでそれを読んで:) http://developer.android.com/reference/android/widget/CursorAdapter.html#FLAG_REGISTER_CONTENT_OBSERVER

はそれが役に立てば幸い!

関連する問題