2011-12-08 4 views
1

Android 마켓에 Android 마켓이 있습니다. 그리고 어떤 사용자가 NullPointerException을 얻는다 고 주장하는 충돌 보고서가 계속 나오고 있습니다.때때로 (보기)에서 null이 표시됩니다 .findViewByID

이 문제를 일으키는 것으로 보이는 코드를 찾았습니다.

ArrayAdapters getView 메소드에 있습니다.

if (v == null) { 
       LayoutInflater vi = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
       v = vi.inflate(R.layout.subcatategory_row, null); 
       holder = new ViewHolder(); 
       v.setTag(holder); 
      } 
      else { 
       holder=(ViewHolder)v.getTag(); 

       if(holder == null){ 
        holder = new ViewHolder(); 

       } 
      } 



      TextView tl = (TextView) v.findViewById(R.id.label); 

      tl.setTextAppearance(getContext(), R.style.styleA); 

이 스 니펫의 마지막 줄이 크래시를 유발하는 것 같습니다. 그러나 나는 그것을 결코 경험하지 못했고 여러 장치에서 테스트 해왔다.

도움을 주시면 대단히 감사하겠습니다!

는 편집 :

subcategory_row.xml 당신은 당신의 ViewHolder 개체 여기

내부의 TextView를 저장해야

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/row_layout" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:padding="0dip" 
    android:background="@drawable/background" 
    android:weightSum="80"> 

    <TextView 
     android:id="@+id/label" 
     android:layout_weight="9" 
     android:layout_width="0dip" 
     android:layout_height="fill_parent" 
     android:layout_marginRight="6dip" 
     android:gravity="center_vertical|center" 
     android:text="C.r" 
     android:textSize="12sp" 
     android:textColor="@color/default_textcolor" 
     /> 

    <LinearLayout 
     android:orientation="vertical" 
     android:layout_width="0dip" 
     android:layout_weight="53" 
     android:layout_height="fill_parent"> 
     <TextView 
      android:id="@+id/text_bb" 
      android:layout_width="fill_parent" 
      android:layout_height="0dip" 
      android:layout_weight="1" 
      android:layout_marginLeft="4dip" 
      android:gravity="bottom" 
      android:textSize="13sp" 
      android:textColor="@color/default_textcolor" 

     android:ellipsize="end" android:singleLine="true"/> 
     <TextView 
      android:id="@+id/text_ba" 
      android:layout_width="fill_parent" 
      android:layout_height="0dip" 
      android:layout_weight="1" 
      android:layout_marginLeft="4dip" 
      android:gravity="top" 
      android:textSize="13sp" 
      android:textColor="@color/default_textcolor" 
     android:ellipsize="end" android:singleLine="true"/> 
    </LinearLayout> 

    <LinearLayout 
     android:orientation="vertical" 
     android:layout_width="0dip" 
     android:layout_weight="8" 
     android:layout_height="fill_parent" 
     > 
     <TextView 
      android:id="@+id/text_a" 
      android:layout_width="fill_parent" 
      android:layout_height="0dip" 
      android:layout_weight="1" 
      android:gravity="bottom|right" 
      android:textSize="13sp" 
      android:text="0" 
      android:textColor="@color/default_textcolor" 
     /> 
     <TextView 
      android:id="@+id/text_b" 
      android:layout_width="fill_parent" 
      android:layout_height="0dip" 
      android:layout_weight="1" 
      android:gravity="top|right" 
      android:textSize="19sp" 
      android:text="0" 
      android:textColor="@color/default_textcolor" 
     /> 
    </LinearLayout> 


    <LinearLayout 
     android:layout_width="0dip" 
     android:layout_height="wrap_content" 
     android:layout_gravity="center_vertical|right" 
     android:layout_weight="10" 
     android:orientation="vertical" 
     android:paddingLeft="10dp" > 

     <ImageView 
      android:id="@+id/arrow" 
      android:layout_width="wrap_content" 
      android:layout_height="40dp" 
      android:paddingLeft="-10dip" 
      android:paddingRight="10dip" 
      android:src="@drawable/arrow" 
      android:visibility="visible" /> 

    </LinearLayout> 

</LinearLayout> 
+0

레이아웃 subcatategory_row을 (를) psot 할 수 있습니까? – Sephy

답변

1

I을 사용했습니다 무언가의 예 게시 된 앱에서도이 문제가 발생했습니다. 많은 영혼을 검색 한 후에 두 가지 방법으로 그것을 재현했습니다!

이유 1) null 인 이유는 할당 할 메모리가 없었기 때문입니다. 더 많은 코드를 작성하고 종료해야했습니다.

이유 2) 일부 경우 Dalvik은 내가 그것을 사용하지 않고 그것을 할당 해제했다고 확신했습니다. 나는 코드가 Dalvik의 눈에서 "함께 묶여"있는지 확인하기 위해 코드를 변경해야했습니다. 10 명 중

그러나 9 번,이 문제는 당신이 다른 사람들이 물건의 모든 종류가 동시에 실행 한 테스트 장치를 사용하고 당신이 그것을 재현 할 수 있다는 것입니다

이유 1.이었다.

+0

고마워요! 1) null 인 경우 응용 프로그램을 종료합니까? 2) 어떻게 함께 연결합니까? 아래의 답변에 설명 된대로 viewHolder를 사용합니까? – johan

+0

당신은 그것을 감쌀해야합니다. dalvik을 멀리 두지 만 그 예는 여전히 RAM 부족으로 실패합니다. 토스트 메시지를 작성하고 닫습니다. – Chris

1

내가

class DataObjectContainer { 
    TextView title; 
} 

public View getView(final Activity activity, View convertView, ViewGroup parent) { 

    final DataObjectContainer container; 

    if (convertView == null) { 
     convertView = (LinearLayout) activity.getLayoutInflater().inflate(R.layout.dataobjectitem, null); 

     container = new DataObjectContainer(); 

     container.title = (TextView) convertView.findViewById(R.id.textview_title); 

     convertView.setTag(container); 

    } else { 
     container = ((DataObjectContainer) convertView.getTag()); 
    } 

    container.title.setText(getValueString(DataObject.Table.NAME)); 

    return convertView; 

} 
+0

당신의 의견을 들어 주셔서 감사합니다. 이벤트 작업이 될 수도 있습니다. 하지만 내 솔루션이 작동하지 않는 이유는 무엇입니까 ?? – johan

+0

코드가 작동하지 않는 이유를 확실히 말할 수 없습니다. 한가지 주목할 점은'ViewHolder' 객체로 아무 일도하지 않는다는 것입니다. 위의 코드는 어댑터 작업과 관련하여 시간외 근무로 발견 한 많은 예제를 기반으로합니다. – jawsware

+0

그게 사실이 아닙니다. 항목을 두 드릴 때보기 소유자의 콘텐츠를 사용합니다. 단지 그 코드를 포함하지 않았다 :) – johan