2014-04-23 6 views
0

확장 가능한 목록보기에서 확인란을 사용하여 작업하고 있습니다. 아이의 모든 견해가 적절하게 정해졌습니다. 문제는 확인란을 선택하면 하위보기가 무작위로 선택된다는 것입니다. 그룹보기 및 자식보기를 확장하는 것처럼 자동으로 선택하면 바인딩이 명확하게 표시되면 태그가 확인란에 제대로 추가되지 않습니다.확장 가능한 목록보기 확인란 사용

enter code here 
      if (row == null) 
    { 
     holder=new ChildHolder(); 
     LayoutInflater infalInflater = (LayoutInflater) this._context 
       .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     row = infalInflater.inflate(R.layout.list_item_msg, null); 
      holder. txtListChild = (TextView)    row.findViewById(R.id.msgtextID); 
      holder.sendnow=(CheckBox)row.findViewById(R.id.sendnowID); 
     list=_listDataChild.get(_listDataHeader.get(groupPosition)).get(childPosition); 
     notifyDataSetChanged(); 


    holder.sendnow.setOnCheckedChangeListener(new OnCheckedChangeListener() { 

     @Override 
     public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
      // TODO Auto-generated method stub 
         // ch.setChecked(buttonView.isChecked()); 
       notifyDataSetChanged(); 
       // getPosition = (Integer) buttonView.getTag(); 

      if(isChecked) 
      { 
       contactsVo childText = (contactsVo) holder.sendnow.getTag(); 
        childText = (contactsVo) getChild(groupPosition, childPosition); 
       childText.setChecked(buttonView.isChecked()); 
       personals=new ArrayList<contactsVo>(); 
       set.add(list.getFileId()); 
       contactsVo obj1=new contactsVo(); 
       obj1.setImeiNo(list.getImeiNo()); 
       obj1.setUserId(list.getUserId()); 
       //obj.add(obj1); 
       personals.add(obj1); 
       Log.e("=================","========================"); 

      }else 
      { 
       Log.e("Uncheked","See it"); 
       set.remove(list.getFileId()); 

      } 
     } 
    }); 
    row.setTag(holder); 
    holder.sendnow.setTag((contactsVo) getChild(groupPosition,childPosition)); 

    }else 
    { 
     row = convertView; 
     ((ChildHolder) row.getTag()).sendnow.setTag((contactsVo) getChild(groupPosition,childPosition)); 
    } 

    try 
    { 
     ChildHolder holder = (ChildHolder)row.getTag(); 
     childText = (contactsVo) getChild(groupPosition,childPosition); 
     holder.txtListChild.setText(childText.getName()); 
    holder.sendnow.setChecked(((contactsVo) getChild(groupPosition,childPosition)).isChecked()); 


    }catch(Exception e) 
    { 
     e.printStackTrace(); 
    } 

답변

0

어댑터에서 변경 한 후 notifyDataSetChanged();으로 전화해야합니다. 그러면 코드가 아래와 같이되어야합니다.

holder=new ChildHolder(); 
    LayoutInflater infalInflater = (LayoutInflater) this._context 
      .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    row = infalInflater.inflate(R.layout.list_item_msg, null); 
     holder. txtListChild = (TextView)    row.findViewById(R.id.msgtextID); 
     holder.sendnow=(CheckBox)row.findViewById(R.id.sendnowID); 
    list=_listDataChild.get(_listDataHeader.get(groupPosition)).get(childPosition); 
    // notifyDataSetChanged(); 


holder.sendnow.setOnCheckedChangeListener(new OnCheckedChangeListener() { 

    @Override 
    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
     // TODO Auto-generated method stub 
        // ch.setChecked(buttonView.isChecked()); 

      // getPosition = (Integer) buttonView.getTag(); 

     if(isChecked) 
     { 
      contactsVo childText = (contactsVo) holder.sendnow.getTag(); 
       childText = (contactsVo) getChild(groupPosition, childPosition); 
      childText.setChecked(buttonView.isChecked()); 
      personals=new ArrayList<contactsVo>(); 
      set.add(list.getFileId()); 
      contactsVo obj1=new contactsVo(); 
      obj1.setImeiNo(list.getImeiNo()); 
      obj1.setUserId(list.getUserId()); 
      //obj.add(obj1); 
      personals.add(obj1); 
      Log.e("=================","========================"); 

     }else 
     { 
      Log.e("Uncheked","See it"); 
      set.remove(list.getFileId()); 

     } 

     notifyDataSetChanged(); 

    } 
}); 

잘하면, 그것은 당신을 위해 작동합니다.

+0

을 확인하려는 경우 알아 내기 위해 부울 배열을 참조해야하지만라고한다 같은 문제가 작동하지 않습니다. – user2745359

0

listviews의 체크 박스가 혼란스러워 할 수 있습니다. 상자가 선택되었는지 여부를 알기 위해보기에 의존 할 수 없거나 어댑터의 항목과 동일한 크기의 불리언 참조를 만들고 확인란을 설정해야 할 필요가 없습니다 수동으로 true 또는 false에 따라 다릅니다. 보기가 목록보기에서 재활용되고 목록을 스크롤하면 일부보기는 아직 확인하지 않은 채로 표시되는 것처럼 보입니다. 확인 된 변경 리스너는 스크롤 할 때 실행되므로 설정하지 마십시오. 저는 여기에 체크 박스와 함께 사용할 어댑터, 모든 시간의 getView 당신이 우리가 같은 일을 행한 상자

class TagAdapter extends StandardAdapter { 

boolean[] checkedItems; 
int iconWidth; 

public TagAdapter() { 

    checkedItems = new boolean[items.size()]; 

    registerDataSetObserver(new DataSetObserver() { 

     @Override 
     public void onChanged() { 
      super.onChanged(); 
      updateProperties(); 
     } 

    }); 

    iconWidth = MyApp.getScreenWidth()/7; 
} 

void updateProperties() { 
    checkedItems = new boolean[items.size()]; 
} 

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

    final ViewHolder viewHolder; 

    if (convertView == null) { 

     convertView = mLayoutInflater.inflate(R.layout.checkin_friend, parent, false); 

     viewHolder = new ViewHolder(); 

     viewHolder.ivIcon = (CachedImageView) convertView.findViewById(R.id.ivIcon); 
     viewHolder.tvName = (TextView) convertView.findViewById(R.id.tvName); 
     viewHolder.cbFriend = (CheckBox) convertView.findViewById(R.id.cbFriend); 

     convertView.setTag(viewHolder); 

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

    final JsonObject item = getItem(position); 
    final Profile profile = new Gson().fromJson(item, Profile.class); 

    viewHolder.tvName.setText(profile.getUsername()); 

    if (profile.getIcon() != null) { 

     viewHolder.ivIcon.set(app.imageContainer + profile.getIcon(), true); 

    } 
    else { 
     viewHolder.ivIcon.setImageDrawable(app.defaultIcon); 

    } 

    viewHolder.ivIcon.setLayoutParams(new RelativeLayout.LayoutParams(iconWidth, iconWidth)); 



    viewHolder.cbFriend.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 


     } 
    }); 

    viewHolder.cbFriend.setChecked(checkedItems[position]); 

    convertView.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 

      boolean current = checkedItems[position]; 

      if (current == true) { 

       boolean modified = tags.remove(profile); 

       if(modified == false){ 
        Log.d(MyApp.TAG,"modification was false"); 
       } 
      } 
      else { 
       tags.add(profile); 
      } 

      checkedItems[position] = !current; 

      viewHolder.cbFriend.setChecked(checkedItems[position]); 

      updateUi(); 

     } 
    }); 



    return convertView; 

} 

public class ViewHolder { 
    CachedImageView ivIcon; 
    TextView tvName; 
    CheckBox cbFriend; 
} 

}

관련 문제