JavascriptProva

sabato 17 marzo 2018

Esercizi di riscrittura di ArrayAdapter nativo e personalizzato

Il problema è aggiungere una voce "vuota" a una ListView, da compilare.
Come faccio?
Inizio col creare una ListView.
La cosa mi servirà anche per esercitarmi con la ListView e con gli adapters.

Per prima cosa vediamo un adapter personalizzato. Iniziamo con un ArrayAdapter non personalizzato.
public class MainActivity extends AppCompatActivity {


    ArrayList arrayList;
    Helper helper;
    ListView listView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        listView=(ListView)findViewById(R.id.listView);
        helper=new Helper(this);
        /*helper.save("Brontolo");
        helper.save("Cucciolo");
        helper.save("Pisolo");
        helper.save("Gongolo");
        helper.save("Mammolo");
        helper.save("Dotto");
        helper.save("Eolo");*/

        arrayList=new ArrayList();
        arrayList.add("Alfa");
        arrayList.add("Beta");
        arrayList.add("Gamma");
        arrayList.add("Delta");
        arrayList.add("Epsilon");
        arrayList.add("Zeta");
        arrayList.add("Eta");

        ArrayAdapter arrayAdapter=new ArrayAdapter(this,R.layout.row,
                R.id.textView,arrayList);
        
        listView.setAdapter(arrayAdapter);
    }
}
Bene.

Ho fatto un excursus sugli adapters, ho trovato la soluzione alla mia esigenza specifica, e adesso devo esercitarmi un po'.
Scrittura di un arrayadapter.
public class MainActivity extends AppCompatActivity {


    ArrayAdapter arrayAdapter;
    ArrayList arrayList;
    Helper helper;
    ListView listView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        listView=(ListView)findViewById(R.id.listView);
        helper=new Helper(this);
        /*helper.save("Brontolo");
        helper.save("Cucciolo");
        helper.save("Pisolo");
        helper.save("Gongolo");
        helper.save("Mammolo");
        helper.save("Dotto");
        helper.save("Eolo");*/

        arrayList=new ArrayList();
        arrayList.add("Alfa");
        arrayList.add("Beta");
        arrayList.add("Gamma");
        arrayList.add("Delta");
        arrayList.add("Epsilon");
        arrayList.add("Zeta");
        arrayList.add("Eta");

        String[] matrice=new String[]{"uno","due","tre","quattro","cinque","sei","sette"};

        arrayAdapter=new ArrayAdapter(this,R.layout.row,R.id.textView,arrayList);

        listView.setAdapter(arrayAdapter);
    }
}
Ecco l'uso dell'ArrayAdapter preconfezionato.
Funziona.

Adesso cerchiamo di scrivere il codice dell'ArrayAdapter personalizzato che dovrebbe evitare di creare una nuova view quando questa esiste già.

Ecco con l'adapter personalizzato che estende ArrayAdapter: praticamente svolge la stessa funzione, credo...

        CustomAdapter adapter=new CustomAdapter(this,R.layout.row,arrayList);
        listView.setAdapter(adapter);
    }

    class CustomAdapter extends ArrayAdapter{

        public CustomAdapter(@NonNull Context context, int resource,ArrayList arrayList) {
            super(context, resource,arrayList);
        }

        @NonNull
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            LayoutInflater inflater=(LayoutInflater)getSystemService(LAYOUT_INFLATER_SERVICE);
            convertView=inflater.inflate(R.layout.row,null);
            TextView textView=convertView.findViewById(R.id.textView);
            textView.setText(getItem(position));
            return convertView;
        }
    }

Ora uso quell'artifizio per fare in modo che, se la view non è di nuova creazione, non venga nuovamente inflatata ma si usi già per quella che è.
        CustomAdapter adapter=new CustomAdapter(this,R.layout.row,arrayList);
        listView.setAdapter(adapter);

    }

    class CustomAdapter extends ArrayAdapter {
        public CustomAdapter(Context context, int resource,ArrayList lista) {
            super(context, resource,lista);
        }

        @NonNull
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            ViewHolder viewHolder=null;
            if(convertView==null){
                LayoutInflater inflater=(LayoutInflater)getSystemService(LAYOUT_INFLATER_SERVICE);
                convertView=inflater.inflate(R.layout.row,null);
                viewHolder=new ViewHolder();
                viewHolder.txtNome=(TextView)convertView.findViewById(R.id.textView);
                convertView.setTag(viewHolder);
            }else{
                viewHolder=(ViewHolder)convertView.getTag();
            }
            viewHolder.txtNome.setText(getItem(position));
            return convertView;
        }
    }

    class ViewHolder {
        public TextView txtNome;
    }
}
E funziona.

Nessun commento:

Posta un commento