2013-02-15 3 views
1

사용자 정의 데이터 listViews 및 convertView를 사용하여 사용자 정의 데이터로 채울 수있는 기본 listView를 작성하고 있습니다. 하단에있는 코드 블록에서 포인터 예외가 발생합니다. which has "holder.text1.setText (X);" 문제를 해결하는 이유와 방법을 이해할 수 없습니다. convertView 및 사용자 정의 데이터를 사용하여 작업하는 동안 NullPointerException이 발생했습니다.

package com.example.worksheet2; 

import android.app.ListActivity; 
import android.content.Context; 
import android.os.Bundle; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.ArrayAdapter; 
import android.widget.ImageView; 
import android.widget.TextView; 

public class D extends ListActivity { 

final class DataMap { 
    public String contactName = ""; 
    public int followerCount; 


    public DataMap(String contactName, int followercount) { 
     this.contactName = contactName; 
     this.followerCount = followercount; 
    } 

} 

protected LayoutInflater mLayoutInflater; 
protected Context mContext = this; 

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    setContentView(R.layout.home_list_view); 
    mLayoutInflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

    DataMap[] data = new DataMap[] { 

    new DataMap("Person A", 1), 
    new DataMap("Person B", 6), 
    new DataMap("Person C", 6), 
    new DataMap("Person D", 6), 
    new DataMap("Person E", 6) 

    }; 

    setListAdapter(new listViewAdapter(this, R.layout.home_list_view_list_item, data)); 

} 

class ViewHolder { 
    public ImageView avatar; 
    public TextView text1, text2; 

} 

final class listViewAdapter extends ArrayAdapter<DataMap> { 
    private int layoutResource; 
    public DataMap[] dataObjects; 

    public listViewAdapter(Context context, int resource, DataMap[] objects) { 
     super(context, resource, objects); 
     layoutResource = resource; 
     dataObjects = objects; 
    } 

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

     TextView monkey = (TextView) findViewById(R.id.monkey); 
     ViewHolder holder; 
     if (convertView == null) { 
     convertView=             mLayoutInflater.inflate(layoutResource,  null, false); 
      holder = (ViewHolder) convertView.getTag(); 
      holder = new ViewHolder(); 
      holder.avatar = (ImageView) findViewById(R.id.avatar); 
      holder.text1 = (TextView) findViewById(R.id.title); 
      holder.text2 = (TextView) findViewById(R.id.link); 

      convertView.setTag(holder); 
     } else { 
      holder = (ViewHolder) convertView.getTag(); 
      holder = new ViewHolder(); 


     } 


     DataMap data = dataObjects[position]; 
     holder.text1.setText(data.contactName); 
     holder.text2.setText(data.followerCount); 
     holder.avatar.setImageResource(R.drawable.ic_launcher); 

     return convertView; 
    } 

} 

}

편집 여기

(나는 다른 문에서 텍스트 뷰를 초기화하고 여전히 같은 예외를 던졌다 권장)의 로그는 /입니다 요청 된 스택 추적 :

02-15 17:45:53.181: E/ListView(1006): null 
    02-15 17:45:53.181: E/ListView(1006): java.lang.NullPointerException 
    02-1517:45:53.181:E/ListView(1006):at com.example.worksheet2.D$listViewAdapter.getView(D.java:89)             
02-15 17:45:53.181: E/ListView(1006): at android.widget.AbsListView.obtainView(AbsListView.java:1449) 
02-15 17:45:53.181: E/ListView(1006): at android.widget.ListView.makeAndAddView(ListView.java:1801) 
02-15 17:45:53.181: E/ListView(1006): at android.widget.ListView.fillDown(ListView.java:671) 
02-15 17:45:53.181: E/ListView(1006): at android.widget.ListView.fillFromTop(ListView.java:728) 
+0

스택 트레이스/로그 캣을 나는 이와 비슷한 변화를 제안? –

+0

그것은 예외를 던지고있는 것을 가리키고 있지만 나는 그것을 왜, 어떻게 또는 어떻게 풀어야하는지, 또는 그것을 게시한다는 것을 알지 못했다. – September

+0

나중에 하나, 예. –

답변

4

만의 getView 방법을 보면은 :

그것은 holder.text1처럼 보이는 아무것도 실제로 if 문 밖에서 TextViews으로 텍스트 1, 텍스트 2를 초기화하지 않기 때문에 convertView가 null가 아닌 경우 holder.text2가 null이 될 수 있습니다. 나는 else 코드 블록에서 그것을 고칠 것이다.

다음 번에는 예외의 스택 추적을 통해 예외가 발생하는 행을 정확하게 확인할 수 있습니다.

+0

지금 첫 번째 예외 스택 추적을 게시하고 있습니다. – September

+0

시도했지만 동일한 예외가 throw됩니다. – September

+1

전체 스택 추적을 게시했다고 생각하지 않습니다. 추적에서 예외의 이름을 나열해야합니다. – panoptical

0

listViewAdapter.getView()의 else 블록에 holder.text1, holder.text2 또는 holder.avatar를 설정하지 않았습니다. 다음과 같이

... 
    if (convertView == null) { 
     convertView = mLayoutInflater.inflate(layoutResource,  null, false); 
     holder = (ViewHolder) convertView.getTag(); 
     holder = new ViewHolder(); 

     convertView.setTag(holder); 
    } else { 
     holder = (ViewHolder) convertView.getTag(); 
     holder = new ViewHolder(); 
    } 
    holder.avatar = (ImageView) findViewById(R.id.avatar); 
    holder.text1 = (TextView) findViewById(R.id.title); 
    holder.text2 = (TextView) findViewById(R.id.link); 
    ... 
0

변경 당신의 getView() 메소드 :

TextView monkey = (TextView) findViewById(R.id.monkey); 
     ViewHolder holder; 
     if (convertView == null) { 
     convertView = mLayoutInflater.inflate(layoutResource, null, false); 
      holder = (ViewHolder) convertView.getTag(); 
      holder = new ViewHolder(); 
      holder.avatar = (ImageView) findViewById(R.id.avatar); 
      holder.text1 = (TextView) findViewById(R.id.title); 
      holder.text2 = (TextView) findViewById(R.id.link); 

      convertView.setTag(holder); 

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

     DataMap data = dataObjects[position]; 
     holder.text1.setText(data.contactName); 
     holder.text2.setText(data.followerCount); 
     holder.avatar.setImageResource(R.drawable.ic_launcher);