0

android/java 编程新手。我在作为选项卡应用程序一部分的 Fragment 中有一个 ListView 和一个 Button。我遇到的问题是,即使我将 CursorAdapter 附加到 listView 并且即使来自 CursorAdapter 的 getCount() 返回的不是 0,也不会调用来自 Adapter 的 newView() 方法。

我可以看到按钮,我可以使用它。如果我更改列表的背景,我会看到背景颜色。

我正在使用支持库 - API 级别 11。

public class MyListFragment extends Fragment {
private static final String TAG = "FragmentTabs";

private String mTag ;
private MainLogCursorAdapter mainAdapter;
private Cursor cursor;
private MainLogSource mainLogSource;
private LayoutInflater mInflater;
private ListView listView;
private Button newLogButton;
public MyListFragment() {
}

public MyListFragment(String tag) {
    mTag = tag;
    Log.d(TAG, "Constructor: tag=" + tag);
}

public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
mInflater = LayoutInflater.from(getActivity());

    mainLogSource = new MainLogSource(getActivity().getApplicationContext());

    cursor = mainLogSource.getCursor();

    mainAdapter = new MainLogCursorAdapter(getActivity   ().getApplicationContext    (), cursor);

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

    listView = (ListView) view.findViewById(R.id.listView1);
    listView.setAdapter(mainAdapter);

    System.out.println("Adapter set in onActivityCreated");

    if (mTag.equals("Log")) {
        loadMainLog();

    } else {
        if (mTag.equals("Rem")) {
            loadReminderLog();

        } else
            loadConfig();

    }
    }
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
        Bundle savedInstanceState) {
        // Inflate the layout for this fragment

    if (mTag==null) 

        mTag = new String("Log");

    if (mTag.equals("Log")) {
return inflater.inflate(R.layout.listview1, container, false);

    }

    return null;
}

适配器:

public class MainLogCursorAdapter extends CursorAdapter implements Filterable{
private LayoutInflater mLayoutInflater;
private Context mContext;
private MainLogSource dbh;
private String mainTypeDesc;

public MainLogCursorAdapter(Context context, Cursor c) {
    super(context, c, 0);
    mLayoutInflater = LayoutInflater.from(context);
    dbh = new MainLogSource(context);
    mContext = context;
    mCursor = c;

    public void bindView(View view, Context context, Cursor cursor) {
    String key = (String) cursor.getString(cursor
            .getColumnIndex(MainLogHelper.KEY));

some other code here ...

}
@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {
    View v = mLayoutInflater.inflate(R.layout.row, parent, false);
    System.out.println("newView");
    return v;
}

@Override
public int getCount() {
    // TODO Auto-generated method stub
    System.out.println(super.getCount() + " count returned");
    return super.getCount();
}
}

和 XML:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >

<ListView
    android:id="@+id/listView1"
    android:layout_width="match_parent"
    android:layout_height="fill_parent"
    android:layout_weight="0.9" 
    android:transcriptMode="alwaysScroll"
    >

</ListView>

<Button 
    android:id="@+id/NewLogButton"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_weight="0.1"
    android:onClick="createLog"
    android:text="@string/NewLogCreation" />

</LinearLayout>
4

1 回答 1

0

好的,所以您在 onCreateView 中膨胀并返回视图,但您没有将适配器设置为该 ListView。相反,您在 onActivityCreated 中再次膨胀布局,但这是一个新的、不同的视图,因此将适配器设置为该层次结构中的列表视图没有任何作用,因为第二个视图实际上从未附加到任何地方。

您需要在 onCreateView 中设置适配器。如果此时您的光标无法准备好,只需使用空光标创建适配器,然后稍后调用 CursorAdapter.swapCursor()(可能在 onActivityCreated 中)。请记住始终关闭由 swapCursor() 返回的旧游标(如果它不为空)。

于 2013-07-09T18:01:19.593 回答