1

リストビューのすべてのイテンに対してリストビューでチェックボックスを実装しています。問題は、単一のチェックボックスをクリックしてから、クリックされていない他のチェックボックスもランダムにクリックされることです。

public View getView(int position, View convertView, ViewGroup parent) {
            // TODO Auto-generated method stub

            View vi = convertView;
            final int as=position;
            if (convertView == null) { // if it's not recycled, initialize some
                // attributes
                LayoutInflater  inflater = (LayoutInflater) activity
                        .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                vi = inflater.inflate(R.layout.grid_item, null);
                holder = new ViewHolder();

                holder.textheader = (TextView) vi.findViewById(R.id.item1);
                holder.textcpu = (TextView) vi.findViewById(R.id.item2);
                holder.text_modified_date = (TextView) vi.findViewById(R.id.item4);
                holder.text_cpu = (TextView) vi.findViewById(R.id.item3);
                holder.text_checkbox=(CheckBox)vi.findViewById(R.id.checkBox1);
                vi.setTag(holder);

                holder.text_checkbox.setOnClickListener(new OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        if (holder.text_checkbox.isClickable()) {
                            itemChecked.set(as, true);
                            packages=as;
                        } else if (!holder.text_checkbox.isClickable()) {
                            itemChecked.set(as, false);
                        }
                        String packag=app_package.get(as);
                        Log.d("package listttttttttt", packag);
                    }
                });


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


            }
4

3 に答える 3

3

以下のコードを試してください

public View getView(int position, View convertView, ViewGroup parent) {
        // TODO Auto-generated method stub

        View vi = convertView;
        final int as=position;
        if (convertView == null) { // if it's not recycled, initialize some
            // attributes
            LayoutInflater  inflater = (LayoutInflater) activity
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            vi = inflater.inflate(R.layout.grid_item, null);
            holder = new ViewHolder();

            holder.textheader = (TextView) vi.findViewById(R.id.item1);
            holder.textcpu = (TextView) vi.findViewById(R.id.item2);
            holder.text_modified_date = (TextView) vi.findViewById(R.id.item4);
            holder.text_cpu = (TextView) vi.findViewById(R.id.item3);
            holder.text_checkbox=(CheckBox)vi.findViewById(R.id.checkBox1);
            vi.setTag(holder);

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


             holder.text_checkbox.setOnCheckedChangeListener(new OnCheckedChangeListener() 
             {          
              public void onCheckedChanged(CompoundButton buttonView, boolean isChecked)      
                {                                  
                if(isChecked)
                {
                      // do your stuff
                      itemChecked.set(as, true);
                        packages=as;
                }
                else
                {
                      // do your stuff
                      itemChecked.set(as, false);
                }       

        }
    });

if(itemChecked.size() != 0 && itemChecked.get(position))
        holder.text_checkbox.setChecked(true);
    else
        holder.text_checkbox.setChecked(false);
于 2012-08-23T06:27:46.080 に答える
1

問題は、フォーカス可能なアイテムをリストビューと組み合わせて動作させることが許可されていないことですが、これを回避する方法があります。

リストアイテムとしてXMLレイアウトを使用している場合は、チェックボックスのフォーカス可能な属性をfalseに設定します。

android:focusable="false"

これにより、リストアイテムもクリック可能になります。

これで問題が解決することを願っています。どうなるか教えてください。

于 2012-08-23T07:21:04.463 に答える
1

問題は、getView()メソッドがビューを適切に処理しないことです。新しいビューの状態を設定し、リサイクルされたビューの状態を更新する必要があります。さらに、ビューの動作を定義する必要があります。SOには、同様の問題を抱えたスレッドがたくさんあります。これはあなたを助けることができると思います(作業コードが含まれています)。

コードは次のスケルトンのようになります。

public View getView(int position, View convertView, ViewGroup parent) {
    View vi = convertView;
    final int as=position;
    if (convertView == null) { // no view passed, create one
        LayoutInflater  inflater = (LayoutInflater) activity
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        vi = inflater.inflate(R.layout.grid_item, null);
        // Setup the View content
        holder = new ViewHolder();
        holder.textheader = (TextView) vi.findViewById(R.id.item1);
        holder.textcpu = (TextView) vi.findViewById(R.id.item2);
        holder.text_modified_date = (TextView) vi.findViewById(R.id.item4);
        holder.text_cpu = (TextView) vi.findViewById(R.id.item3);
        holder.text_checkbox=(CheckBox)vi.findViewById(R.id.checkBox1);
        // Do your checkbox initial setup here. 
        holder.text_checkbox.setChecked(getBooleanFromPosition(position));
        vi.setTag(holder);
        // Setup the View behavior
         holder.text_checkbox.setOnCheckedChangeListener(new OnCheckedChangeListener() 
         {          
              // Do your stuff here
    });
    } else {
        // Update your View state
        holder = (ViewHolder) vi.getTag();
        holder.text_checkbox.setChecked(getBooleanFromPosition(position));
    }                   

明らかに、チェックボックスの状態をブール配列などのデータ構造に保存し、そのデータ構造を読み取って、特定の位置のチェックボックスがチェックされているかどうかを確認する必要があります (読み取りアクセスgetBooleanFromPositionが想定されているものです)。行う)。そして、そのデータ構造は、View動作を制御するセクションで更新する必要があります。

于 2012-08-23T06:31:00.580 に答える