0

辅助问题

嗨,有人可以帮我理解的行为SimpleCursorAdapter.ViewBinder.setViewValue吗?

似乎对于ListView. 调用次数是否取决于 ListView 中的行数?或光标中的项目数SimpleCursorAdapter?另外,传递给函数的参数有什么意义?

主要问题

我在尝试创建一个简单ListViewCheckedTextViews. 我想减少检查的行的不透明度。我编写的代码有效,只是它总是会减少额外一行的不透明度。

将 layout_height 设置ListView为 match_parent 解决了某些情况下的问题。但是当我打开键盘进行编辑并且需要 ListView 时,问题仍然存在。


请在此处找到代码

填写项目的代码ListActivity

private void fillDataToList() {
    Cursor all_taskCursorCursor = mDbHelper.fetchAllTask();
    startManagingCursor(all_taskCursorCursor);

    String[] from = new String[]{TaskDbAdapter.KEY_TITLE};
    int[] to = new int[]{R.id.task_title};

    SimpleCursorAdapter tasks = new SimpleCursorAdapter(this, R.layout.task_row, all_taskCursorCursor, from, to);

    tasks.setViewBinder(new ViewBinder() {

        public boolean setViewValue(View view, Cursor cursor, int columnIndex) {
            if(columnIndex == 1) {
                CheckedTextView ctv = (CheckedTextView) view;

                String text = cursor.getString(cursor.getColumnIndexOrThrow(TaskDbAdapter.KEY_TITLE));
                boolean checked = cursor.getInt(cursor.getColumnIndexOrThrow(TaskDbAdapter.KEY_COMPLETED)) == 1 ? true : false; 

                ctv.setText(text);
                ctv.setChecked(checked); 

                if (checked == true) {
                    AlphaAnimation animation = new AlphaAnimation(1, 0.25f);
                    animation.setFillAfter(true);
                    ctv.setAnimation(animation); 

                    ctv.setPaintFlags(Paint.STRIKE_THRU_TEXT_FLAG);
                }

                return true;
            }

            return false;
        }
    });

    setListAdapter(tasks);
}

ListView 的布局——

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

<ListView
    android:id="@android:id/list"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >
</ListView>

<TextView
    android:id="@android:id/empty"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:text="@string/no_task"
    android:padding="10dp"
    android:gravity="center_vertical|center_horizontal"
    android:textAppearance="?android:attr/textAppearanceMedium" />

</LinearLayout>

每行的布局 -

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

<CheckedTextView
    android:id="@+id/task_title"
    android:layout_width="fill_parent"
    android:layout_height="50dp"
    android:padding="10dp"
    android:textAppearance="?android:attr/textAppearanceMedium"
    android:checkMark="?android:attr/listChoiceIndicatorMultiple" />

</LinearLayout>
4

1 回答 1

0

通过向 if (checked == true) 部分添加一个 else 条件解决了该问题。

最终代码如下所示 -

if (checked == true) {
    AlphaAnimation animation = new AlphaAnimation(1, 0.25f);
    animation.setFillAfter(true);
    ctv.setAnimation(animation); 

    ctv.setPaintFlags(ctv.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG);
} else {
    ctv.setPaintFlags(ctv.getPaintFlags() & (~ Paint.STRIKE_THRU_TEXT_FLAG));
}
于 2012-05-10T06:34:44.307 回答