Методы RecyclerView.Adapter onCreateViewHolder и onBindViewHolder не вызываются

Я пытаюсь реализовать TwoWayView в своем проекте, следуя примеру проекта, указанному в этой ссылке. Я все реализовал, и мой код работает без ошибок, но фактический список не раздувается. После отладки я обнаружил, что адаптер настроен правильно, и метод getItemCount также возвращает положительное значение, но два других переопределенных метода onCreateViewHolder и onBindViewHolder не вызываются. Я понятия не имею, почему это не работает. Пожалуйста, смотрите частичный код ниже, любая помощь приветствуется. Спасибо.

Класс MyAdapter.java

public class MyAdapter extends RecyclerView.Adapter < MyViewHolder > {

    private MySimpleCursorAdapter mCursor;
    //some other private fields here

    public MyAdapter(Context context, Cursor c, int resourceId, ViewType viewType, String containerId) {
        mCursor = new MySimpleCursorAdapter(a1,a2,a3,a4,a5,a6); //Passed necessary arguments
        ....
    }

    @Override
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        Log.w("onCreateViewHolder", "--------->executed"); //Line not executed
        final View view = mCursor.newView(mContext, mCursor.getCursor(), parent);
        return new MyViewHolder(view);
    }

    @Override
    public void onBindViewHolder(MyViewHolder holder, int position) {
        Log.w("onBindViewHolder", "--------->executed"); //Line not executed
        mCursor.bindView(holder.itemView, mContext, mCursor.getCursor());
    }

    @Override
    public int getItemCount() {
        Log.w("count", Integer.toString(mCursor.getCount())); //This is executed
        return mCursor.getCount();
    }

    private class MySimpleCursorAdapter extends SimpleCursorAdapter {

        public MySimpleCursorAdapter(Context context, int layout, Cursor c, String[] from, int[] to, int flags) {
            super(context, layout, c, from, to, flags);
        }

        @Override
        public View newView(Context context, Cursor cursor, ViewGroup parent) {
            View view = mLayoutInflater.inflate(mLayoutToInflate, null);
            ....
            return view;
        }

        @Override
        public void bindView(final View view, Context context, Cursor cursor) {
            //Implemented this method for inflating all subviews inside each item of the list
        }
    }
 }

Примечание. Я задавал подобные вопросы, но представленные там ответы не имеют отношения к моему вопросу, потому что мой RecyclerView не находится внутри ScrollView, а также getItemCount возвращает положительный счет.


person Prudhvi    schedule 08.09.2015    source источник
comment
используйте этот адаптер gist.github.com/Shywim/127f207e7248fe48400b   -  person pskink    schedule 08.09.2015


Ответы (2)


Я думаю, вы забыли setLayoutManager(LayoutManager) в представлении переработчика. Без Layout Manager вызывается только getItemCount().

Попробуйте с yourRecyclerview.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false));

person xiaomi    schedule 08.09.2015
comment
Эй, спасибо за ответ, но я не использую LinearLayoutManager по умолчанию. Если вы видите пример кода здесь (строка 128) он также не использует setLayoutManager. - person Prudhvi; 08.09.2015
comment
Итак, вы вставили в xml-файл app:twowayview_layoutManager="ListLayoutManager"? (или любой другой layoutmanager) вроде этого github.com/lucasr/twoway-view/blob/master/sample/src/main/res/ - person xiaomi; 09.09.2015
comment
Да, я поместил это в свой файл XML. - person Prudhvi; 09.09.2015

Во-первых, вы должны сохранить ссылку на Context при создании экземпляра адаптера:

public class MyAdapter extends RecyclerView.Adapter < MyViewHolder > {

private MySimpleCursorAdapter mCursor;
private Context context;  // <-- add this line
//some other private fields here

public MyAdapter(Context context, Cursor c, int resourceId, ViewType viewType, String containerId) {
    mCursor = new MySimpleCursorAdapter(a1,a2,a3,a4,a5,a6); 
    this.context = context;  // <-- add this line
    //Passed necessary arguments
    ....
}

Затем в методе onCreateViewHolder используйте эту ссылку на Context, чтобы создать представление для ViewHolder:

    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    Log.w("onCreateViewHolder", "--------->executed"); //Line not executed
    final View view = mCursor.newView(context, mCursor.getCursor(), parent);
    return new MyViewHolder(view);
}

Затем в вашем CursorAdapter раздуйте представление следующим образом:

        public View newView(Context context, Cursor cursor, ViewGroup parent) {
        View view = LayoutInflater.from(context).inflate(mLayoutToInflate, parent, false);
        return view;
    }

У меня была та же проблема, хотя я использовал вызов JSON для извлечения данных вместо адаптера курсора, и эти изменения устранили проблему.

person dpspae03    schedule 19.08.2016