2016-06-19 2 views
3

너무 혼란 스럽습니다. 내가 그물에 대한 몇 가지 제안을 발견했지만이 코드에 그것을 구현할 수 없습니다. 여기 내 문제가있다. 스크롤 할 때마다 목록보기의 순서가 엉망입니다. 나는 무엇을해야할지 모른다. 정말 도움이 필요해. 나는 너의 친절을 진심으로 감사 할 것이다. 여기에 내 코드입니다 :이다 "newView"보다 더 많은 것이 분명 once.To "의 Bindview"에서 사용할 수있는 "newView"에서 이미 인스턴스화보기를 의미스크롤하면 ListViewAdapter가 CursorAdapter 순서를 확장합니다.

견해는 여러 번 사용할 수 있습니다 안드로이드에서
public class ListViewAdapterMeasurement extends CursorAdapter { 
    TextView lblContent, lblDate; 
    DBHelper dbHelper; 
    Button btnSelect; 

    public ListViewAdapterMeasurement(Context context, Cursor c) { 
     super(context, c, FLAG_REGISTER_CONTENT_OBSERVER); 
    } 

    @Override 
    public View newView(Context context, Cursor cursor, ViewGroup parent) { 
     View view = LayoutInflater.from(context).inflate(R.layout.details_feed, parent, false); 

     lblContent = (TextView) view.findViewById(R.id.lblContent); 
     lblDate = (TextView) view.findViewById(R.id.lblDate); 

     return view; 
    } 

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

     View convertView = view; 
     if (convertView == null) 
     { 
      LayoutInflater vi = (LayoutInflater) getApplicationContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      view = vi.inflate(R.layout.details_feed, null); 
     } 

     dbHelper = new DBHelper(getApplicationContext()); 

     int intContentIndex = cursor.getColumnIndex((Tables.FeedTable.COLUMN_CONTENT)); 
     String strContentIndex = cursor.getString(intContentIndex); 
     int intDateIndex = cursor.getColumnIndex((Tables.FeedTable.COLUMN_DATE)); 
     String strDateIndex = cursor.getString(intDateIndex); 

     lblContent.setText(strContentIndex); 
     lblDate.setText(strDateIndex); 


    } 
} 
+2

어댑터는 모든 뷰에 사용됩니다! ui 구성 요소를 멤버 변수로 사용하지 말고 bindView 메소드에서이를 조회하십시오. –

+0

@HenningLuther는 newView에서 초기화를 제거하고 bindView 메소드로 전송해야 함을 의미합니까? –

+1

그냥 newView : 반환 LayoutInflater.from (컨텍스트) .inflate (R.layout.details_feed, 부모, 거짓); in bindView : TextView lblContent = (TextView) view.findViewById (R.id.lblContent); TextView lblDate = (TextView) view.findViewById (R.id.lblDate); –

답변

2

, "bindView"보다 자주 호출되지는 않습니다 (< =). 그 때문에 "newView"에 상태를 저장하는 것은 할 수있는 일이 아닙니다. "newView"에서는이 어댑터에서 인스턴스화 된 모든 뷰에 대해 "bindView"에서 조작되지 않은 속성 만 조작 할 수 있습니다. 재사용 뷰가 나타날 수 있기 때문에 각 행 (또는 항목)에 대한 모든 동적 값은 "bindView"에서 설정됩니다. 행 또는 항목의 단일 내부보기를 어댑터에 저장하면 예기치 않은 동작이 발생하고 수행 할 수 없습니다. 이것이 당신 문제입니다. "new-view"는 "view-object-pool"에 이미 인스턴스화되고 프리 (표시/재사용 할 수없는) 뷰가 없을 때 호출됩니다. 또한 이미 채워진 뷰가 여기에오고 특정 상황에서 특정 행/항목에 대한 속성이 설정되지 않은 상태로 유지되는 경우 "bindView"의 특정 하위 뷰를 재설정해야합니다. 마지막으로 : 주어진 뷰가 "bindView"에서 새로 생성되거나 재활용 된 뷰인지 알 수 없습니다. 희망하는 것들을 분명히해라. 해피 코딩

+0

아주 잘했다. 고맙습니다! –

2

코드의 주된 문제는 lblContentlblDate이 어댑터의 구성원이며 newView()이 호출 될 때마다 무시된다는 것입니다. 대신, 각 View에 대해이 변수 쌍을 저장하고 newView()에 인스턴스화하고 bindView()에 사용해야합니다.

이를 달성하기 위해 소위 ViewHolder pattern을 사용할 수 있습니다. 이 패턴 뒤에 일반적인 아이디어는 아래 코드에서 볼 수있다 (원래의 코드를 기반으로,하지만 난 그것을 테스트하지 않았다) :

public class ListViewAdapterMeasurement extends CursorAdapter { 

    /** 
    * One instance of this class will be attached to each View in order to prevent 
    * repeated calls to findViewById() 
    */ 
    private static class ViewHolder { 
     private TextView lblContent; 
     private TextView lblDate; 

     public ViewHolder(TextView content, TextView date) { 
      lblContent = content; 
      lblDate = date; 
     } 

    } 


    DBHelper dbHelper; 

    public ListViewAdapterMeasurement(Context context, Cursor c) { 
     super(context, c, FLAG_REGISTER_CONTENT_OBSERVER); 
    } 

    @Override 
    public View newView(Context context, Cursor cursor, ViewGroup parent) { 
     View view = LayoutInflater.from(context).inflate(R.layout.details_feed, parent, false); 

     TextView lblContent = (TextView) view.findViewById(R.id.lblContent); 
     TextView lblDate = (TextView) view.findViewById(R.id.lblDate); 

     ViewHolder viewHolder = new ViewHolder(lblContent, lblDate); // put references to sub-Views into ViewHolder 

     view.setTag(viewHolder); // attach ViewHolder to each newly created View 

     return view; 
    } 

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

     dbHelper = new DBHelper(getApplicationContext()); 

     int intContentIndex = cursor.getColumnIndex((Tables.FeedTable.COLUMN_CONTENT)); 
     String strContentIndex = cursor.getString(intContentIndex); 
     int intDateIndex = cursor.getColumnIndex((Tables.FeedTable.COLUMN_DATE)); 
     String strDateIndex = cursor.getString(intDateIndex); 

     ViewHolder viewHolder = (ViewHolder) view.getTag(); // retrieve View's ViewHolder 

     viewHolder.lblContent.setText(strContentIndex); 
     viewHolder.lblDate.setText(strDateIndex); 
    } 

} 
+0

도와 주셔서 감사합니다. :) –