列表视图中滚动的问题

时间:2013-07-22 20:22:04

标签: android listview scroll

我有一个自定义适配器,用名称和数字填充ListView。如果该数字具有特定的值,则该数字具有不同的颜色。 当它显示它工作正常,但当我滚动列表时,其他没有条件的数字也获得颜色。这是自定义适配器和getView()方法。

private class MyCustomAdapter extends ArrayAdapter<CategoriaD> {

    private ArrayList<CategoriaD> elementList;

    public MyCustomAdapter(Context context, int textViewResourceId,
                           ArrayList<CategoriaD> elementList) {
        super(context, textViewResourceId, elementList);
        this.elementList = new ArrayList<CategoriaD>();
        this.elementList.addAll(elementList);
    }

    private class ViewHolder {
        TextView texto;
        TextView cantidad;
    }

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

        ViewHolder holder = null;
        Log.v("ConvertView", String.valueOf(position));

        if (convertView == null) {
            LayoutInflater vi = (LayoutInflater)getSystemService(
                    Context.LAYOUT_INFLATER_SERVICE);
            convertView = vi.inflate(R.layout.activity_inspeccion_categoria, null);

            holder = new ViewHolder();
            holder.texto = (TextView) convertView.findViewById(R.id.texto);
            holder.cantidad = (TextView) convertView.findViewById(R.id.estadistica);

            convertView.setTag(holder);

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

        CategoriaD Elemento = elementList.get(position);
        holder.texto.setText(Elemento.getNombre());
        holder.cantidad.setText(Elemento.getEstadistica());
        if(Elemento.getEstadistica().equals(“50”)){
            holder.cantidad.setTextColor(Color.RED);
        }

        holder.cantidad.setTag(Elemento);

        return convertView;

    }

}

2 个答案:

答案 0 :(得分:1)

你的问题在这里:

    if(Elemento.getEstadistica().equals(“50”)){
        holder.cantidad.setTextColor(Color.RED);
    }

您需要确保使用else语句将颜色设置回默认值,因为在进行更改时使用转换视图时它会持续存在,因为视图不会被重新填充。

if(Elemento.getEstadistica().equals(“50”)){
    holder.cantidad.setTextColor(Color.RED);
} else {
    //TODO change to your default color color
    holder.cantidad.setTextColor(Color.BLACK);
}
编辑:此外,您的更改很小,所以这比膨胀2个单独的convertView更好,但是如果您对每个项目的convertView或更多项目进行了更大幅度的更改,那么您可以覆盖getItemViewType(int)方法,允许您为每种类型的项目充气不同的转换视图,并在请求正确的项目类型时自动重复使用它。你只需要输出和整数依赖于你用来改变文本颜色的if if case。 (可能分别为0和1。)

Adapter getItemViewType(int)

答案 1 :(得分:0)

对于自定义适配器,我发现覆盖所有基础是可行的方法。 if-block应该有一个补充else块,即使它似乎是多余的。

尝试使用以下getView()方法代替您的方法:

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

    ViewHolder holder = null;
    Log.v("ConvertView", String.valueOf(position));

    if (convertView == null) {
        LayoutInflater vi = (LayoutInflater)getSystemService(
                Context.LAYOUT_INFLATER_SERVICE);
        convertView = vi.inflate(R.layout.activity_inspeccion_categoria, null);

        holder = new ViewHolder();
        holder.texto = (TextView) convertView.findViewById(R.id.texto);
        holder.cantidad = (TextView) convertView.findViewById(R.id.estadistica);

        convertView.setTag(holder);

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

    CategoriaD Elemento = elementList.get(position);
    holder.texto.setText(Elemento.getNombre());
    holder.cantidad.setText(Elemento.getEstadistica());
    if(Elemento.getEstadistica().equals(“50”)){
        holder.cantidad.setTextColor(Color.RED);
    } else {
        holder.cantidad.setTextColor(Color.GREEN);    // Change this to whatever Color
    }

    holder.cantidad.setTag(Elemento);

    return convertView;

}