2012-02-10 1 views
0

..アンドロイド - リストビューのスクロールにNullPointerExceptionが私のカスタムリストビューを持ついくつかの問題を持って

各ビューをスクロールダウンした後に見ることができるビューを除いて、正常に動作しますクリックでリスナーを持っている、それはNullPointerExceptionがスローされますこれらのいずれかをクリックします。

これらのビューは、実際にスクロールする前に見ることができる場合には機能するので、少し混乱します。

カスタムリストビューのための私のコードを以下に示します。

public class UserListView extends ArrayAdapter<User>{ 
int resource; 
Context context; 
String response; 

public UserListView(Context context, int resource, List<User> users){ 
    super(context,resource,users); 
    this.resource=resource; 
} 

public View getView(int position, View convertView, ViewGroup parent){ 
    LinearLayout userView; 
    User user = getItem(position); 

    userView = new LinearLayout(getContext()); 
    String inflater = Context.LAYOUT_INFLATER_SERVICE; 
    LayoutInflater layoutInflate; 
    layoutInflate = (LayoutInflater)getContext().getSystemService(inflater); 
    layoutInflate.inflate(resource, userView, true); 

    TextView name = (TextView) userView.findViewById(R.id.name); 
    RatingBar userRating = (RatingBar) userView.findViewById(R.id.userRatingBar); 
    name.setText(String.valueOf(user.getName())); 

    float percentageNumber = ((float) user.getTotalQuestionsCorrect()/(float) user.getTotalQuestionsAnswered()) * 100; 
    int percentage = (int)percentageNumber; 
    setStars(userRating, percentage); 
    userView.setId(user.getUserId()); 
    return userView; 
} 


private void setStars(RatingBar rb, int percent){ 
    RatingBar starRating = rb; 
    int percentage = percent; 

    if(percentage <= 5){starRating.setRating(0);} 
    else if(percentage < 25){starRating.setRating(1);} 
    else if(percentage >= 25 && percentage < 50){starRating.setRating(2);} 
    else if(percentage >= 50 && percentage < 75){starRating.setRating(3);} 
    else if(percentage >= 75 && percentage < 100){starRating.setRating(4);} 
    else{starRating.setRating(5);} 
} 

}

すべてのヘルプは理解されるであろう:)おかげで、あなたのgetViewメソッドで起こっている奇妙なものがたくさんあります

答えて

1

() 方法。私はそれが問題だとは思っていませんが、試してみる価値があります。最初に、convertViewはリサイクル可能なビューであり、リスト内のすべてのアイテムについて新しいビューを持たないようにすることができます。もう1つは、親がgetView()メソッドに渡されたときに親ビューとして動作するようにLinearLayoutを作成することです。 3番目の奇妙なことは、ビューを拡張する必要があるたびにLayoutInflatorを取得していることです。あなたは実際にコンストラクタで一度それを取得し、それを保持する必要があります。

public View getView(int position, View convertView, ViewGroup parent){ 
    User user = getItem(position); 
    if(convertView == null) 
    { 
     convertView = layoutInflate.inflate(resource, parent, false); 
    } 

    TextView name = (TextView) convertView.findViewById(R.id.name); 
    RatingBar userRating = (RatingBar) convertView.findViewById(R.id.userRatingBar); 
    name.setText(String.valueOf(user.getName())); 

    float percentageNumber = ((float) user.getTotalQuestionsCorrect()/(float) user.getTotalQuestionsAnswered()) * 100; 
    int percentage = (int)percentageNumber; 
    setStars(userRating, percentage); 
    convertView.setId(user.getUserId()); 
    return convertView; 
} 
+0

こんにちはCaseyB、それが働いてしまったが、それは私には、getChildAtを使用してではなく、getItemAtPositionた私の主な活動の中から問題だったが判明し、まだ、あなたの説明は非常に有用だった:) – Draynaa

0

オーバーライド同様にgetCount()方法とリストの長さを返します。これを試してみてください。

public class UserListView extends ArrayAdapter<User>{ 
    int resource; 
    Context context; 
    String response; 
    List<User> users; 

    public UserListView(Context context, int resource, List<User> users){ 
     super(context,resource,users); 
     this.resource=resource; 
     this.users =users 
     } 

    @Override 
    public int getCount() { 
     return users.length; 

     } 

    } 
関連する問題