-1

これが私の状況です。
私が持っているもの:右上とカスタム要素のリストの下にチェックボックス(「checkAll」と呼ばれる)があるアクティビティ:TextViewとチェックボックス。
私が欲しいもの:checkAllをクリックすると、リスト内の各項目のすべてのチェックボックスがオンになります。
問題:リストのすべての項目が画面に表示されている場合にのみ、すべてが正常に機能します。多くの要素(たとえば20)を含むリストがある場合、checkAll myappCrashをクリックすると。LogCatは私に言います:行のNullPointerException

      CheckBox checkBoxInTheItemList = (CheckBox)
                  mList.getChildAt(i).findViewById(R.id.checkBox);


これは私の機能です:

    @Override
    public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.list_layout_select_friend);  
    checkAll =(CheckBox)findViewById(R.id.checkBoxAll);       
    checkAll.setOnClickListener(new OnClickListener() { 
       @Override
       public void onClick(View arg0) {
          if((checkAll.isChecked())){
           for(int i=1;i<peopleSize;i++){//for each element of my array of Person
             mList=(ListView) findViewById(R.id.list); //This is the id of my List
                                                 //in the list_layout_select_friend
              CheckBox checkBoxInTheItemList = (CheckBox)
              mList.getChildAt(i).findViewById(R.id.checkBox);  //i try to get 
                             //for each item of the List the relative checkBox.                     
        checkBoxInTheItemList.setChecked(true);//Now i checked the checkBox
          }
     }          
    }
    });

}

編集:これは私のアダプタであり、メソッドgetViewもあります

public class NewQAAdapterSelectFriends extends BaseAdapter {
private LayoutInflater mInflater;
private Person[] data;

public NewQAAdapterSelectFriends(Context context) { 
    mInflater = LayoutInflater.from(context);
}

public void setData(Person[] data) {
    this.data = data;
}

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

@Override
public Object getItem(int item) {
    return data[item];
}

@Override
public long getItemId(int position) {
    return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
    if (convertView == null) {
        convertView = mInflater.inflate(R.layout.item_select_friends, null);
        final ViewHolder viewHolder = new ViewHolder();
        viewHolder.nameText=(TextView) convertView.findViewById(R.id.personName);
        viewHolder.surnameText=(TextView) convertView.findViewById(R.id.personSurname);
        viewHolder.contactImage=(ImageView) convertView.findViewById(R.id.personImage);
        viewHolder.checkBox=(CheckBox)convertView.findViewById(R.id.checkBox);
        convertView.setTag(viewHolder);
        viewHolder.nameText.setTag(viewHolder.nameText);
        viewHolder.nameText.setTag(viewHolder.surnameText);
        viewHolder.contactImage.setTag(data[position]);
        viewHolder.checkBox.setTag(data[position]);// is correct this line??????


    } else {


    }

     ViewHolder holder = (ViewHolder) convertView.getTag();
     holder.nameText.setText(data[position].getName());
     holder.surnameText.setText(data[position].getSurname());
     holder.contactImage.setImageResource(data[position].getPhotoRes());
     holder.contactImage.setScaleType(ScaleType.FIT_XY);
     //here i have to write something for the checkbox, right?
     return convertView;
}

static class ViewHolder {
    TextView nameText;
    TextView surnameText;
    ImageView contactImage;
    CheckBox checkBox;
}

この問題を回避するにはどうすればよいですか?非表示の要素を持つ大きなリストのすべてのチェックボックスをオンにするにはどうすればよいですか?

4

1 に答える 1

1

これを実装するには、ListViewがどのように機能するか、つまりビューのリサイクルについて理解する必要があります。Androidでリストを作成すると、ビューが動的に作成されます。上下にスクロールすると、画面から消えたリストアイテムのビューでデータが消去され、次のアイテムの情報が再入力される必要があります。これはgetView、リストアダプターのメソッドで発生します(ちなみに、 、投稿するのに非常に役立ちます)。これがNullPointerExceptionの理由だと思います。ThegetChildAt他のアイテムは現在存在しないため、メソッドは表示されているリストアイテムのみを返すことができます。最初に表示されるアイテムはインデックス0になります。したがって、リストに20個のアイテムが含まれていても、5個しか表示されない場合、getChildAtによって返されるのは5個のみであり、範囲外のビューを要求すると、この例外が発生する可能性があります。

私があなたのアイテムにアプローチする方法は、あなたのリストアイテムとチェックボックスの状態の記録を保持するデータ構造を持つことです。この非常に単純な例は、ブール値の配列です。ここで、true / false値は、ボックスがチェックされている場合に対応します。がgetView()呼び出されると、position引数a yourを配列のインデックスとして使用し、これに基づいてチェックボックスをオンまたはオフにすることができます。(ビューを適切にリサイクルしている場合は、とにかくこのようなことを行う必要があります)[すべてチェック]ボタンが押された場合は、配列の各要素をtrueにします。

あなたを助けるためのいくつかのサンプルコード。

private boolean[] isCheckedArray; //Maintains the checked state of your 

... //At some point, probably onCreate or whenever you get your data, initialize your array. If nothing every starts checked off, initialize the whole array to false

checkAll.setOnClickListener(new OnClickListener() { 
   @Override
   public void onClick(View arg0){
       for(int i=1;i<peopleSize;i++)
             isCheckedArray[i] = true;      
   }
});

...
//And finally, in your getView function
@Override
public View getView(int position, View convertView, ViewGroup parent)
{
     ...
     myCheckBox.setChecked(isCheckedArray[position])
     ...
}

お役に立てれば。Androidでのリサイクルは重要な概念であり、適切に処理することで多くの時間と将来の頭痛の種を節約できるので、私は間違いなくAndroidでのリサイクルを検討したいと思います。幸運を。

于 2012-07-03T22:18:46.733 に答える