2014-12-31 1 views
0

У меня есть адаптер recycler, измененный для настройки курсоров, и я успешно возвращаю результаты в recyclerview через загрузчик и т. Д. Я пытаюсь отобразить расчет разницы между текущая запись (отображается в окне просмотра) и предыдущая запись (могут отображаться или не отображаться в пользовательском интерфейсе на основе позиции).вычислить значение на основе текущей и предыдущей строки в курсоре android

В запросе, который в настоящее время заполняет адаптер, отображаются суммы транзакций по месяцам.

Пример. Если пользователь выбирает сортировку по месяцам, они получат следующее. (Они также могут сортировать потратив сумму.)

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 

Причина я хочу использовать курсор, потому что я только хочу, чтобы загрузить результаты на основе позиции курсора. Есть ли способ, я могу переписать запрос, чтобы я мог получить результаты, которые я хочу, не делая вычисления, когда данные представлены в адаптере?

Вариант, который в настоящее время работает для меня, но я не хочу использовать:

Я получил результаты, я хочу с помощью использования списка массивов и делать расчеты при создании списка массива но я боюсь, поскольку пользователь вводит больше данных (ive проверено на 1000 фиктивных записей), в конечном итоге пользователю придется ждать, пока список будет создан и загружен в UI каждый раз, когда набор данных изменится.

Пожалуйста, помогите мне разобраться в лучшей практике, когда дело доходит до этих сценариев.

+0

, если вы не хотите, чтобы рассчитать все это в одно время (время загрузки), то, возможно, вы можете использовать собственный адаптер для заполнения списка, то вы можете рассчитать diff, используя элемент в запрошенной позиции и позиции-1 (если есть) в 'getView()' – Yazan

+0

, но в вашем случае это позиция и позиция + 1 [diff рядом с 12/2014 isgoingOf (11/2014) -приложениеОф (12/2014)], правильно? – Yazan

+0

Я забыл упомянуть, что я использую адаптер recycler, измененный для использования курсора.Да, вы правы в своем предположении, но это должно быть позиция + 1, если пользователь прокручивает вверх и позицию - 1, если пользователь прокручивается вниз, потому что просмотры сверху возвращаются, поскольку они ушли из пользовательского интерфейса. Из-за этого я думаю, что должен быть лучший способ. Например, переписывание запроса для обеспечения желаемого результата, поэтому мне не нужно выполнять вычисления в адаптере, поскольку представления возвращаются. – patelb

ответ

0

Хорошо, я думал о публикации ответа того, что я говорил вам в комментариях. ope это поможет вам как-то.

  • если у вас есть раскладка файл custom_row.xml для представления каждого элемента в списке
  • и в этой схеме у вас есть 3 TextViews, говорят 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; 
} 

EDIT: с помощью 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 ... 
} 
+0

Спасибо за помощь. Я написал в своем первоначальном сообщении, что у меня есть рабочее решение, как и то, что вы предложили выше. Я прошу разрешения с помощью курсора. Поэтому мне не нужно перезагружать весь результат запроса в arraylist каждый раз, когда происходит изменение в db, так как требуется много времени для загрузки адаптера, когда есть 500 + записей. – patelb

+0

@ user3300856 Извините, не понял этого, проверьте обновленный ответ, добавлен предлагаемый зол, используя пользовательский CusrsorAdapter – Yazan

+0

спасибо, я попробую это и, надеюсь, нет проблем с производительностью, когда пользователь быстро прокручивает, тогда я отвечу – patelb