0

I have a ArrayAdapter with a lot of "if" to check the first letter of the list title to set a background color, but I would like to use something as a array or another thing to reduce the lines the class, but I don't know how to implement it, someone can help?

public class DadosArrayAdapter extends ArrayAdapter<Dados> {

private int resource = 0;
private LayoutInflater inflater;
private Context context;

public DadosArrayAdapter(Context context, int resource) {

    super(context, resource);
    inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    this.resource = resource;
    this.context = context;
}


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

    View view = null;
    ViewHolder viewHolder = null;

    if (convertView == null) {

        viewHolder = new ViewHolder();

        view = inflater.inflate(resource, parent, false);

        viewHolder.txtCor = (TextView) view.findViewById(R.id.txtCor);
        viewHolder.txtFabricante = (TextView) view.findViewById(R.id.txtFabricante);
        viewHolder.txtNome = (TextView) view.findViewById(R.id.txtNome);

        view.setTag(viewHolder);

        convertView = view;

    } else {

        viewHolder = (ViewHolder) convertView.getTag();
        view = convertView;

    }


    Dados dados = getItem(position);


    if (dados.getFabricante().startsWith("A")) {
        viewHolder.txtCor.setBackgroundColor(context.getResources().getColor(R.color.color_a));
        viewHolder.txtCor.setText("A");

    } else if (dados.getFabricante().startsWith("B")) {
        viewHolder.txtCor.setBackgroundColor(context.getResources().getColor(R.color.color_b));
        viewHolder.txtCor.setText("B");

    } else if (dados.getFabricante().startsWith("C")) {
        viewHolder.txtCor.setBackgroundColor(context.getResources().getColor(R.color.color_c));
        viewHolder.txtCor.setText("C");

    } else if (dados.getFabricante().startsWith("D")) {
        viewHolder.txtCor.setBackgroundColor(context.getResources().getColor(R.color.color_d));
        viewHolder.txtCor.setText("D");

    } else if (dados.getFabricante().startsWith("E")) {
        viewHolder.txtCor.setBackgroundColor(context.getResources().getColor(R.color.color_e));
        viewHolder.txtCor.setText("E");

    } else if (dados.getFabricante().startsWith("F")) {
        viewHolder.txtCor.setBackgroundColor(context.getResources().getColor(R.color.color_f));
        viewHolder.txtCor.setText("F");

    } else if (dados.getFabricante().startsWith("G")) {
        viewHolder.txtCor.setBackgroundColor(context.getResources().getColor(R.color.color_g));
        viewHolder.txtCor.setText("G");

    } else if (dados.getFabricante().startsWith("H")) {
        viewHolder.txtCor.setBackgroundColor(context.getResources().getColor(R.color.color_h));
        viewHolder.txtCor.setText("H");

    } else if (dados.getFabricante().startsWith("I")) {
        viewHolder.txtCor.setBackgroundColor(context.getResources().getColor(R.color.color_i));
        viewHolder.txtCor.setText("I");

    } else if (dados.getFabricante().startsWith("J")) {
        viewHolder.txtCor.setBackgroundColor(context.getResources().getColor(R.color.color_j));
        viewHolder.txtCor.setText("J");

    } else if (dados.getFabricante().startsWith("K")) {
        viewHolder.txtCor.setBackgroundColor(context.getResources().getColor(R.color.color_k));
        viewHolder.txtCor.setText("K");

    } else if (dados.getFabricante().startsWith("L")) {
        viewHolder.txtCor.setBackgroundColor(context.getResources().getColor(R.color.color_l));
        viewHolder.txtCor.setText("L");

    } else if (dados.getFabricante().startsWith("M")) {
        viewHolder.txtCor.setBackgroundColor(context.getResources().getColor(R.color.color_m));
        viewHolder.txtCor.setText("M");

    } else if (dados.getFabricante().startsWith("N")) {
        viewHolder.txtCor.setBackgroundColor(context.getResources().getColor(R.color.color_n));
        viewHolder.txtCor.setText("N");

    } else if (dados.getFabricante().startsWith("O")) {
        viewHolder.txtCor.setBackgroundColor(context.getResources().getColor(R.color.color_o));
        viewHolder.txtCor.setText("O");

    } else if (dados.getFabricante().startsWith("P")) {
        viewHolder.txtCor.setBackgroundColor(context.getResources().getColor(R.color.color_p));
        viewHolder.txtCor.setText("P");

    } else if (dados.getFabricante().startsWith("Q")) {
        viewHolder.txtCor.setBackgroundColor(context.getResources().getColor(R.color.color_q));
        viewHolder.txtCor.setText("Q");

    } else if (dados.getFabricante().startsWith("R")) {
        viewHolder.txtCor.setBackgroundColor(context.getResources().getColor(R.color.color_r));
        viewHolder.txtCor.setText("R");

    } else if (dados.getFabricante().startsWith("S")) {
        viewHolder.txtCor.setBackgroundColor(context.getResources().getColor(R.color.color_s));
        viewHolder.txtCor.setText("S");

    } else if (dados.getFabricante().startsWith("T")) {
        viewHolder.txtCor.setBackgroundColor(context.getResources().getColor(R.color.color_t));
        viewHolder.txtCor.setText("T");

    } else if (dados.getFabricante().startsWith("U")) {
        viewHolder.txtCor.setBackgroundColor(context.getResources().getColor(R.color.color_u));
        viewHolder.txtCor.setText("U");

    } else if (dados.getFabricante().startsWith("V")) {
        viewHolder.txtCor.setBackgroundColor(context.getResources().getColor(R.color.color_v));
        viewHolder.txtCor.setText("V");

    } else if (dados.getFabricante().startsWith("W")) {
        viewHolder.txtCor.setBackgroundColor(context.getResources().getColor(R.color.color_w));
        viewHolder.txtCor.setText("W");

    } else if (dados.getFabricante().startsWith("X")) {
        viewHolder.txtCor.setBackgroundColor(context.getResources().getColor(R.color.color_x));
        viewHolder.txtCor.setText("X");

    } else if (dados.getFabricante().startsWith("Y")) {
        viewHolder.txtCor.setBackgroundColor(context.getResources().getColor(R.color.color_y));
        viewHolder.txtCor.setText("Y");

    } else if (dados.getFabricante().startsWith("Z")) {
        viewHolder.txtCor.setBackgroundColor(context.getResources().getColor(R.color.color_z));
        viewHolder.txtCor.setText("Z");

    } else {
        viewHolder.txtCor.setBackgroundColor(context.getResources().getColor(R.color.color_null));
        viewHolder.txtCor.setText("?");

    }

    viewHolder.txtFabricante.setText(dados.getFabricante());
    viewHolder.txtNome.setText(dados.getNome());

    return view;

}

static class ViewHolder {

    TextView txtCor;
    TextView txtFabricante;
    TextView txtNome;

} }

Thank you

F4bioo
  • 179
  • 1
  • 5
  • 11

4 Answers4

1

There's definitely a better solution to your problem with an array. First, create an array of color references:

int[] colorRefs = {R.color.color_a, R.color.color_b, ...}

Then, create a method to calculate the color position from a letter:

private int colorPosition(char letter) {
    return letter - 'A';
}

Get the first char of the text and retrieve the correct color for it:

char firstLetter = dados.getFabricante().charAt(0);
int colorPosition = colorPosition(firstLetter);
if (colorPosition >= 0 && colorPosition < colors.length) {
    int color = colors[colorPosition];
}

Make sure to properly test this code against all edge cases.

Egor
  • 39,695
  • 10
  • 113
  • 130
  • Thanks @Egor, it works like a charm. I have just added the **String.valueOf** viewHolder.txtCor.setText (String.valueOf (firstLetter)) ;. is there any way to list the viewHolder on the screen in alphabetical order, or this is only possible by manipulating the database? – F4bioo Oct 12 '15 at 17:23
  • You'll have to supply sorted data to the Adapter. If your data comes from the database, use ORDER BY. – Egor Oct 12 '15 at 18:22
0

Use regex to check if the first character is alphabetic:

public boolean isAlphaNumeric(String s){
    String pattern= "^[a-zA-Z0-9]*$";
        if(s.matches(pattern)){
            return true;
        }
        return false;   
}

then if TRUE return/set the first character of the string by using substr method.

denis_lor
  • 6,212
  • 4
  • 31
  • 55
0

Please use Collections.sort(Arrays.asList(your_array[])); As a result items in your_array[] contains sorted data.

Nandhu
  • 68
  • 11
0

Try Below code:

/**
 * Test Code
 */
private void test(){
    String firstChar = dados.getFabricante().charAt(0);
    if(Character.isAlphabetic(firstChar)){
         setBgResource(viewHolder.txtCor, firstChar);
         viewHolder.txtCor.setText(firstChar);
    }else{
         setBgResource(viewHolder.txtCor, "null");
         viewHolder.txtCor.setText("?");  
    }
}

/**
 * Set Background color of view.
 */
private void setBgResource(View  view, String name){
    view.setBackgroundColor(getResourceByName("color_" + name));
}

/**
 * Get color resource from name.
 */
private int getResourceByName(String name){
    Resources resources = getActivity().getApplicationContext().getResources();
    final int resourceId = resources.getIdentifier(name, "color",
            getActivity().getApplicationContext().getPackageName());
    return resources.getColor(resourceId);
}
Dhaval Patel
  • 10,119
  • 5
  • 43
  • 46