#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();