многократно просматривать и данные, когда пункт повторного просмотра генерируется программно - PullRequest
0 голосов
/ 16 июня 2019

Я создал recyclerView и его адаптер.В адаптере зависит от моего класса, который я передаю ему, элемент строки генерируется автоматически.

Это элемент представления переработчика `add_row_item:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_margin="4dp"
    android:orientation="horizontal">

</LinearLayout>

И это основной макет:

<layout xmlns:android="http://schemas.android.com/apk/res/android">

    <data>

    </data>

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:gravity="center_horizontal"
        android:background="@color/md_indigo_50">

        <android.support.v7.widget.RecyclerView
            android:id="@+id/recycler_view_item"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:scrollbars="vertical">

        </android.support.v7.widget.RecyclerView>

        <Button
            android:id="@+id/save_to_grid"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_below="@+id/recycler_view_item"
            android:layout_centerHorizontal="true"
            android:layout_margin="10dp"
            android:background="@drawable/bg_round"
            android:padding="5dp"
            android:text="ذخیره"
            android:textColor="#424242"
            android:visibility="visible" />

    </RelativeLayout>

</layout>

Это Адаптер:

public class RevisitGridAdapter extends RecyclerView.Adapter<RevisitGridAdapter.GridHolder> {

    private List<DataGridColumn> column;

    public RevisitGridAdapter(List<DataGridColumn> column) {
        this.column = column;
    }

    public int dip2pix(@NonNull Context context, int dip) {
        return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dip,
                context.getResources().getDisplayMetrics());
    }

    @NonNull
    @Override
    public GridHolder onCreateViewHolder(@NonNull ViewGroup parent, int i) {
        Context context = parent.getContext();
        View root = LayoutInflater.from(context).inflate(R.layout.add_row_item, parent, false);
        return new GridHolder(root);
    }

    @Override
    public void onBindViewHolder(@NonNull GridHolder holder, int position) {
        holder.setPosition(holder, position);
    }

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

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public int getItemViewType(int position) {
        return position;
    }
    class GridHolder extends RecyclerView.ViewHolder {

        private TextView tv;
        private LinearLayout parent;

        public GridHolder(@NonNull View itemView) {
            super(itemView);
            parent = (LinearLayout) itemView;
        }

        public void setPosition(GridHolder holder, int position) {
            if (!column.get(position).getName().startsWith("CI")) { // todo add EUM
                EditText edt = createEditText();
                holder.parent.addView(edt);
                tv = createTextView();
                tv.setText(column.get(position).getHeader());
                holder.parent.addView(tv);
            } else {
                holder.parent.addView(createSpinner());
                tv = createTextView();
                tv.setText(column.get(position).getHeader());
                holder.parent.addView(tv);
            }
        }

        private Spinner createSpinner() {
            final Spinner sp = new Spinner(itemView.getContext());
            int padding = (int) itemView.getContext().getResources().getDimension(R.dimen.elevation_header);
            final LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(0,
                    LinearLayout.LayoutParams.WRAP_CONTENT, 1.0f);
//            layoutParams.setMargins(padding, padding, padding, padding);
            sp.setPadding(padding, padding, padding, padding);
            sp.setLayoutParams(layoutParams);
            return sp;

        }


        private TextView createTextView() {
            final LinearLayout.LayoutParams lparams = new LinearLayout.LayoutParams(dip2pix(itemView.getContext(), 120), LinearLayout.LayoutParams.WRAP_CONTENT);
            final TextView textView = new TextView(itemView.getContext());
            textView.setLayoutParams(lparams);
            return textView;
        }

        private EditText createEditText() {
            final LinearLayout.LayoutParams lparams = new LinearLayout.LayoutParams(0, LinearLayout.LayoutParams.WRAP_CONTENT, 1.0f);
            final EditText editText = new EditText(itemView.getContext());
            editText.setLayoutParams(lparams);
            ViewCompat.setBackground(editText,
                    ContextCompat.getDrawable(itemView.getContext(), com.safarayaneh.map.R.drawable.bg_round));
            editText.getBackground().setColorFilter(ContextCompat.getColor(itemView.getContext(),
                    com.safarayaneh.map.R.color.md_indigo_100), PorterDuff.Mode.SRC_ATOP);
            return editText;
        }
    }
}

Когда я запускаю приложение и когда данных достаточно для просмотра на одной странице, все думают, что все в порядке, но данных больше, чем показано на одной странице, когдая прокручиваю страницу, появляется проблема !!

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

enter image description here

Как вы можете видеть на моих данных изображения и просмотра в верхней части изображения повторяются и выход из2 столбца формы.В чем моя ошибка?

Ответы [ 2 ]

1 голос
/ 16 июня 2019

Вы используете onCreateViewHolder() и onBindViewHolder() неправильно.onCreateViewHolder должен использоваться для создания элементов списка, onBindViewHolder должен использоваться только для заполнения уже созданных представлений данными.Причина в том, что представления, созданные onCreateViewHolder, многократно используются для отображения данных различных элементов (отсюда и название RecyclerView).Если вам нужно создавать разные типы представлений для разных типов данных, вам нужно реализовать getItemViewType().Тогда процесс выглядит так:

Сначала вызывается ваш метод getItemViewType (), и в зависимости от заданной позиции вы возвращаете нужный тип.Если уже существует представление этого типа, которое можно использовать повторно, ваш метод onBindViewHolder () вызывается непосредственно с этим представлением и позицией.В противном случае ваш метод onCreateViewHolder () вызывается и создает новый экземпляр представления, необходимого для этого типа.После этого снова вызывается onBindViewHolder () с созданным видом и позицией.

Итак, повторюсь - onCreateViewHolder () предназначен для создания представлений, а onBindViewHolder () предназначен для привязки данных (т. Е. Для установки текста и т. Д.)..) к уже созданному виду.

0 голосов
/ 17 июня 2019

Ridcully правильно, и я мог бы создать 2 представления и изменить его путем реализации метода getItemViewType (). Однако в моем сценарии я изменил метод onBindViewHolder на этот:

@Override
public void onBindViewHolder(@NonNull GridHolder holder, int position) {
    holder.parent.removeAllViews();
    DataGridColumn column = this.column.get(position);
    holder.setPosition(holder, position);
}

теперь все хорошо. holder.parent.removeAllViews(); удалить вид, созданный ранее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...