0

同じ問題について他の多くの回答を検索しましたが、私に合った解決策は見つかりませんでした。タイトルが示すように、問題は、カスタム アダプターの getView メソッドが呼び出されないことです。

コードは次のとおりです(最初のフラグメント):

public class CategoryListFragment extends ListFragment
                            implements NewCategoryDialogListener {

private GestoreAttivitaDbHelper mDbHelper;
private CategoryListAdapter mAdapter;

@Override
public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setHasOptionsMenu(true);        

    mAdapter = new CategoryListAdapter(getActivity());
    setListAdapter(mAdapter);

    CategoryLoader categoryLoader = new CategoryLoader();

    if (mDbHelper == null) {
        mDbHelper = new GestoreAttivitaDbHelper(getActivity().getApplicationContext());
    }

    SQLiteDatabase db = mDbHelper.getReadableDatabase();

    mAdapter.addAll(categoryLoader.getAllCategories(db));
    mAdapter.notifyDataSetChanged();
    mAdapter.getCount();
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    return inflater.inflate(R.layout.category_list, container);
}

アダプタは次のとおりです。

public class CategoryListAdapter extends ArrayAdapter<CategoryElement> {

private LayoutInflater mInflater;

public CategoryListAdapter(Context ctx) {
    super(ctx, R.layout.category_element);

    mInflater = (LayoutInflater) ctx.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {

    View view;

    Log.d("Adapter", "Restituisco la view per l'elemento");

    if (convertView == null) {
        view = mInflater.inflate(R.layout.category_element, null);
    } else {
        view = convertView;
    }

    //((TextView) view.findViewById(R.id.category_element_text)).setText(getItem(position).getName());
    TextView textView = (TextView) view.findViewById(R.id.category_element_text);
    textView.setText(getItem(position).getName());

    return view;
}

}

そして、ここに私の2つのレイアウトファイルがあります:

<ListView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/category_list"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >  

</ListView>

と:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/category_element"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="horizontal" >

    <TextView
        android:id="@+id/category_element_text" 
        android:layout_height="wrap_content"
        android:layout_width="wrap_content" />    

</LinearLayout>

onCreateView の前に呼び出され、その時点でフラグメントがまだ ListView に関連付けられていないため、onCreate でアダプターを設定すると問題が発生する可能性があると考えました。そのため、コードを onCreate から onStart メソッドに移動しましたが、何も変わりませんでした。

また、getCount() は、データベースからの要素 red の正確な数である 6 を正しく返します。

どんな助けでも本当に感謝します!! ありがとう。

編集:
解決しました!
問題はアクティビティにあり、次のコードがありました:

fragmentTransaction.add(0, categoryListFragment);

私が着替えた

fragmentTransaction.add(R.id.activity_main, categoryListFragment);

フラグメントをアタッチするビュー ID を指定しないと、フラグメントが描画されません!
さらに、私はこれから変更しなければなりませんでした

view = mInflater.inflate(R.layout.category_element, parent);

これに:

view = mInflater.inflate(R.layout.category_element, null);

getView メソッドで。
PS。8 時間が経過するまで自分の質問に答えられないため、この内容を編集しています。

4

1 に答える 1

0

あなたのR.layout.category_listファイルでは、ListViewに次の属性を与える必要があると思います:

android:id="@android:id/list"

ListFragment (および ListActivity) は、この id を探して、 のListViewようなメソッドを呼び出すときにを見つけますsetListAdapter()

また、ListView のみが必要な場合は、レイアウト ファイルを指定する必要はありません。onCreateView() をオーバーライドしないだけで、システムがListView自動的に を提供します。カスタム レイアウトが必要な場合にのみ、インフレートする必要があります。その場合、ListView には上記の ID が必要です。

于 2012-12-25T19:29:48.953 に答える