0

いくつかのチェックボックスを備えたリストビューがあり、配列に保存されているデータに従って自動的にチェックする必要があります。ベースアダプターを拡張する私のカスタムアダプター:

 public class MyAdapter extends BaseAdapter 
    {
        private Context context;

        public SPCMjereAdapter(Context c) 
        {           
            context = c;                    
        }

        public int getCount() {
            return MyArrList.size();
        }

        public Object getItem(int position) {
            return position;
        }

        public long getItemId(int position) {
            return position;
        }

        public int getlistItemsCount()
        {
            return listView.getChildCount();
        }

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

            LayoutInflater inflater = (LayoutInflater) context
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);

            if (convertView == null) {
                convertView = inflater.inflate(R.layout.activity_list_row, null);

            }   
            // ColID
            TextView txtOpis = (TextView) convertView.findViewById(R.id.ColOpis); 
            txtOpis.setText(MyArrList.get(position).get("OpisMjere") +".");

            // ColCode
            TextView txtRbMjere = (TextView) convertView.findViewById(R.id.ColCode);
            txtRbMjere.setText(MyArrList.get(position).get("RbMjere"));


            // ColChk               
            CheckBox Chk = (CheckBox) convertView.findViewById(R.id.ColChk);
            Chk.setTag(MyArrList.get(position).get("RbMjere"));


            return convertView;

        }

    }

そして、これが私がアイテムをチェックする方法です

int k=0;
    int j=0;
    for (j=0; j<numberOfItems; j++)
    {

        LinearLayout itemLayout = (LinearLayout)listView.getChildAt(j); // Find by under LinearLayout
        CheckBox checkbox = (CheckBox)itemLayout.findViewById(R.id.ColChk);

        for (k=0; k<rbmjere.size(); k++)
        {
            if (checkbox.getTag().toString() == rbmjere.get(k).toString())
            {
                checkbox.setChecked(true);
            }
        }   
    }

問題はラインにあります

LinearLayout itemLayout = (LinearLayout)listView.getChildAt(j);

したがって、アイテムをチェックするためにこのコードを呼び出すと、リストビューにはたとえば 3 つのアイテムが表示されますが、コードは 2 つのアイテムしか認識せず、3 つ目のアイテムが欠落しています。すべてのアイテムが表示されていることを検出する方法、またはリストビューのレンダリングが終了したことを検出する方法は?

4

3 に答える 3

0

問題は解決しました。getView() の中で私はこれらの数行を書きました。

for (k=0; k<rbmjere.size(); k++)
            {
                if (Chk.getTag().toString().equals(rbmjere.get(k).toString()))
                {
                    Chk.setChecked(true);

                }
            }   

ヘルプとアイデアのすべてに感謝します。

于 2013-07-29T11:21:13.637 に答える
0

1.アダプターがまだリストビューを設定していない可能性があります

Handler handler = new Handler();        
    handler.postDelayed(new Runnable() {            
        public void run() {
              //your code
              CheckBox checkbox = (CheckBox)listView.getChildAt(j).findViewById(R.id.ColChk);
              //your code
        }
    }, 500);

2.リストビューをスクロールしてインデックスが間違っている可能性があります。この Android ListView y positionを参照してください

于 2013-07-29T09:38:09.213 に答える
0

ベースアダプターまたは次のようなものの代わりにアレイアダプターを使用してみてください。

public class ArrayListAdapter<T> extends ArrayAdapter<T> {



     private List<T> arrayList;

        public ArrayListAdapter(Context context, int layout, List<T> arrayList) {
            super(context, layout);
            this.arrayList = arrayList;
        }

        @Override
        public T getItem(int position) {
            return arrayList.get(position);
        }

        @Override
        public int getCount() {
            return arrayList.size();
        }
    }

アダプターのインスタンスを作成し、listView.setAdapter(arrayAdapter) を設定します。アダプターにリストを提供していないことがわかります。これは、おそらく nullPointerException を取得する理由です

于 2013-07-29T09:18:52.260 に答える