2013-06-13 2 views
0

이 문제에 대한 다른 여러 가지 해결책을 살펴 보았지만 그 중 일부는 완전히 근본적으로 다르다는 이유로 나에게 적합하지 않습니다. 내 어댑터에는 장치에 설치된 앱을 나열하는 PackageInfo 클래스가 있습니다. 그 부분은 작동합니다. 각 앱 옆에 해당 앱을 카테고리 1 또는 2로 분류하는 두 개의 체크 박스가 있습니다. 사용자의 선택을 SharedPreference에 저장했습니다 (모든 사용자 입력을 저장할 수있는 더 나은 방법에 대한 의견이 도움이되지만 내 관심사는 아닙니다).).체크 박스가있는 목록보기, 스크롤 관련 문제

몇 가지 다른 해결책을 살펴 보았습니다. 근본적으로 여기에 뭔가 빠져있는 것 같습니다. 사용자가 스크롤 할 때 문제가 발생하며 확인란을 무작위로 선택하거나 선택 취소합니다.

public View getView(int position, View convertView, ViewGroup parent) { 
    final ViewHolder holder; 
    LayoutInflater inflater = context.getLayoutInflater(); 


    if (convertView == null) { 
     convertView = inflater.inflate(R.layout.list_layout, null); 
     holder = new ViewHolder(); 
     holder.apkName = (TextView) convertView.findViewById(R.id.appname); 
     holder.category1 = (CheckBox) convertView.findViewById(R.id.arcade); 
     holder.category1.setTag(position); 
     holder.category2 = (CheckBox) convertView.findViewById(R.id.educational); 
     holder.category2.setTag(position); 
     convertView.setTag(holder); 
    } else { 
     holder = (ViewHolder) convertView.getTag(); 
    } 
    PackageInfo packageInfo = (PackageInfo) getItem(position); 
    Drawable appIcon = packageManager.getApplicationIcon(packageInfo.applicationInfo); 
    final String appName = packageManager.getApplicationLabel(packageInfo.applicationInfo).toString(); 
    final String appPositionArcade = "cat1"+appName; 
    final String appPositionEdu = "cat2"+appName; 
    appIcon.setBounds(0, 0, 55, 55); 
    holder.apkName.setCompoundDrawables(appIcon, null, null, null); 
    holder.apkName.setCompoundDrawablePadding(15); 
    holder.apkName.setText(appName); 

    holder.category1.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 
     public void onCheckedChanged(CompoundButton compoundButton, boolean b) { 
      if (holder.category1.isChecked()) { 
       holder.category2.setChecked(false); 
       SharedPreferences stored = context.getSharedPreferences("Shared Preferences", 0); 
       SharedPreferences.Editor editor = stored.edit(); 

       editor.putBoolean(appPositionArcade, true); 
       editor.putBoolean(appPositionEdu, false); 
      } else if (!holder.category1.isChecked()) { 
       SharedPreferences stored = context.getSharedPreferences("Shared Preferences", 0); 
       SharedPreferences.Editor editor = stored.edit(); 

       editor.putBoolean(appPositionArcade, false); 
      } 
     } 
    }); 

    holder.category2.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 
     public void onCheckedChanged(CompoundButton compoundButton, boolean b) { 
      if (holder.category2.isChecked()) { 
       SharedPreferences stored = context.getSharedPreferences("Shared Preferences", 0); 
       SharedPreferences.Editor editor = stored.edit(); 

       holder.category1.setChecked(false); 
       editor.putBoolean(appPositionArcade, false); 
       editor.putBoolean(appPositionEdu, true); 
      } else if (!holder.category2.isChecked()) { 
       SharedPreferences stored = context.getSharedPreferences("Shared Preferences", 0); 
       SharedPreferences.Editor editor = stored.edit(); 

       editor.putBoolean(appPositionEdu, false); 
      } 
     } 
    }); 

    return convertView; 
} 

답변

0

아마도 당신은보기 recyling 문제로 실행하고 있습니다. holder.category1 및 holder.category2의 상태를 명시 적으로 설정해야합니다.

보기가 재생되고 사용자가 onclicklistener를 트리거하는 다른 데이터 행의 부울 값을 남겨 둡니다.

0

convertView.setTag(holder);를 이동하려고 단지 return convertView;

관련 문제