Estoy enumerando las aplicaciones instaladas en la vista de lista con CheckBox, estoy seleccionando cualquier elemento y lo envío para escanear, después de escanear estoy tratando de cambiar el color de la fila que cambió correctamente, pero cuando me desplazo por la vista de lista, ese color cambió en muchas filas a continuación, quiero para cambiar solo esa posición, no cambiar al desplazarse por otras filas.

Donde estoy cambia el color de la fila en Activity.

String[] separated = result.split(":");
        int position = Integer.parseInt(separated[1]);
        if (separated[0].equals("R")) {
            View v = listView.getChildAt(position);
            v.setBackgroundColor(Color.RED);
        } else {
            View v = listView.getChildAt(position);
            v.setBackgroundColor(Color.GREEN);
        }

Mi BaseAdapter

public class Installedapps extends BaseAdapter {

public List<CustomObject> list;
CustomObject object2;
boolean[] itemChecked;
Activity context;

public Installedapps(Activity context, List<CustomObject> arg1) {
    super();
    this.context = context;
    list = arg1;
    itemChecked = new boolean[list.size()];
    object2 = new CustomObject();
}

@Override
public int getCount() {
    // TODO Auto-generated method stub
    return list.size();
}

@Override
public CustomObject getItem(int position) {
    // TODO Auto-generated method stub
    return list.get(position);
}

@Override
public long getItemId(int position) {
    // TODO Auto-generated method stub
    return position;
}

public void remove(int position) {
    list.remove(position);

}

@Override
public View getView(final int position, View convertView,
        ViewGroup parent) {
    final ViewHolder holder;
    final CustomObject object = getItem(position);
    if (convertView == null) {
        holder = new ViewHolder();

        // TODO Auto-generated method stub
        LayoutInflater inflater = context.getLayoutInflater();
        convertView = inflater.inflate(R.layout.adapter_installed_apps,
                parent, false);

        holder.im = (ImageView) convertView
                .findViewById(R.id.allapps_image);
        holder.checkBox = (CheckBox) convertView
                .findViewById(R.id.btn_scan_allapps);
        holder.checkBox.setChecked(false);
        holder.md5 = (TextView)convertView.findViewById(R.id.md5TXT);
        holder.name = (TextView) convertView
                .findViewById(R.id.allapps_pacagename);
        convertView.setTag(holder);

    } else {

        holder = (ViewHolder) convertView.getTag();
    }

    final ApplicationInfo into = PackageUtil.getPackagePath(
            context, object.Aplicationname);

    String pacage = object.Aplicationname;
    String name = (String) into.loadLabel(context.getPackageManager());
    Drawable ICON = into.loadIcon(context.getPackageManager());         
    final File file = new File(into.publicSourceDir);
    holder.im.setImageDrawable(ICON);
    holder.name.setText(name);
    holder.md5.setText(file.toString());

    if (itemChecked[position])
           holder.checkBox.setChecked(true);
          else
           holder.checkBox.setChecked(false);

          holder.checkBox.setOnClickListener(new OnClickListener() {
           @Override
           public void onClick(View v) {
            // TODO Auto-generated method stub
            if (holder.checkBox.isChecked()){
             itemChecked[position] = true;
             DetailMessageModel.getInstance().changeState(
                     file.toString() + ":" + Integer.toString(position)
                        );
            }
            else{
             itemChecked[position] = false;
             RemoveItemModel.getInstance().changeState(
                     file.toString() + ":" + Integer.toString(position)
                        );
            }
           }
          });

    return convertView;
}
}

class ViewHolder {
CheckBox checkBox;
TextView name, md5;
ImageView im;

}
0
user3555472 4 feb. 2015 a las 19:44

4 respuestas

La mejor respuesta

Puede hacer esto, ya que usé 6 colores y los repito en la vista de lista. Espero que te ayude. Mi código de BaseAdapter.

public class ListViewAdapterSubCategories extends BaseAdapter{
    Context context;
    LayoutInflater inflater;
    ArrayList<HashMap<String, String>> data;
    private int[] color_arr = new int[] {Color.parseColor("#00ADEE"), Color.parseColor("#24B5EC"), Color.parseColor("#42BCEA"), Color.parseColor("#62C2E6"), Color.parseColor("#86CAE3"), Color.parseColor("#A1CFE0")};
    HashMap<String, String> resultp = new HashMap<String, String>();

    public ListViewAdapterSubCategories (Context context,
            ArrayList<HashMap<String, String>> arraylist) {
        this.context = context;
        data = arraylist;
    }


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

    @Override
    public Object getItem(int position) {
        return null;
    }

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

    public View getView(final int position, View convertView, ViewGroup parent) {
        TextView subCategory_name;

        inflater = (LayoutInflater) context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);

        View itemView = inflater.inflate(R.layout.listview_item_subcategory, parent, false);
        int colorPos = position % color_arr.length;
        itemView.setBackgroundColor(color_arr[colorPos]);
        // Get the position
        resultp = data.get(position);

        return itemView;
    }
}
1
user123456 3 mar. 2015 a las 13:40
@Override
public View getView(int position, View convertView, ViewGroup parent) {

    LayoutInflater mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

    if(convertView == null) {
        convertView = mInflator.inflate(R.layout.notes_row, null);
        holder = new Holder();
        holder.title = (TextView) row.findViewById(R.id.text1);
        holder.noteId = (TextView) row.findViewById(R.id.noteid);
        holder.category = (TextView) row.findViewById(R.id.category);
        convertView.setTag(holder)
    } else {
        holder = (Holder) convertView.getTag();
    }
    //do whatever here.. set, get values

    holder.setBackgroundColor(color_arr[colorPos]);

    return convertView;
}

class Holder {
     TextView title;
     TextView noteId;
     TextView category;
}
0
Alp Altunel 14 jul. 2017 a las 08:21

Su aplicación se basa en el comportamiento programado de la clase baseAdapter. Aparentemente, esto no funciona bien en este caso. Por lo que sugeriría hacer un adaptador personalizado.

Cuando llama al adaptador, hace que establezca una etiqueta para cada fila según el número de posición. También usa xml para configurar la vista para cada fila.

    @Override
public View getView(int position, View convertView, ViewGroup parent) {
    Notes theRec = (Notes) getItem(position);

    LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

    View row;

    row = inflater.inflate(R.layout.notes_row, null);
    TextView title = (TextView) row.findViewById(R.id.text1);
    TextView noteId = (TextView) row.findViewById(R.id.noteid);
    TextView category = (TextView) row.findViewById(R.id.category);
    //you can put your imageview here

A continuación, asigna el número de posición de la fila como su etiqueta:

row.setTag(String.valueOf(position));
return row;

En su actividad, encuentra el elemento secundario de vista de lista y establece su color de fondo:

View v = mylistview.findViewWithTag(String.valueOf(index)); 
v.setBackgroundResource(R.color.some_color);
0
Reenactor Rob 4 feb. 2015 a las 17:32

No cambie el color de la fila durante la actividad. Debe hacer esto en getView().

1
GIGAMOLE 4 feb. 2015 a las 17:40