1

Я пытаюсь реализовать адаптер для Recyclerview с использованием CusrorAdapter, как показано в одном из решений here.Адаптер Recycliewiew с CursorAdapter

Я новичок в Android, и я не совсем понимаю, как я должен переопределить метод newView CursorAdapter и метод bindView. Также я предполагаю, что мой адаптер будет иметь несколько переменных в ViewHolder вместо одного (View v1), поскольку в моем файле макета есть несколько textViews, но я просто не знаю, как они все вписываются в код.

public class MyRecyclerAdapter extends Adapter<MyRecyclerAdapter.ViewHolder { 

// PATCH: Because RecyclerView.Adapter in its current form doesn't natively support 
// cursors, we "wrap" a CursorAdapter that will do all teh job for us 
CursorAdapter mCursorAdapter; 
Context mContext; 

public MyRecyclerAdapter(Context context, Cursor c) { 
    mContext = context; 
    mCursorAdapter = new CursorAdapter(mContext, c, 0) { 

     @Override 
     public View newView(Context context, Cursor cursor, ViewGroup parent) { 
      // Inflate the view here 
     } 

     @Override 
     public void bindView(View view, Context context, Cursor cursor) { 
      // Binding operations 

     } 
    }; 
} 

public static class ViewHolder extends RecyclerView.ViewHolder{ 
    View v1; 
    public ViewHolder(View itemView) { 
     super(itemView); 
     v1 = itemView.findViewById(R.id.v1); 
    } 
} 

@Override 
public int getItemCount() { 
    return mCursorAdapter.getCount(); 
} 

@Override 
public void onBindViewHolder(ViewHolder holder, int position) { 
    // Passing the binding operation to cursor loader 
    mCursorAdapter.bindView(holder.itemView, mContext, mCursorAdapter.getCursor()); 

} 

@Override 
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    // Passing the inflater job to the cursor-adapter 
    View v = mCursorAdapter.newView(mContext, mCursorAdapter.getCursor(), parent); 
     return new ViewHolder(v); 
    } 
} 

ответ

1

Как-то мне удалось заставить его работать, хотя я не понимаю, как это работает в деталях. В основном я добавил переменную ViewHolder как переменную класса и изменил некоторые части кода. Решение выглядит примерно так, когда у вас есть 2 TextView пунктов (name и date) в файле макета под названием row.xml:

public class MyRecyclerAdapter extends Adapter<MyRecyclerAdapter.ViewHolder>{ 

    // PATCH: Because RecyclerView.Adapter in its current form doesn't natively support 
    // cursors, we "wrap" a CursorAdapter that will do all teh job for us 
    private CursorAdapter mCursorAdapter; 
    private Context mContext; 
    private ViewHolder holder; 

    public MyRecyclerAdapter(Context context, Cursor c) { 
     mContext = context; 
     mCursorAdapter = new CursorAdapter(mContext, c, 0) { 

      @Override 
      public View newView(Context context, Cursor cursor, ViewGroup parent) { 
       // Inflate the view here 
       View v = LayoutInflater.from(context) 
        .inflate(R.layout.row_rv, parent, false); 
       return v; 
      } 

      @Override 
      public void bindView(View view, Context context, Cursor cursor) { 
       // Binding operations 
       String name = cursor.getString(cursor.getColumnIndexOrThrow("name")); 
       String date = cursor.getString(cursor.getColumnIndexOrThrow("date")); 

       holder.tvName.setText(name); 
       holder.tvDate.setText(date); 
      } 
     }; 
    } 

    public static class ViewHolder extends RecyclerView.ViewHolder{ 
     public TextView tvName; 
     public TextView tvDate; 

     public ViewHolder(View itemView) { 
      super(itemView); 
      tvName = (TextView) itemView.findViewById(R.id.name); 
      tvDate = (TextView) itemView.findViewById(R.id.date); 
     } 
    } 

    @Override 
    public int getItemCount() { 
     return mCursorAdapter.getCount(); 
    } 

    @Override 
    public void onBindViewHolder(ViewHolder holder, int position) { 
     // Passing the binding operation to cursor loader 
     mcursorAdapter.getCursor().moveToPosition(position); 
     mCursorAdapter.bindView(holder.itemView, mContext, mCursorAdapter.getCursor()); 
    } 

    @Override 
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     // Passing the inflater job to the cursor-adapter 
     View v = mCursorAdapter.newView(mContext, mCursorAdapter.getCursor(), parent); 
     holder = new ViewHolder(v); 
     return holder; 
    } 
} 

Если кто-нибудь знает, почему это работает, пожалуйста, не стесняйтесь, чтобы присоединиться к обсуждению. Благодарю.

0

Вместо того, чтобы вам создать ViewHolder с видом, вы должны создать ViewHolder со всеми объектами, которые имеют на макете (все элементы, которые необходимо). Представление макета должно быть создано (раздуваться) в методе onCreateViewHolder.

Нечто подобное:

public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> 
{ 
    class ViewHolder extends RecyclerView.ViewHolder { 
     TextView textView1; 
     TextView textView2; 

     public ViewHolder(View itemView) { 
      super(itemView); 
      textView1 = (TextView) itemView.findViewById(R.id.textView1); 
      textView2 = (TextView) itemView.findViewById(R.id.textView2); 
     } 

     public void insertView(String result1, String result2) { 
      textView1.setText(result1); 
      textView2.setText(result2); 
     } 
    } 

    @Override 
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.layout_name, parent, false); 
     RecyclerView.ViewHolder viewHolder = new ViewHolder(itemView); 

     return viewHolder; 
    } 

    @Override 
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { 
     ((ViewHolder) holder).insertView(results.get(position).getResult1(), results.get(position).getResult2()); 
    } 

    @Override 
    public int getItemCount() { 
     return results.size(); 
    } 
} 

I think this can help you

Вы можете использовать ORMSugar за настойчивость. Тем не менее, если у вас есть возможность доступа к базе данных вне адаптера, было бы намного лучше. Вы получите необходимую информацию из базы данных и передадите эту информацию в конструктор адаптера.

Если вам нужен пример, просто вы должны сказать мне.

+0

Спасибо за ваш ответ, но, похоже, отсутствует 'CursorAdapter'. Причина, по которой я использую 'CursorAdapter' внутри адаптера, это то, что я получаю данные из БД. Я могу реализовать адаптер «RecyclerView» обычным способом, как ваш, но когда участвует «CursorAdapter», я начинаю испытывать проблемы. – Risa

+0

Извините, я забыл эту часть. Почему бы вам не использовать ORM, например [SugarORM] (http://satyan.github.io/sugar/)? Это проще, чем CursorAdapter. –

+0

См. Отредактированный ответ. –

Смежные вопросы