2017-05-16 15 views
1

こんにちは私はチェックボックスを使ってリストビューを持っていますが、チェックボックスをチェックしてチェックチェンジしたリスナーのリストをスクロールすると "ischecked"と "else"チェックされたチェックボックスが消えたときにスクロールすると、その状態は維持されません。 チェックボックスをチェックすると(ischecked)コールし、チェックボックスをオフにすると「else」が呼び出されます。チェックボックス呼び出しのあるListViewとスクロール時の両方が同じです

は、ここでは、コード内でmCheckBox.setCheck(value)を呼び出すときにCheckBoxをクリックしたとき、または呼び出します私のアダプタクラス

public class NamesAdapter extends BaseAdapter { 
private List<EmployeeModel> employeeModelList; 
private Context context; 
private EmployeeModel employeeModel; 
private ListView listView; 
public static String check = "stop"; 
public String name; 
int ii; 
int getPosition; 
boolean isShowing = false; 
public NamesAdapter(List<EmployeeModel> employeeModelList, Context context) { 

    this.employeeModelList = employeeModelList; 
    this.context = context; 


} 


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

@Override 
public Object getItem(int i) { 
    // return employeeModelList.get(i); 
    return employeeModelList.get(i); 
} 

@Override 
public long getItemId(int i) { 
    return i; 
} 

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

    ViewHolder viewHolder=null; 
    if (convertView == null) { 
     LayoutInflater layoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     convertView = layoutInflater.inflate(R.layout.empname_listview_model, null); 
     viewHolder = new ViewHolder(); 

     viewHolder.checkbox = (CheckBox) convertView.findViewById(R.id.checkBox); 

     convertView.setTag(viewHolder); 

     convertView.setTag(R.id.checkBox, viewHolder.checkbox); 


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

    viewHolder.checkbox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 
     @Override 
     public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
      // Here we get the position that we have set for the checkbox using setTag. 
      // Set the value of checkbox to maintain its state. 

      //employeeModel = employeeModelList.get(position); 

      //name = employeeModel.getName(); 
      getPosition = (Integer) buttonView.getTag(); 
      employeeModelList.get(getPosition).setChecked(buttonView.isChecked()); 

      if (isChecked){ 
       //getPosition = finalViewHolder.checkbox.getId(); 
       check="start"; 
       Toast.makeText(context, "This is if", Toast.LENGTH_SHORT).show(); 
       displayEmployeeNamesData(); 

      } 
      else { 

       check="stop"; 
        Toast.makeText(context, "This is else", Toast.LENGTH_SHORT).show(); 
      } 

     } 

    }); 

    viewHolder.checkbox.setTag(position); // This line is important. 
    viewHolder.checkbox.setText(employeeModelList.get(position).getName()); 
    viewHolder.checkbox.setChecked(employeeModelList.get(position).isChecked()); 


    return convertView; 
} 



public void displayEmployeeNamesData() { 
    NewEmployeeDBTable newEmployeeDBTable = new NewEmployeeDBTable(context); 

    SQLiteDatabase dataBase = newEmployeeDBTable.getWritableDatabase(); 
    //the SQL command to fetched all records from the table 
    String sql = "SELECT eid FROM " 
      + NewEmployeeDBTable.EmployeNameTable + " where ename='" + name + "'"; 
    Cursor mCursor = dataBase.rawQuery(sql, null); 
    if (mCursor.moveToFirst()) { 
     do { 
      ii = mCursor.getInt(mCursor.getColumnIndex(NewEmployeeDBTable.eid)); 


     } 
     while (mCursor.moveToNext()); 
    } 
    mCursor.close(); 
} 


private static class ViewHolder { 
    CheckBox checkbox; 
} 
} 
} 
+0

チェックボックスの状態がランダムに変更されていますか?以下の用語と情報を使って正確に説明できますか? 1)行1のチェックボックスをクリックし、この従業員を確認してください 2)行5をタッチしてリストビューをスクロールします 3)行5がまだListViewの表示セットにある間に指を離します。 ==結果== - 行5は現在チェックされているかチェックされていませんか? どの行が状態を変更しましたか? –

+0

チェックボックスの位置が変わっていないリストの最初のチェックボックスを押してリストをスクロールすると、リスト内の "else"条件が実行されます。実行します。 –

+0

私は、ビューの位置は変化しているが、チェックボックスの状態は変わっていないとは言いません。これは、多くの要因によって引き起こされる可能性があるため、実際にはステップごとに再生シナリオを作成すると便利です。スクロール中にチェックボックスの状態が変化し、特定のビューホールダーが可視のリストビュー領域から外れますか?あなたが私の質問に答えなかったり、上記のように再現シナリオを提供しないと、私はあなたを助けることができません。 –

答えて

0

OnCheckedChangeListener()です。あなたはListViewにスクロールすると
は、getView()方法はListView行を再作成するために呼び出すと、あなたのgetView()の内側にあなたがいるのでsetOnClickListener

final EmployeeModel employee = employeeModelList.get(getPosition); 
holder.mCheckBox.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     employee.setChecked(!employee.isChecked()); 
    } 
}); 
viewHolder.checkbox.setChecked(employee.isChecked()); 

などを使用することができ、それを解決するために viewHolder.checkbox.setChecked(...) => OnCheckedChangeListenerコール

を呼び出していますOnClickListener()ご連絡時に電話がかかりませんviewHolder.checkbox.setChecked(...)

+0

私はonClick Listenerを使用しようとしましたが、リストをスクロールしてチェックを外したり、他のボックスを自動的にチェックしたりするときに問題が発生します。 –

+0

@ArslanShahid多分別の問題です。私の簡単なデモはhttps://github.com/PhanVanLinh/StackOverFlowDemo/tree/master/CheckBoxInRecyclerViewで確認できます。 'setOnClickListener'を使いましょう –