2

SimpleCursorAdaptermy用に拡張されたカスタム アダプタがListFragment、データベース内の項目を正しく表示しません。TextView にテキストが表示されません。正しいテキストを表示するには、カーソルに対して他に何をする必要がありますか?

オーバーライドする必要があると思ったbindViewが、それは効果がなかった

アダプターの設定:

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);
    }

アダプタ:

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;
    }

}
4

1 に答える 1

6

私はそれを手に入れたと思います。の実装を確認してくださいCursorAdapter.getView()bindView()内でとnewView()がどのように呼び出されるかに注意してくださいgetView()。オーバーライドすることで、決して呼び出さないことgetView()が保証されているようです。すべてを ONLYまたは ONLY に入れますが、両方には入れません。CursorAdapterbindView()getView()newView()bindView()


編集I:

4 つのこと:

  1. sを読んだところ、の代わりにCursorAdapterオーバーライドしたいようです。表示される行ごとに が 2 回呼び出されているように見えますが、これがどういうわけかカーソルの更新を妨げているため、常に最初の行を指しています。これが、最初の行のみが表示される理由だと思います。さらに、 ListView のデフォルトの実装ではビューがリサイクルされるため、オーバーライドは実際には必要ありません (詳細については、この回答を確認してください)。bindView()getView()getView()ListViewCursorAdaptergetView()

  2. を作成するときは、コンストラクターmAdapterに null を渡す必要があります。CursorCursorに配信されonLoadFinished(Loaderがクエリを終了したとき)、 でアダプタにバインドされ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コンテンツオブザーバーを登録するので、特別なものを渡す必要はありません)。


編集II:

明確にするために、bindView()メソッドは、行のウィジェットにCursorの現在の位置からのデータを入力する場所です。Cursor適切な列に事前に配置されたものを手渡されます。からデータを引き出しCursorて、目的のウィジェットに注ぐ必要があります。つまり、行の ID を照会する必要があります ( で「位置」引数を使用する代わりにgetView())。次のように設定してみてくださいonClickListenerbindView()

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. */
    }
});
于 2012-01-17T22:46:08.667 に答える