根据游标android中的当前行和上一行计算值

时间:2014-12-31 06:36:27

标签: android android-cursoradapter android-cursor

我有一个改装的回收器适配器使用游标设置,我通过装载机等成功地将结果返回到recyclerview。我试图显示当前记录(显示在视图中)和以前的记录(可能会也可能不会根据位置显示在UI上)。

当前填充适配器的查询按月显示交易金额。

实施例。如果用户按月选择排序,他们将得到以下内容。 (他们也可以按消费金额进行排序。)

month   |  spending
--------+----------
12/2014 | 123
--------|----------
11/2014 | 145
--------|----------
10/2014 | 130

当用户滚动Recyclerviews时,显示以下内容的最佳做法是什么。我希望用户能够选择排序类型,并根据结果找到与之前记录的差异。

month   |  spending | difference
--------+-----------+------------
12/2014 | 123       | + 22
--------|-----------+------------
11/2014 | 145       | + 15
--------|-----------+------------
10/2014 | 130       | null

我想使用游标的原因是因为我只想根据游标的位置加载结果。有没有办法可以重写查询,这样我可以得到我想要的结果而不需要在适配器中显示数据时进行计算?

目前适用于我但我不想使用的选项:

我已经通过使用数组列表并在创建数组列表期间进行计算得到了我想要的结果但是我担心当用户输入更多数据时(我已经测试了1000个虚拟记录),最终用户将不得不等待创建列表并在每次数据集更改时加载到UI

请帮助我了解这些方案的最佳做法。

1 个答案:

答案 0 :(得分:0)

好的,我想在评论中发布我告诉你的回答。 打开这会对你有所帮助。

  • 假设您有一个布局文件custom_row.xml来表示列表中的每个项目
  • 并且在此布局中您有3个文本视图,例如txtDate,txtSpend和txtDif:
  • 您的数据列表是ArrayList<SpendingItem>,其中SpendingItem具有(日期,支出),而在适配器类中,它被称为items

然后getView将如下所示:

@override
public View getView(int position, View convertView, ViewGroup parent){
        //convertView == null or not, init ViewHolder, setTag or getTag (in case you are usin this approach to recycle views).

        //here comes the calculations:
        holder.txtDate.setText(items.get(position).getDate());
        holder.txtSpend.setText(items.get(position).getSpend() + "");//as getSpend() return int
        if(items.size() > position+1){
            holder.txtDif.setText((items.get(position+1).getSpend() - items.get(position).getSpend()) + "");
        //result is int, to avoid considering this int as a resource int (in strings xml file) or you can use Integer.toString()
        }else{
            holder.txtDif.setText("N/A");
        }

        // some other code ...

        return convertView;
}

修改 使用CusrsorAdapter:

@Override
public void bindView(View arg0, Context context, Cursor cursor) {
    //here comes the calculations:
    holder.txtDate.setText(cursor.getString(1));
    holder.txtSpend.setText(cursor.getInt(2) + "");
    final int currentSpen = cursor.getInt(2); // conside index 2 is spending value in cursor
    if(cursor.moveToNext()){
        holder.txtDif.setText((cursor.getInt(2) - currentSpen) + "");
        cursor.moveToPrevious();//return to current position so you will not skip a row from cursor
    }else{
        holder.txtDif.setText("N/A");
    }

    // some other code ...
}