2016-09-20 11 views
0

私は、チェックボックスとテキストビューで構成されるカスタムリストビューを持っています。何らかの理由でListActivityを使用できません。リストビューを使用するのはかなり簡単ですが、なぜチェックボックスが異なって動作しているのかわかりません。リストビューの期待しない動作のAndroidチェックボックス

まず、私は次の行を削除する場合さて、チェックボックスの動作があれば、たとえば、奇妙な取得します**私のアダプタの一部である

private static class ViewHolder { //My View Hold 
    TextView tvParentGradeName; 
    CheckBox cbParentClassesOfGrades; 

} 
    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     // Get the data item for this position 
     final ClassModelInfo user = getItem(position); 


     // Check if an existing view is being reused, otherwise inflate the view 
     final ViewHolder viewHolder; // view lookup cache stored in tag 
     if (convertView == null) { 
      // If there's no view to re-use, inflate a brand new view for row 
      viewHolder = new ViewHolder(); 
      LayoutInflater inflater = LayoutInflater.from(mContext); 
      convertView = inflater.inflate(resourceLayout, parent, false); 

      viewHolder.tvParentGradeName = (TextView) convertView.findViewById(R.id.tvParentGradeName); 
      viewHolder.cbParentClassesOfGrades = (CheckBox) convertView.findViewById(R.id.cbParentClassesOfGrades); 


      convertView.setTag(viewHolder); 

      viewHolder.cbParentClassesOfGrades.setChecked(false); 
      //Following list consist of ids of items whoes check box are checked alredy 
      if(selectedItemsList!= null && selectedItemsList.size()>0){ 
       for(int i = 0 ; i<selectedItemsList.size();i++){ 
       if(user.getClassID().matches(""+selectedItemsList.get(i))){ 
        viewHolder.cbParentClassesOfGrades.setChecked(true); 
       } 
       } 

      } 

      viewHolder.cbParentClassesOfGrades.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 

       @Override 
       public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
        int getPosition = (Integer) buttonView.getTag(); // Here we get the position that we have set for the checkbox using setTag. 
        listClass.get(getPosition).setSetSelected(buttonView.isChecked()); // Set the value of checkbox to maintain its state. 
//     if(callback!=null) 
//     callback.checkBoxChecked(); 
        if (isChecked) { 


         selectedItemsList.add(Integer.parseInt(user.getClassID())); 

        } else { 
//       selectedItemsList.remove(classsLevelClickedItems.getId()); 
         Iterator<Integer> myItr = selectedItemsList.iterator(); 

         while (myItr.hasNext()) { 
          Integer id = myItr.next(); 
          System.out.println("Next name is: " + id); 
          if (id == Integer.parseInt(user.getClassID())) { 
           myItr.remove(); 
          } 
         } 
        } 
       } 
      }); 


      convertView.setTag(viewHolder); 
      convertView.setTag(R.id.tvParentGradeName, viewHolder.tvParentGradeName); 
      convertView.setTag(R.id.cbParentClassesOfGrades, viewHolder.cbParentClassesOfGrades); 
     } else { 
      viewHolder = (ViewHolder) convertView.getTag(); 
     } 
      viewHolder.cbParentClassesOfGrades.setTag(position); // This line is important. 


      viewHolder.tvParentGradeName.setText(user.getClassName()+" ("+gradeDictionary.get(Integer.parseInt(user.getGradeID()))+")"); 

      viewHolder.cbParentClassesOfGrades.setChecked(user.isSetSelected()); 


     return convertView; 

    } 

以下、私はあなたに私がやっている何のアイデアを与えてみましょう私は、第四のチェックボックスをチェックして、リストビューをスクロール開始私が来ているチェックボックスがすでに確認されていることがわかります、私はそのような行動が何であるかを知らない**

viewHolder.cbParentClassesOfGrades.setTag(位置) ; //この行は重要です。 viewHolder.tvParentGradeName.setText(user.getClassName()+ ">(" + gradeDictionary.get(Integer.parseInt(user.getGradeID()))+ ")"); viewHolder.cbParentClassesOfGrades.setChecked(user.isSetSelected());

だから、基本的に、私は以下のの上に私の最大の問題点を述べてきたように、チェックボックスで一貫性のあるリストビューを作成する方法をいくつかの質問

1)があり、私は、リストビューが

をクリックされたボックスをチェックし、正確に覚えておく必要があります意味します

2)リストビューの行全体でクリックリスナーを作成するには、アイテムをクリックしてチェックボックスをオン(チェックとアンチェック)して、ユーザーがチェックボックスを特にチェックする必要はありません。

どうすれば改善できるのですか教えてください。これは私の日を取っている。

注:私はたくさんその問題を検索しましたし、私のコードでのコメントと行は、私はネットからコピーしたものです。

+0

これは奇妙な動作ではありません。これは、行がリストビューで再利用されるため、意図された動作です。これを解決するには、チェックされた位置を保存する必要があります。行を膨らませると位置が確認され、それに応じて進んでください。 –

+0

私にその方法を示すことができます –

+0

http://techlovejump.com/android-listview-with-checkbox/このリンクを確認してください。それは仕事の半分しか示していませんが。モデルのクラスのその位置を保存する必要がありますチェックボックスのクリック –

答えて

0

あなたは、チェックされた位置とチェックされていない位置を追跡し、それをあなたのアダプターにチェックインする必要があります。リストビューのように、それは望ましい動作です。コードでそれを処理する必要があります。 リスト項目の配列を作成します。チェックボックスをクリックするとその位置の配列が更新され、アダプタマークでは配列のそれぞれの値が表示されます。

public class MyCustomAdapter extends ArrayAdapter<ApplicationInfo> { 

private List<ApplicationInfo> appInfoList; 
private LayoutInflater mInflater; 
private PackageManager pm; 
ArrayList<Boolean> positionArray; 
private Context ctx; 
int[] visiblePosArray; 
private volatile int positionCheck; 

public MyCustomAdapter(Context context, List<ApplicationInfo> myList) { 
    super(context, NO_SELECTION); 
    appInfoList = myList; 
    ctx=context; 
    mInflater =  (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    pm = context.getPackageManager(); 

    positionArray = new ArrayList<Boolean>(myList.size()); 
    for(int i =0;i<myList.size();i++){ 
     positionArray.add(false); 
    } 
} 
@Override 
public int getCount() { 
    // TODO Auto-generated method stub 
    return appInfoList.size(); 
} 

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

    View row = convertView; 
    Holder holder = null; 

    if(row==null){ 
     row = mInflater.inflate(R.layout.testlayout, null); 
     // visiblePosArray[position%visiblePosArray.length]=position; 
     holder = new Holder(); 
     holder.appIcon = (ImageView)row.findViewById(R.id.imageView1); 

     holder.ckbox =(CheckBox)row.findViewById(R.id.checkBox1); 

     row.setTag(holder); 
    } else { 

     holder = (Holder) convertView.getTag(); 
    holder.ckbox.setOnCheckedChangeListener(null); 

    } 

    holder.ckbox.setFocusable(false); 
    holder.appIcon.setImageDrawable(appInfoList.get(position).loadIcon(pm)); 
    holder.ckbox.setChecked(positionArray.get(position)); 
    holder.ckbox.setText(appInfoList.get(position).loadLabel(pm)); 
    holder.ckbox.setOnCheckedChangeListener(new OnCheckedChangeListener() { 

     @Override 
     public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
      if(isChecked){ 
      System.out.println(position+"--- :)"); 
       positionArray.set(position, true); 

      }else 
       positionArray.set(position, false); 
     } 
    }); 

    return row; 
} 
static class Holder 
{ 
    ImageView appIcon; 
    CheckBox ckbox; 

} 
} 
+0

ここにコードを貼り付けてください。\ –

+0

あなたはアクティビティのボタンを持っていて、アイテムのIDをすべて取得する必要がありますか、whoesチェックボックスがオンになっていますか?アクティビティの外側のadpater –

+0

には、すべてのIDまたは必要なチェック情報を与えることができるメソッドをアダプタに含めることができます。あなたはあなたの活動からそのメソッドを呼び出すことができます – priyanka

関連する問題