Android:未调用自定义适配器的getView方法

时间:2012-12-25 17:35:28

标签: android listview adapter

我已经针对同样的问题搜索了很多其他答案,但没有找到任何适合我的解决方案。正如标题所说,问题是我的自定义适配器中的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个小时才能回答我自己的问题..

1 个答案:

答案 0 :(得分:0)

我认为在R.layout.category_list文件中,您需要为ListView提供以下属性:

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

ListFragment(和ListActivity)会在您调用ListView等方法时查找此ID以查找setListAdapter()

此外,如果您只想要一个ListView,则不必提供布局文件。只需不要覆盖onCreateView(),系统就会自动为您提供ListView。只有当你想要一个自定义布局时才需要膨胀一个,如果你这样做,ListView应该具有上述id。