2013-03-05 1 views
1

에 보이는 전망을 위해 전달됩니다같은 convertView 인스턴스는 내가 안드로이드에서 사용자 지정 만든 CursorAdapter 파생 클래스에 이상한 문제가 CursorAdapter

내의 getView() 구현 많은 사이트/구글 회담에서 본 바로 교과서. 그러나 다른 위치의 경우 (이 메서드가 호출되는 위치 매개 변수) 인 것처럼 보입니다.이 메서드는 convertView의 동일한 인스턴스를 전달하는 것으로 보입니다.하지만이 메서드는 다른 개체 인스턴스를 참조해야합니다. ListView의 다른 표시 항목과 일치해야하며 표시 가능한 목록 항목의 경우 동일한 객체 인스턴스를 다시 사용해서는 안됩니다 ...

문제가 없는데도 문제가 재현되기 때문에 실제보기를 업데이트하는 실제 부분이 제거되었습니다 그것.

D/DD (27,725)이 코드를 실행

@Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     ViewHolder viewHolder; 

     Log.d("dd", "getView()"); 

     if (convertView == null) { 
      Log.d("d", "convertview is null!"); 

      // create convertView from xml 
      convertView = this.mInflater.inflate(R.layout.catalog_entry, 
        parent, false); 

      // create the viewHolder 
      viewHolder = new ViewHolder(); 

      viewHolder.name = (TextView) convertView 
      .findViewById(R.id.gameName2); 
      viewHolder.image = (ImageView) convertView 
      .findViewById(R.id.gameImage); 

      convertView.setTag(viewHolder); 
     } else { 
      Log.d("dd", "convertview is not null"); 
      viewHolder = (ViewHolder) convertView.getTag(); 
     } 

     LinearLayout thisItem = (LinearLayout) convertView; 
     Log.d("thisItem", 
       "This Item is Index " 
         + position 
         + " " 
         + thisItem.toString() 
         + " " 
         + Integer.toHexString(System.identityHashCode(thisItem)) 
         + "x: " + thisItem.getX() + " y: " + thisItem.getY()); 

     this.cur.moveToPosition((int) (getItemId(position) - 1)); 

     Log.d("dd", "End of getView()"); 
     return convertView; 
    } 

이 출력을 생성의 getView() D/D (27,725)가 null convertview! 이 항목은 인덱스입니다. [email protected] 40fb5f70x : 0.0 y : 0.0 D/dd
(27725) : getView()의 끝 D/dd (27725) : getView) D/DD
은 (27,725)는 : convertview은/thisItem은 (27,725)는 널 D되지 : 0.0 Y : 0.0 D/DD
(27,725) 최종 제품의 [email protected] 40fb5f70x 인덱스 1 D/dd (27725) : getView() D/dd
(27725) : convertview는 null이 아닙니다.이 항목은 인덱스입니다. 2 [email protected] 40fb5f70x : 0.0 y : 0.0 D/dd
(27725) : getView()의 끝 D/dd (27725) : getView() D/dd,453,210 (27725)는 0.0, Y : 0.0 D/DD
(27,725)의 getView 끝()이 항목 40fb5f70x 인덱스 3 [email protected]이다 convertview은/thisItem은 (27,725)가 널 D 아니다 D/dd (27725) :이 항목은 인덱스입니다 4 [email protected] 40fb5f70x : 0.0 y : 0.0 D이 항목은 인덱스입니다. D/dd (27725) : getView() D/dd
(27725) d/dd
(27725) : getView()의 끝 D/dd (27725) : getView() D/dd
(27725) : convertview가 null이 아님이 항목은 색인입니다 0 android .widget.LinearLayout @ 40fb5f70 40fb5f70x : 0.0 y : 0.0 D/dd
(27725) : getView()의 끝 D/dd (277) 25) : getView() D/d
(27725) : convertview가 null입니다! D/dd (27725) :이 항목은 인덱스 1 [email protected] 40fb89f8x : 0.0 y : 0.0 D/dd
(27725) : getView()의 끝 D/dd (27725) : getView() D/d
(27725) : convertview is null! D/dd (27725) :이 항목은 인덱스입니다. [email protected] 40fb9c48x : 0.0 y : 0.0 D/dd
(27725) : getView()의 끝 D/dd (27725) : getView() D/d
(27725) : convertview is null! D/dd (27725) :이 항목은 인덱스입니다. [email protected] 40fbae98x : 0.0 y : 0.0 D/dd
(27725) : getView()의 끝 D/dd (27725) : getView() D/d
(27725) : convertview is null! D/thisItem (27725) :이 아이템은 인덱스입니다. [email protected] 40fbc0e8x : 0.0 y : 0.0 D/DD
(27,725)의 getView()의 최종

각 위치 (0-4)에 대해, 동일한 뷰 객체 해시가 전송되고 있음을 처음으로 알 수 ...

+0

(. 인용 블록은 줄 바꿈을 존중하지 않기 때문에, 코드 블록에서 스택 추적을 게시하시기 바랍니다)의 ListView 자주 특히'wrap_content'를 높이로 사용한다면, 레이아웃을 그리기 전에'getView()'를 여러 번 호출하십시오. – Sam

+0

그들은 한 번 생성 된 convertView를 전달하면서 getView를 여러 번 호출합니까? 심지어 다른 데이터 위치? –

+0

또한 getView()의 목적은 특정 목록보기 항목에 대한보기를 만드는 것입니다. 이 항목을 일부 이미지/텍스트/등으로 채우는 경우 특정 항목별로 여러 번 호출 될 수 있다는 사실에 어떻게 대처할 수 있습니까? –

답변

4

요약하면 ListView의 높이를 match_parent 또는 고정 높이로 설정하십시오.

ListView가 getView()을 "마른 실행"방식으로 호출하는 이유는 많습니다. 가장 많이 사용되는 이유는 wrap_content을 ListView의 높이로 사용했기 때문입니다. Android는 wrap_content의 높이를 계산하기 위해 일련의 행을 팽창해야하지만 아직 사용할 수 없기 때문에 실제 데이터를 사용할 수 없습니다. 따라서 어댑터는 가장 좋은 추측을 던졌습니다.. 나중에 레이아웃이 실제 데이터로 (다시) 생성되므로 각 행이 두 번 생성되는 것을 볼 수 있습니다.

는 또한 CursorAdapter 해당 행 자체를 유지해야한다, 당신은이 줄을 필요가 없습니다

this.cur.moveToPosition((int)(getItemId(position) - 1)); 
+0

정말 고마워! –

1

보기가 Convertview에 의해 재사용되는 것이 맞습니다. Convertview 부분을 모두 삭제할 수 있으며 원하지 않는보기를 재사용하지 않으며 원하는 결과를 얻을 수 있습니다 (일부 성능 ...).