ver 23.4.0 RecyclerView список не работает правильно в Android 4.3

Моя проблема заключается в том, что список RecyclerView появляется, но начинается где-то в середине списка и отображает только одну строку одновременно вместо нескольких строк. Я могу прокрутить вверх до первого элемента в списке, но не могу прокрутить вниз. Я нашел некоторые «вопросы» на stackoverflow относительно использования RecyclerView в Android 4.3, но, кажется, ни у кого нет подобной проблемы для меня. С более ранней версией RecyclerView это сработало хорошо. Использование Samsung Galaxy SIII.

Я использую recyclerview в моем приложении следующим образом:

<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.RecyclerView
    android_id="@+id/list"
    android_name="na.com.company.myapp.List"
    
    
    android_layout_width="match_parent"
    android_layout_height="wrap_content"
    android_layout_marginLeft="10dp"
    android_layout_marginRight="10dp"
    android_orientation="vertical"
    tools_context="na.com.company.myapp.List"
    tools_listitem="@layout/a_row"/>

Каждая строка в списке состоит из следующих элементов:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 
    android_orientation="horizontal"
    android_layout_width="match_parent"
    android_layout_height="wrap_content">

    <TextView android_id="@+id/common_name"
        android_layout_width="wrap_content"
        android_layout_height="wrap_content"
        android_layout_alignParentStart="true"
        android_layout_alignParentLeft="true"
        android_paddingTop="10dp"
        android_textSize="18sp"
        android_textStyle="bold"/>

    <TextView android_id="@+id/latin_name"
        android_layout_width="wrap_content"
        android_layout_height="wrap_content"
        android_layout_below="@id/common_name"
        android_layout_alignParentStart="true"
        android_layout_alignParentLeft="true"
        android_paddingBottom="10dp"
        android_textStyle="italic"/>

    <CheckBox android_id="@+id/select_box"
        android_layout_width="wrap_content"
        android_layout_height="wrap_content"
        android_layout_centerVertical="true"
        android_layout_alignParentEnd="true"
        android_layout_alignParentRight="true"
        android_paddingBottom="10dp"
        android_paddingTop="10dp"/>

</RelativeLayout>

Код в производном классе AppCompatActivity выглядит следующим образом (в функции onCreate):

RecyclerView recyclerView = (RecyclerView)findViewById(R.id.list);
LinearLayoutManager linear_layout = new LinearLayoutManager(this);
linear_layout.setOrientation(LinearLayoutManager.VERTICAL);
linear_layout.setAutoMeasureEnabled(true);
recyclerView.setLayoutManager(linear_layout);
Drawable dividerDrawable = ContextCompat.getDrawable(this, R.drawable.list_divider);
RecyclerView.ItemDecoration divider_decoration = new ListDivider(dividerDrawable);
recyclerView.addItemDecoration(divider_decoration);

Сборка приложения.gradle файл содержит:

compile 'com.android.support:appcompat-v7:23.4.0'
compile 'com.android.support:design:23.4.0'
compile 'com.android.support:support-v4:23.4.0'
compile 'com.android.support:recyclerview-v7:23.4.0'

Код пользователя:

public class TheViewHolder extends RecyclerView.ViewHolder implements OnClickListener
{
    private View the_view = null;
    private CheckBox selected_item = null;

    public TheViewHolder(final View individual_view)
    {
        super(individual_view);
        the_view = individual_view;
        the_view.setOnClickListener(this);
        selected_item = (CheckBox)the_view.findViewById(R.id.select_box);
    }

    public void AttachCursor(final Cursor data_cursor, String[] columns, int[] views, boolean is_selected)
    {
        TextView a_view = (TextView) the_view.findViewById(views[0]);
        a_view.setText(data_cursor.getString(data_cursor.getColumnIndex(columns[0])));
        a_view = (TextView) the_view.findViewById(views[1]);
        a_view.setText(data_cursor.getString(data_cursor.getColumnIndex(columns[1])) + " " + data_cursor.getString(data_cursor.getColumnIndex(columns[2])));
        selected_item.setChecked(is_selected);
    }

    @Override
    public void onClick(View clicked_view)
    {
        selected_item.setChecked(true);
    }
}

и адаптер (query_cursor.getCount () в функции getItemCount в настоящее время возвращает значение 691):

public class SimpleCursorRecyclerViewAdapter extends RecyclerView.Adapter<TheViewHolder>
{
    private Cursor query_cursor = null;
    private int layout_resource = 0;
    private String[] table_columns;
    private int[] layout_views;
    private View layout_view = null;
    private boolean checkbox_list[] = null;

    public SimpleCursorRecyclerViewAdapter(Context context, int layout_id, Cursor data_cursor, String[] columns, int[] views)
    {
        layout_resource = layout_id;
        query_cursor = data_cursor;
        table_columns = columns;
        layout_views = views;
    }

    public Cursor get_item(final int position)
    {
        if (query_cursor != null && !query_cursor.isClosed())
        {
            query_cursor.moveToPosition(position);
        }

        return query_cursor;
    }

    @Override
    public int getItemCount()
    {
        int size = 0;
        if (query_cursor != null)
        {
            size = query_cursor.getCount();
            checkbox_list = new boolean[size];
        }
        return size;
    }

    @Override
    public void onBindViewHolder(TheViewHolder view_holder, int position)
    {
        Cursor current_cursor = get_item(position);
        view_holder.AttachCursor(current_cursor, table_columns, layout_views, checkbox_list[position]);
    }

    @Override
    public TheViewHolder onCreateViewHolder(ViewGroup parent, int viewType)
    {
        if (layout_view == null)
        {
            layout_view = LayoutInflater.from(parent.getContext()).inflate(layout_resource, parent, false);
        }
        return new TheViewHolder(layout_view);
    }
}

1 ответ

  1. Проблема заключалась в моем коде, в частности в этом методе:

    @Override
    public TheViewHolder onCreateViewHolder(ViewGroup parent, int viewType)
    {
        if (layout_view == null)
        {
            layout_view = LayoutInflater.from(parent.getContext()).inflate(layout_resource, parent, false);
        }
        return new TheViewHolder(layout_view);
    }
    

    Список теперь появляется это должно быть, когда я переписал onCreateViewHolder как:

     @Override
     public TheViewHolder onCreateViewHolder(ViewGroup parent, int viewType)
     {
        layout_view = LayoutInflater.from(parent.getContext()).inflate(layout_resource, parent, false);
        return new TheViewHolder(layout_view);
    }