2014-10-11 3 views
18

Я до сих пор не предлагал решение Google для замены списка в моем проекте, потому что мне нужно использовать курсор, связанный с sqlite.Можно ли установить CursorAdapter в recycleview, как и ListView?

Старый способ, как следует: listview.setAdapter(cursorAdapter) таким образом, я могу получить курсор, чтобы иметь дело с данными в базе данных

но теперь recycleview.setAdapter(recycleview.adapter) он не распознает адаптер простирающегося BaseAdapter

, так что каждый может дай мне руку?

+1

Смотрите мой ответ здесь: http://stackoverflow.com/a/27732748/1371730 Хороший трюк :) – nbtk

+0

Возможный дубликат [Использование recyclerview с базой данных] (http://stackoverflow.com/questions/26517855/using-the-recyclerview-with-a-database) – e4c5

ответ

7

Новый RecyclerView работает с новым базовым классом RecyclerView.Adapter. Так что это не работает с CursorAdapter.

В настоящее время существует нет реализации по умолчанию из RecyclerView.Adapter в наличии.

Может быть, с официальным выпуском Google добавит его.

+1

да, я нашел одно решение в github, но официальный релиз будет лучше в разных аспектах, мне лучше подождать. – machinezhou

+1

@machinezhou Можете ли вы поделиться проектом github? – josedlujan

+0

@josedlujan вот ссылка проекта github https://gist.github.com/skyfishjy/443b7448f59be978bc59 –

31

Реализация сами на самом деле довольно просто:

public class CursorAdapter extends RecyclerView.Adapter<ViewHolder>{ 

    Cursor dataCursor; 

    @Override 
    public int getItemCount() { 
     return (dataCursor == null) ? 0 : dataCursor.getCount(); 
    } 


    public void changeCursor(Cursor cursor) { 
     Cursor old = swapCursor(cursor); 
     if (old != null) { 
      old.close(); 
     } 
     } 

    public Cursor swapCursor(Cursor cursor) { 
     if (dataCursor == cursor) { 
      return null; 
     } 
     Cursor oldCursor = dataCursor; 
     this.dataCursor = cursor; 
     if (cursor != null) { 
      this.notifyDataSetChanged(); 
     } 
     return oldCursor; 
     } 

    private Object getItem(int position) { 
     dataCursor.moveToPosition(position); 
     // Load data from dataCursor and return it... 
     } 

} 
+1

eh, это не то, что я имею в виду приятеля, я действительно нашел проект на github позже, когда cursorAdapter реализован самим разработчиком . Но это не так просто, и я не уверен, выйдет ли ошибка или что-то неожиданное. Поэтому из-за моей собственной способности и стабильности, я бы предпочел дождаться официального релиза. – machinezhou

+2

@machinezhou Я не думаю, что они собираются добавить официальный релиз для него, пока это безупречно работает для меня – nyx

+0

Чувство, которое я получаю, заключается в том, что официальной реализации не будет, поскольку «нет DB работают над потоком пользовательского интерфейса «vibe, который они выталкивали с CursorLoader. В любом случае, что касается решения здесь, перейдя к другим реализациям, которые я видел, вы можете проверить возможные ошибки, вызванные перемещением курсора или состояния курсора. Реализации, которые я видел до сих пор, просто бросают исключения в этом случае, что кажется мне нескромным. – Tarkenfire