2

私のListFragmentのためにSimpleCursorAdapterを拡張するカスタムアダプタは、データベース内の項目を正しく表示しません。それはTextViewのテキストを表示しません、私はそれが正しいテキストを表示するためにカーソルに何をする必要がありますか?カーソルがカスタムアダプタでテキストを正しくバインドしていない

私はbindViewを上書きしなければならなかったと思ったが、それは何の効果

アダプタを設定しなかった:私は、私はそれを得たと思う

public class CheckAdapter extends SimpleCursorAdapter{ 

    Context context; 
    Cursor c; 

    public CheckAdapter(Context context, int layout, Cursor c,String[] from, int[] to) { 
     super(context, layout, c, from, to); 
     this.context = context; 
     this.c = c; 
     // TODO Auto-generated constructor stub 
    } 

    @Override 
    public void bindView(View view,Context context,Cursor cursor){ 
     String st = cursor.getString(cursor.getColumnIndex(BowlersDB.NAME)); 

     TextView tv = (TextView)view.findViewById(R.id.nameCheckTV); 
     tv.setText(st); 
    } 

    @Override 
    public View getView(final int position,View convertView,ViewGroup parent){ 
     if(convertView == null){ 
      LayoutInflater inflator = getLayoutInflater(); 
      convertView = inflator.inflate(R.layout.check_listview,null); 
     } 

     CheckBox cb = (CheckBox)convertView.findViewById(R.id.checkBox1); 
      cb.setOnClickListener(new OnClickListener(){ 

       @Override 
       public void onClick(View v) { 
        CheckBox check = (CheckBox)v.findViewById(R.id.checkBox1); 
        int pos = position; 
        if(check.isChecked()){ 
         mCheckedItems.add(position); 
        }else if(!check.isChecked()){ 
         for(int i=0;i< mCheckedItems.size();i++){ 
          if(mCheckedItems.get(i) == position){ 
           mCheckedItems.remove(i); 
          } 
         } 
        } 
       } 

      }); 
     return convertView; 
    } 

} 
+0

コンストラクタは非推奨であると貧しい応答性をもたらすことができます。ここで説明する2番目のものを使用してください:http://developer.android.com/reference/android/widget/SimpleCursorAdapter.html –

+0

なぜ私はあなたの 'onCreate()'メソッドで 'Cursor'を直接クエリしているのか不明です。 'LoaderManager.LoaderCallbacks 'を実装している場合は、システムによって(あなたが 'onCreateLoader()'メソッドを正しく実装していると仮定して)これを行う必要があります。 –

+0

bindViewメソッドで、st Stringを記録してみてください。 – Krylez

答えて

6

public void populateList(){ 

     String[] fields = new String[] {BowlersDB.NAME}; 
     Cursor c = getActivity().getContentResolver().query(BowlersDB.CONTENT_URI, 
       new String[] {BowlersDB.ID,BowlersDB.NAME},null,null,BowlersDB.NAME + " COLLATE LOCALIZED ASC"); 

mAdapter = new CheckAdapter(getActivity(),R.layout.check_listview,c,fields,new int[] {R.id.nameCheckTV}); 


     setListAdapter(mAdapter); 

     getLoaderManager().initLoader(0,null,this); 
    } 

は、アダプタを。 CursorAdapter.getView()の実装を確認してください。 getView()の中でbindView()newView()がどのように呼び出されているかに注目してください。 getView()を無効にすると、CursorAdapterは決してbindView()と呼ばれません。すべてをgetView()に入れるか、またはnewView()bindView()にのみ入れるか、両方には入れないでください。


EDIT I:

つの事:

  1. 私はCursorAdapterの上に読んで、あなたがbindView()代わりのgetView()を上書きしたいように見えます。表示される行ごとにgetView()が2回呼び出され、カーソルが更新されないようにして、常に最初の行を指しているようです。私はこれがあなたのListViewが最初の行だけを表示する理由だと思います。さらに、ListViewのデフォルトのCursorAdapter実装はビューをリサイクルするので、getView()をオーバーライドする必要はありません(詳細はanswerを参照してください)。

  2. mAdapterを作成する場合は、nullをCursorにコンストラクタに渡す必要があります。 CursoronLoadFinishedLoaderがクエリを終了したとき)に配信され、swapCursor(cursor)でアダプタにバインドされます。

  3. onCreateLoader()メソッドは、最初のクエリを実行するLoaderを作成(または開始)します。それは次のようになりますことを確認し、

    @Override 
    public Loader<Cursor> onCreateLoader(int id, Bundle args) { 
        String[] projection = { BowlersDB.ID, BowlersDB.NAME }; 
    
        CursorLoader cursorLoader = new CursorLoader(getActivity(), 
          BowlersDB.CONTENT_URI, projection, null, null, null); 
        return cursorLoader; 
    } 
    
  4. は、あなたが正しいSimpleCursorAdapterコンストラクタを使用することを確認してください...あなたが現在使用しているものが推奨されていません! (0を旗として渡してください... CursorLoaderはあなたのためにコンテンツオブザーバーを登録しますので、特別なものを渡す必要はありません)。


EDIT II:

明確にするために、bindView()方法は、あなたがCursorの現在位置からのデータを使用して行のウィジェットを取り込むところです。適切な行にあらかじめ配置されたCursorが渡されます。 Cursorからデータを取り出し、希望のウィジェットに流し込む必要があります。つまり、行のIDを照会する必要があります(getView()の "position"引数を使用する代わりに)。以下のようなものでbindView()onClickListenerを設定してみてください:あなたが現在使用している

final int rowId = cursor.getInt(cursor.getColumnIndex("_id")); 

CheckBox cb = (CheckBox)convertView.findViewById(R.id.checkBox1); 
cb.setOnClickListener(new OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     int position = rowId; 
     /* you now know this row's position. do what you need to do. */ 
    } 
}); 
+0

私はもともとそれを行いましたが、カーソルを使用しようとすると、カーソルが与えられなかったためにNullPointerExceptionが発生します。そのとき、リストビューはカーソルの最初の行のみを表示するので、カーソルを反復処理する必要があるように見えますが、どのように推測されるのでしょうか。それが配列だった場合は、私は単に位置変数を使用するだろうが、カーソルでそれを使用することはできません – tyczj

+0

私のポストを編集しました...あなたがそれを働かせたら私に教えてください! –

+0

私が 'getView()'を使っていたのは、チェックボックスをクリックしたときに 'getView'の' onclicklistener'がその位置を知っているので、 'bindView'を使って再びIDを取得する問題に戻りますチェックされたリスト項目の私はこのサンプルホーヘルプの外に出ていたhttp://www.vogella.de/articles/AndroidListView/article.html#listadvanced_interactive – tyczj

関連する問題