bindView()
메서드를 사용하면 사용자 정의 CursorAdapter
구현이 구현되어 목록에 텍스트 뷰를 동적으로 추가 할 수 있습니다.커스텀`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);
}
}
는-반복 처리를 다시하기 위해, 나는 커서에 의해 반환 된 행 값의 수를 반영하기 위해 list_item
의 각 인스턴스 당 각 flow_layout
내부 텍스트 뷰의 수를 원한다.
그러나 목록 항목을 다시 스크롤 할 때마다 특정 항목의 텍스트보기 수가 두 배가되고 추가적으로 바인딩 된 데이터가 때때로 커서 위치와 목록 위치 사이에 대칭으로 반영됩니다 목. 문제는 오래된 텍스트보기의 재활용과 관련이 있다고 생각합니다. 새 텍스트보기가 오래된 텍스트 뷰에 스태킹되지 않도록하려면 어떻게해야합니까?
여기에서 사용자 정의 커서 어댑터
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);
}
}
}
이'tv1'에 ID를 설정 한 다음 해당보기 있는지 확인하는'findViewById'를 호출 할 수
TextView tv1 = new TextView();
이 작업을 수행 이전에 추가되었지만 실제로'R.layout.list_item'에'TextView'를 추가하지 않으셨습니까? – pskink
@pskink 감사합니다. 그게 효과가 있었어. 실제로 ID를 설정하고'findViewById'를 사용하려고했지만'createView' 메소드에서'findViewById' 사용을 고려하지 않았습니다 대신'bindView'에서 사용했습니다 ... 차이점은 무엇입니까? –
왜'R.layout.list_item'에'TextView'를 추가하지 않습니까? – pskink