rafaxplayer
14/09/13, 18:37:12
Saludos compañeros , tengo un problema con un listview con custom adapter y checkboxes , el problema básicamente es que al hacer visibles o checkar los checks que están fuera de de la lista al hacer scroll y re-dibujarlos se comportan como quieren , los seleccionados se de-seleccionan y algunos visibles se hace invisibles...
utlizo unos métodos para hacer los check visibles y para checkarlos todos o no , serian estos:
private void setListChecksVisibles(boolean isVisible) {
int nVisible = isVisible ? View.VISIBLE : View.GONE;
header.setVisibility(nVisible);
footer.setVisibility(nVisible);
for(int i=0; i<lst.getChildCount(); i++){
View ll = lst.getChildAt(i);
CheckBox cb = (CheckBox) ll.findViewById(R.id.checkItems);
cb.setVisibility(nVisible);
}
adp.notifyDataSetChanged();
}
private void checkAll(boolean bCheck) {
for(int i=0; i<lst.getChildCount(); i++){
View ll =lst.getChildAt(i);
CheckBox cb = (CheckBox)ll.findViewById(R.id.checkItems);
cb.setChecked(bCheck);
}
adp.notifyDataSetChanged();
}
He probado en el adapter ah crear un array de booleanos para guardar los cambios en los checkboxes y actualizarlos en el getview , pero no me esta dando ningún resultado.
mi adapter es este:
public class HistoryAdapter extends BaseAdapter {
private LayoutInflater mInflater = null;
private Cursor cur;
private ArrayList<Boolean> itemSelection;
public HistoryAdapter(){
db = new DBHelper(getApplicationContext(), DBHelper.TABLE_NAME, null, 1);
this.cur = db.SelectAll();
mInflater = (LayoutInflater)getApplicationContext().getSystemS ervice(Activity.LAYOUT_INFLATER_SERVICE);
itemSelection= new ArrayList<Boolean>();
for(int i=0;i<this.getCount();i++) {
itemSelection.add(i, false);
}
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return cur.getCount();
}
@Override
public Cursor getItem(int position) {
cur.moveToPosition(position);
return cur;
}
@Override
public long getItemId(int position) {
Cursor c = getItem(position);
long id =(Long)(long)c.getInt(c.getColumnIndex(DBHelper.KE Y_ID));
return id;
}
private class ViewHolder {
TextView lng;
TextView lat;
TextView date;
CheckBox ch;
}
@Override
public View getView(final int position, View convertView, ViewGroup arg2) {
ViewHolder holder= null;
holder= new ViewHolder();
if (convertView == null) {
convertView = mInflater.inflate(R.layout.itemhistory, null);
holder.lng = (TextView) convertView.findViewById(R.id.textLongitude);
holder.lat=(TextView) convertView.findViewById(R.id.textLatitude);
holder.date=(TextView) convertView.findViewById(R.id.textDate);
holder.ch=(CheckBox)convertView.findViewById(R.id. checkItems);
holder.ch.setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
itemSelection.set(position,isChecked);
}
});
convertView.setTag(holder);
}
else
{
holder = (ViewHolder) convertView.getTag();
}
try
{
Cursor rowItem = getItem(position);
holder.lng.setText(rowItem.getString(rowItem.getCo lumnIndex(DBHelper.KEY_LONGITUDE))+" ");
holder.lat.setText(rowItem.getString(rowItem.getCo lumnIndex(DBHelper.KEY_LATITUDE))+" ");
holder.date.setText(rowItem.getString(rowItem.getC olumnIndex(DBHelper.KEY_DATE))+" ");
holder.ch.setChecked(itemSelection.get(position));
}catch(Exception ex){
ex.printStackTrace();
}
return convertView;
}
}
Alguna sugerencia? gracias de antemano ;)
utlizo unos métodos para hacer los check visibles y para checkarlos todos o no , serian estos:
private void setListChecksVisibles(boolean isVisible) {
int nVisible = isVisible ? View.VISIBLE : View.GONE;
header.setVisibility(nVisible);
footer.setVisibility(nVisible);
for(int i=0; i<lst.getChildCount(); i++){
View ll = lst.getChildAt(i);
CheckBox cb = (CheckBox) ll.findViewById(R.id.checkItems);
cb.setVisibility(nVisible);
}
adp.notifyDataSetChanged();
}
private void checkAll(boolean bCheck) {
for(int i=0; i<lst.getChildCount(); i++){
View ll =lst.getChildAt(i);
CheckBox cb = (CheckBox)ll.findViewById(R.id.checkItems);
cb.setChecked(bCheck);
}
adp.notifyDataSetChanged();
}
He probado en el adapter ah crear un array de booleanos para guardar los cambios en los checkboxes y actualizarlos en el getview , pero no me esta dando ningún resultado.
mi adapter es este:
public class HistoryAdapter extends BaseAdapter {
private LayoutInflater mInflater = null;
private Cursor cur;
private ArrayList<Boolean> itemSelection;
public HistoryAdapter(){
db = new DBHelper(getApplicationContext(), DBHelper.TABLE_NAME, null, 1);
this.cur = db.SelectAll();
mInflater = (LayoutInflater)getApplicationContext().getSystemS ervice(Activity.LAYOUT_INFLATER_SERVICE);
itemSelection= new ArrayList<Boolean>();
for(int i=0;i<this.getCount();i++) {
itemSelection.add(i, false);
}
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return cur.getCount();
}
@Override
public Cursor getItem(int position) {
cur.moveToPosition(position);
return cur;
}
@Override
public long getItemId(int position) {
Cursor c = getItem(position);
long id =(Long)(long)c.getInt(c.getColumnIndex(DBHelper.KE Y_ID));
return id;
}
private class ViewHolder {
TextView lng;
TextView lat;
TextView date;
CheckBox ch;
}
@Override
public View getView(final int position, View convertView, ViewGroup arg2) {
ViewHolder holder= null;
holder= new ViewHolder();
if (convertView == null) {
convertView = mInflater.inflate(R.layout.itemhistory, null);
holder.lng = (TextView) convertView.findViewById(R.id.textLongitude);
holder.lat=(TextView) convertView.findViewById(R.id.textLatitude);
holder.date=(TextView) convertView.findViewById(R.id.textDate);
holder.ch=(CheckBox)convertView.findViewById(R.id. checkItems);
holder.ch.setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
itemSelection.set(position,isChecked);
}
});
convertView.setTag(holder);
}
else
{
holder = (ViewHolder) convertView.getTag();
}
try
{
Cursor rowItem = getItem(position);
holder.lng.setText(rowItem.getString(rowItem.getCo lumnIndex(DBHelper.KEY_LONGITUDE))+" ");
holder.lat.setText(rowItem.getString(rowItem.getCo lumnIndex(DBHelper.KEY_LATITUDE))+" ");
holder.date.setText(rowItem.getString(rowItem.getC olumnIndex(DBHelper.KEY_DATE))+" ");
holder.ch.setChecked(itemSelection.get(position));
}catch(Exception ex){
ex.printStackTrace();
}
return convertView;
}
}
Alguna sugerencia? gracias de antemano ;)