滚动

时间:2015-12-23 08:29:43

标签: android android-layout listview android-listview android-cursoradapter

我正在尝试开发一个应用来记录债务,其中我有一个来自此github https://github.com/baoyongzhang/SwipeMenuListView的SwipeMenuListView用于添加滑动菜单。使用自定义CursorAdapter,我使用名称和总债务填充ListView。

现在,我想根据截止日期对每个listview项目进行分组。我已经在我的SQLite上创建了一个新列,以便为每天添加标题。现在我只需要为ListView的标题和项目使用不同的样式。通过从bindView检测新列,并根据它是否为标题或项目,它将更改,隐藏和显示相同布局中的元素。

问题是当我滚动ListView时,一些listview项改变了样式。如果我继续上下滚动会变得更糟。 Here's the picture of the error from the listview.请注意,它只在一个会话中,标题样式似乎已在某些项目中使用,标题本身已更改为红色,这将被视为项目的颜色代码。如果我点击其中一个项目,它仍然会得到正确的项目,所以我认为它在cursorAdapter中有问题,但我无法弄明白。在我检查过的SQL数据库中,这不是一个错误。

这里是cursorAdapter。

public class DebtCursorAdapterMain extends CursorAdapter {
public DebtCursorAdapterMain(Context context, Cursor c, int flags) {
    super(context, c, flags);
}

@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {
    return LayoutInflater.from(context).inflate(R.layout.debt_list_item, parent, false);
}

@Override
public void bindView(View view, Context context, Cursor cursor) {
    int x = Integer.parseInt(cursor.getString(cursor.getColumnIndex(DBHelper.DATE_SEPARATOR_COLUMN)));

    TextView tvName = (TextView) view.findViewById(R.id.tvName);
    TextView tvTotal = (TextView) view.findViewById(R.id.tvTotal);

    if(x == 0) {
        DecimalFormat df = new DecimalFormat("#.00");

        String nameText = cursor.getString(cursor.getColumnIndex(DBHelper.NAME_COLUMN));
        String totalText = "$ " + df.format(cursor.getDouble(cursor.getColumnIndex(DBHelper.TOTAL_COLUMN)));
        String type = cursor.getString(cursor.getColumnIndex(DBHelper.TYPE_COLUMN));

        if (tvName != null)
            tvName.setText(nameText);
        if (tvTotal != null)
            tvTotal.setText(totalText);

        if (type.equals("L"))
            view.setBackgroundColor(Color.parseColor("#ff9999"));
        if (type.equals("B"))
            view.setBackgroundColor(Color.parseColor("#99ff99"));
    }
    if(x == 1){
        String date = cursor.getString(cursor.getColumnIndex(DBHelper.DUE_DATE_COLUMN));
        if (tvName != null && tvTotal != null) {
            tvName.setText(date);
            tvName.setTextSize(TypedValue.COMPLEX_UNIT_SP, 22);
            tvTotal.setVisibility(View.GONE);
        }
    }
}

}

以下是调用cursorAdapter的主要活动。

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    // Find SwipeMenuListView
    final SwipeMenuListView swipeMenuList = (SwipeMenuListView) findViewById(R.id.swipeMenuList);
    // Create Debt database cursor adapter
    cursorAdapter = new DebtCursorAdapterMain(this, null, 0);
    // Create SwipeMenuList and set item
    SwipeMenuCreator creator = createMainActivitySwipeMenu();
    swipeMenuList.setMenuCreator(creator);
    swipeMenuList.setAdapter(cursorAdapter);
    swipeMenuList.setSwipeDirection(SwipeMenuListView.DIRECTION_LEFT);

    // Set SwipeMenuList on item's menu click
    swipeMenuList.setOnMenuItemClickListener(new SwipeMenuListView.OnMenuItemClickListener() {
        @Override
        public boolean onMenuItemClick(int position, SwipeMenu menu, int index) {
            ....
        }
    });

    // Swipe menu on Click function
    swipeMenuList.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> adapterView, View view, int position, long id) {
            ....
        }
    });

    // Initialize cursor and check database for updating top info
    getLoaderManager().initLoader(0, null, this);
    checkDataBase();
}

我在Android开发方面还是新手,所以请告诉我是否有更好的方法解决这个问题。谢谢你们。

0 个答案:

没有答案