-1

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); 
      } 
     } 
} 
+1

이'tv1'에 ID를 설정 한 다음 해당보기 있는지 확인하는'findViewById'를 호출 할 수

TextView tv1 = new TextView();

이 작업을 수행 이전에 추가되었지만 실제로'R.layout.list_item'에'TextView'를 추가하지 않으셨습니까? – pskink

+0

@pskink 감사합니다. 그게 효과가 있었어. 실제로 ID를 설정하고'findViewById'를 사용하려고했지만'createView' 메소드에서'findViewById' 사용을 고려하지 않았습니다 대신'bindView'에서 사용했습니다 ... 차이점은 무엇입니까? –

+0

왜'R.layout.list_item'에'TextView'를 추가하지 않습니까? – pskink

답변

0

의 전체 implemtation 당신의 LinearLayout 당신이 이미 가지고 TextView을 추가, ID tv1 말할해야합니다.

그리고 대신 :

LinearLayout layout = (LinearLayout) view.findViewById(R.id.linear_layout); 
TextView tv1 = layout.findViewById(R.id.tv1); 
tv1.setText(Title); 
1
if(LinearLayout.getChildCount() > 0) 
     LinearLayout.removeAllViews(); 
+0

대신 getView()를 재정의 할 수도 있습니다. –