Динамически добавляемые представления в адаптере курсора, накладываемые друг на друга

#android #android-cursoradapter

#Android #android-cursoradapter

Вопрос:

Я использую bindView() метод — это пользовательская CursorAdapter реализация для динамического добавления текстовых представлений в список.

Каждый элемент списка представлен list_item макетом, который содержит flow_layout макет из Android Flowlayout

 <!--List Item Layout-->
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:background="#FFFFFF">

    <!--Flow Layout-->
    <org.apmem.tools.layouts.FlowLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_marginBottom="@dimen/view_padding"
        android:paddingLeft="@dimen/activity_horizontal_margin"
        android:paddingRight="@dimen/activity_horizontal_margin"
        android:id="@ id/hash_tag_layout"
        >
    </org.apmem.tools.layouts.FlowLayout>

</LinearLayout>
  

Количество текстовых представлений, добавленных для flow_layout каждого экземпляра list item , отражает количество значений строк, возвращаемых курсором.

 public void bindView(View view, Context context, Cursor cursor) {

    // Flow layout wraps new views around the screen.
    FlowLayout flowLayout = (FlowLayout) view.findViewById(R.id.flow_Layout);

    // getRowValues() puts row values from cursor into an array list.
    ArrayList<> rowValues = getRowValues(cursor);

    // A new text view is created and inserted into Flow layout
    // for each value in rowValues 
    TextView tv;
    for value in rowValues {
        tv = = new TextView(ctx);
        tv.setText(value);
        flowLayout.addView(tv); 
    }

}
  

Для повторной итерации я хочу, чтобы количество текстовых представлений внутри каждого flow_layout для каждого экземпляра list_item отражало количество значений строк, возвращаемых курсором.

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

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

Вот полная реализация пользовательского адаптера курсора

 public class DatabaseAdapter extends CursorAdapter {

        Context ctx;

        public DatabaseAdapter(Context context, Cursor cursor, int flags) {

            super(context, cursor, 0);
            ctx = context;
        }

        public View newView(Context context, Cursor cursor, ViewGroup parent) {

            View v = LayoutInflater.from(context).inflate(R.layout.list_item, parent, false);
            return v;
        }

        public void bindView(View view, Context context, Cursor cursor) {

            // Flow layout wraps new views around the screen.
            FlowLayout flowLayout = (FlowLayout) view.findViewById(R.id.flow_Layout);

            // getRowValues() puts row values from cursor into an array list.
            ArrayList<> rowValues = getRowValues(cursor);

            // A new text view is created and inserted into Flow layout
            // for each value in rowValues array list
            TextView tv;
            for value in rowValues {
                tv = = new TextView(ctx);
                tv.setText(value);
                flowLayout.addView(tv); 
            }
        }
}
  

Ответ №1:

 if(flowLayout.getChildCount() > 0)
        flowLayout.removeAllViews();