Android 自定义SimpleCorsorAdapter不';t绑定数据,即使存在';没有数据

Android 自定义SimpleCorsorAdapter不';t绑定数据,即使存在';没有数据,android,android-listview,simplecursoradapter,Android,Android Listview,Simplecursoradapter,因此,我正在尝试创建一个自定义的SimpleCorsorAdapter,因为我希望创建如下所示的列表行: 切换按钮|文本视图|图像按钮, 我知道如果不制作一个自定义适配器,就没有办法做到这一点 问题是我的代码不起作用,我真的不知道为什么。即使没有要显示的数据,我也会得到一个默认格式的行: 切换按钮|“默认”|图像按钮 此外,显示的所有行看起来与默认行完全相同,并且我设置的OnClickListener不做任何事情 有人能告诉我我做错了什么,或者至少给我指出一个体面的教程,教我如何处理自定义游标适

因此,我正在尝试创建一个自定义的SimpleCorsorAdapter,因为我希望创建如下所示的列表行:
切换按钮|文本视图|图像按钮, 我知道如果不制作一个自定义适配器,就没有办法做到这一点

问题是我的代码不起作用,我真的不知道为什么。即使没有要显示的数据,我也会得到一个默认格式的行:
切换按钮|“默认”|图像按钮

此外,显示的所有行看起来与默认行完全相同,并且我设置的OnClickListener不做任何事情

有人能告诉我我做错了什么,或者至少给我指出一个体面的教程,教我如何处理自定义游标适配器和onclick侦听器吗?因为我完全找不到任何有帮助的东西

以下是我的适配器代码:

public class AlarmCursorAdapter extends SimpleCursorAdapter {

private Cursor mCursor;
private Context mContext;
private Activity mActivity;

public AlarmCursorAdapter(Context context, int layout, Cursor c,
        String[] from, int[] to, int flags) {
    super(context, layout, c, from, to, flags);
    // TODO Auto-generated constructor stub
    mCursor = c;
    mContext = context;
    mActivity = (Activity) context;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    View view = convertView;
    if(view == null) {
        view = LayoutInflater.from(mContext).inflate(R.layout.alarm_list_row, parent, false);
    }
    if(mCursor == null || mCursor.getCount() == 0) {
        return view;
    }
    mCursor.moveToPosition(position);

    // Set the alarm time view
    TextView alarmView = (TextView) view.findViewById(R.id.alarmView);
    int timeStringIndex = mCursor.getColumnIndexOrThrow(DailyAlarmTable.ALARM_TIME);
    String alarmTime = mCursor.getString(timeStringIndex);
    alarmView.setText(alarmTime);

    // Set up the toggle button
    int isActiveIndex = mCursor.getColumnIndexOrThrow(DailyAlarmTable.ALARM_ISACTIVE);
    int isActive = mCursor.getInt(isActiveIndex);
    ToggleButton alarmToggle = (ToggleButton)view.findViewById(R.id.alarmToggle);
    if(isActive == 1) {
        alarmToggle.setChecked(true);
    } else {
        alarmToggle.setChecked(false);
    }
    final int currentPosition = mCursor.getPosition();
    int idIndex = mCursor.getColumnIndexOrThrow(DailyAlarmTable.ALARM_ID);
    final long alarmId = mCursor.getLong(idIndex);
    alarmToggle.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View arg0) {
            // TODO Auto-generated method stub
            String toastStr = "clicked alarm " + alarmId + " at position " + currentPosition;
            Toast.makeText(mContext, toastStr, Toast.LENGTH_SHORT).show();
        }

    });

    return view;
}

}
以下是在片段中发生的实现:

@Override
public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
    /*
    mAdapter = new SimpleCursorAdapter(getActivity(),
            R.layout.alarm_list_row, null,
            new String[] { DailyAlarmTable.ALARM_TIME, DailyAlarmTable.ALARM_ISACTIVE },
            new int[] { R.id.alarmView, R.id.alarmToggle }, 0);

    */
    mAdapter = new AlarmCursorAdapter(getActivity(),
            R.layout.alarm_list_row, null,
            new String[] { DailyAlarmTable.ALARM_TIME, DailyAlarmTable.ALARM_ISACTIVE },
            new int[] { R.id.alarmView, R.id.alarmToggle }, 0);

    //mAdapter.setViewBinder(new AlarmViewBinder());
    ListView alarmList = (ListView) this.getActivity().findViewById(R.id.alarmListView);
    TextView emptyView = (TextView) this.getActivity().findViewById(R.id.empty);
    alarmList.setEmptyView(emptyView);
    alarmList.setAdapter(mAdapter);

    // Initialize the loader
    getLoaderManager().initLoader(1, savedInstanceState, this);
}
以下是该行的XML文件:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >

<ToggleButton
    android:id="@+id/alarmToggle"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:checked="true"
    android:text="@string/details_default" />

<TextView
    android:id="@+id/alarmView"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/details_default"
    android:textAppearance="?android:attr/textAppearanceMedium" />

<ImageButton
    android:id="@+id/alarmDiscard"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:src="@drawable/ic_discard"
    android:contentDescription="@string/alarm_discard_description" />

</LinearLayout>


如果您还需要其他代码,我很乐意添加。非常感谢您。

正如pskink的评论所建议的,解决方案根本不是使用自定义SCA,而是只实现一个视图绑定器。

我很确定您不必扩展SCA,只要实现这个,如果我尝试使用视图绑定器,但我不确定如何实现一个允许我删除一行的按钮。可以在视图绑定器中实现这样一个按钮吗?将按钮的id添加到“to”数组中,并将一些伪列添加到“from”数组中,然后设置侦听器。我会试试看,然后告诉你。效果很好。非常感谢你。