0

ViewView를 사용하여 ListView를 부드럽게 만들려고했지만 충돌이 계속 발생합니다. 나는 3 가지 유형의 해결책을 시도했다. 화면이 열리고 적재 표시가 나타나지만 잠시 후 (약 3-5 초) 충돌합니다. URL에서 이미지를로드하려면 Universal-Image-Loader lib by nostra13을 사용하십시오. ViewHolder를 추가하지 않고도 모두 제대로 작동했습니다. 어댑터 클래스ListView 어댑터의 ViewHolder가 작동하지 않습니다.

내 로그 캣과의 getView + ViewHolder :

AnimalAdapter.java에서
01-30 17:01:53.713: E/AndroidRuntime(12702): FATAL EXCEPTION: main 
01-30 17:01:53.713: E/AndroidRuntime(12702): java.lang.NullPointerException 
01-30 17:01:53.713: E/AndroidRuntime(12702): at com.example.animalist.AnimalAdapter$1.onLoadingComplete(AnimalAdapter.java:123) 
01-30 17:01:53.713: E/AndroidRuntime(12702): at com.nostra13.universalimageloader.core.DisplayBitmapTask.run(DisplayBitmapTask.java:74) 
01-30 17:01:53.713: E/AndroidRuntime(12702): at android.os.Handler.handleCallback(Handler.java:587) 
01-30 17:01:53.713: E/AndroidRuntime(12702): at android.os.Handler.dispatchMessage(Handler.java:92) 
01-30 17:01:53.713: E/AndroidRuntime(12702): at android.os.Looper.loop(Looper.java:143) 
01-30 17:01:53.713: E/AndroidRuntime(12702): at android.app.ActivityThread.main(ActivityThread.java:4263) 
01-30 17:01:53.713: E/AndroidRuntime(12702): at java.lang.reflect.Method.invokeNative(Native Method) 
01-30 17:01:53.713: E/AndroidRuntime(12702): at java.lang.reflect.Method.invoke(Method.java:507) 
01-30 17:01:53.713: E/AndroidRuntime(12702): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) 
01-30 17:01:53.713: E/AndroidRuntime(12702): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) 
01-30 17:01:53.713: E/AndroidRuntime(12702): at dalvik.system.NativeStart.main(Native Method) 
01-30 17:01:57.957: I/wpa_supplicant(15739): Reset vh_switch_counter due to receive LINKSPEED cmd 

로그 캣 -의 getView + ViewHolder

static class ViewHolder{ 
     TextView animalView; 
     TextView areaView; 
     ImageView notfound; 
     ImageView animalPic; 
     ProgressBar indicator; 
    } 


    public View getView(int position, View convertView, ViewGroup parent){ 

     ViewHolder holder = null; 



     if(convertView == null){ 
       LayoutInflater mLayoutInflater = LayoutInflater.from(mContext); 
       convertView = mLayoutInflater.inflate(R.layout.animal_row_item, null); 
       holder = new ViewHolder(); 

      holder.animalView = (TextView) convertView.findViewById(R.id.animal_text); 
       holder.areaView = (TextView) convertView.findViewById(R.id.area_text); 
      holder.notfound = (ImageView) convertView.findViewById(R.id.notfoundimg); 
       holder.animalPic = (ImageView)convertView.findViewById(R.id.animal_pic); 
       holder.indicator = (ProgressBar)convertView.findViewById(R.id.progress); 
       convertView.setTag(holder); 
      } 

     else{ 
      holder = (ViewHolder) convertView.getTag(); 

     } 

      final Animal animal = mAnimals.get(position); 




      holder.notfound.setVisibility(View.INVISIBLE); 
      holder.indicator.setVisibility(View.VISIBLE); 
      holder.animalPic.setVisibility(View.INVISIBLE); 

      //Setup a listener we can use to switch from the loading indicator to the Image once it's ready 
      ImageLoadingListener listener = new ImageLoadingListener(){ 


       ViewHolder holder = null; 
       @Override 
       public void onLoadingStarted(String arg0, View arg1) { 
        // TODO Auto-generated method stub 

       } 

       @Override 
       public void onLoadingCancelled(String arg0, View arg1) { 
        // TODO Auto-generated method stub 

       } 

       @Override 
       public void onLoadingComplete(String arg0, View arg1, Bitmap arg2) { 
        holder.indicator.setVisibility(View.INVISIBLE); 
        holder.animalPic.setVisibility(View.VISIBLE); 
        holder.notfound.setVisibility(View.INVISIBLE); 
       } 

       @Override 
       public void onLoadingFailed(String arg0, View view, FailReason arg2) { 
        holder.notfound.setVisibility(View.VISIBLE); 
        holder.indicator.setVisibility(View.INVISIBLE); 
        holder.animalPic.setVisibility(View.INVISIBLE); 
       } 

      }; 



      imageLoader.displayImage(animal.getImgUrl(), holder.animalPic,options, listener); 
      holder.animalView.setText(animal.getAnimal()); 
      holder.areaView.setText(animal.getArea()); 





      convertView.setOnClickListener(new OnClickListener() { 

       @Override 
       public void onClick(View view) { 

        Intent intent = new Intent(getContext(), MoreActivity.class); 

        intent.putExtra("about", animal.getAbout()); 
        intent.putExtra("animal", animal.getAnimal()); 
        intent.putExtra("imgUrl", animal.getImgUrl()); 
        getContext().startActivity(intent); 
       } 
      }); 

      return convertView; 
     } 

당신이 있습니까 어떤 생각 , 그것을 개선하는 방법? 사전

+0

AnimalAdapter.java 당신의 82th 라인은 무엇입니까 :

---- 편집 ---- 여기

내 어댑터의 getView() 방법의 예를 간다? – nKn

+0

'View vi = convertView;를 제거하고'if (convertView == null) {'및'convertView = mLayoutInflater.inflate (R.layout.animal_row_item, null);' – Raghunandan

+0

감사합니다. . 하지만 나는 다른 (하지만 덜 심각하다고 생각하는) 오류가 발생합니다. 필자의 코드를 업데이트했습니다. – marson

답변

3

사실에

덕분에 스택 트레이스에 당신은

01-30 16:45:09.003: E/AndroidRuntime(12533): at android.widget.ListView.measureHeightOfChildren(ListView.java:1264) 
01-30 16:45:09.003: E/AndroidRuntime(12533): at android.widget.ListView.onMeasure(ListView.java:1127) 

당신이 반환하는 convertView가 null 것을 알 수있다.

두 번째 문제에 대한 ImageLoadingListener의 ViewHolder 인스턴스는 항상 null입니다.

if (vi == null){ 

을하지만 거기에 당신이 있는지 여부를 테스트해야합니다 :

if (convertView == null) { 

변경해보십시오 당신은 내가 당신의 논리가 당신의 getView() 방법, 옳지 않은 생각 테스트 따라

+0

그리고 더 잘 초기화하는 방법을 알고 있습니까? 이제 마침내 내 텍스트 개체를로드하고 이미지를로드 할 때 충돌이 발생합니다. 그래서 문제가 definitly 거기에'getView'의 첫 번째 줄에 – marson

1

그것을 초기화하는데주의를 기울여야한다 그것은이 방법으로 작동해야합니다.

---- 편집 ----

당신이 당신의 ViewHolder이 나에게 좋아 보인다 초기화하는 방법, 그 후에 당신은 각 인스턴스를 할당 괜찮 findViewById()를 통해 View, - 당신은을 얻는 경우 NullPointerException은 가시성을 설정합니다. 즉, 어떤 이유로 findViewById()이 null 객체를 반환했습니다. 즉, 이름이 R.id.progress 인 ID를 찾지 못했습니다 (해당 이름의 레이아웃에 해당 요소가 없을 가능성이 높음).

public static class vhItem { 
    TextView maintext; 
    TextView topictext; 
    ImageView mainimage; 
    TextView users; 
} 

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

    if (convertView == null) { 
    final LayoutInflater inflater = ((Activity) context).getLayoutInflater(); 
    convertView = inflater.inflate(resourceId, parent, false); 

    viewHolder = new vhItem(); 
    viewHolder.maintext = (TextView) convertView.findViewById(R.id.chanlist_chan); 
    viewHolder.topictext = (TextView) convertView.findViewById(R.id.chanlist_topic); 
    viewHolder.mainimage = (ImageView) convertView.findViewById(R.id.chanlist_featured); 
    viewHolder.users = (TextView) convertView.findViewById(R.id.chanlist_usercount); 

    // I've set a contextual menu for each row this way, but it's not required 
    ((Activity) context).registerForContextMenu(convertView); 
    } 
    else 
    viewHolder = (vhItem) convertView.getTag(); 

    viewHolder.maintext.setText((String) getItem(position)); 
    viewHolder.mainimage.setTag(getItem(position)); 
    viewHolder.mainimage.setOnClickListener(new View.OnClickListener() { 
    public void onClick(final View v) { 
     AlertDialog.Builder builder = new AlertDialog.Builder(context); 
     ... 
     dialog.show(); 
    } 
    }); 

    return convertView; 
} 
+0

'는'vi로'converview'를 설정,이 문제가되지 않습니다 –

+0

안녕하세요, 당신의 대답을 많이 주셔서 감사합니다. 하지만 나는 다른 (하지만 덜 심각하다고 생각하는) 오류가 발생합니다. 필자의 코드를 업데이트했습니다. – marson

+0

줄 123은 무엇입니까? – Raghunandan