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

}

这是我的两个布局文件:

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

我认为在 onCreate 中设置适配器可能是一个问题,因为它是在 onCreateView 之前调用的,并且当时该片段尚未与 ListView 关联。所以我将代码从 onCreate 移动到 onStart 方法,但没有任何改变。

此外,getCount() 正确返回我 6,即数据库中红色元素的精确数量。

任何帮助将非常感激!!谢谢。

编辑:
解决了!
问题出在活动中,我有以下代码:

fragmentTransaction.add(0, categoryListFragment);

我改变了

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

如果不指定片段应该附加到的 View 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 回答