我有一个改装的回收器适配器使用游标设置,我通过装载机等成功地将结果返回到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 。
请帮助我了解这些方案的最佳做法。
答案 0 :(得分:0)
好的,我想在评论中发布我告诉你的回答。 打开这会对你有所帮助。
custom_row.xml
来表示列表中的每个项目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 ...
}