JavascriptProva

Visualizzazione post con etichetta CustomAdapter. Mostra tutti i post
Visualizzazione post con etichetta CustomAdapter. Mostra tutti i post

sabato 5 novembre 2016

Ripasso del CursorAdapter per collegare una ListView a una tabella di database.

Il CursorAdapter avrebbe un metodo newView che non sarebbe altro che l'inflatazione del nuovo Layout, come ArrayAdapter.
La differenza potrebbe stare nel fatto che mentre nell'ArrayAdapter il metodo getView fa tutto lui, nel CursorAdapter la view viene inflatata da newView e poi in essa vengono messi i dati tramite bindView.
Vediamo un po' i parametri dei due metodi.

Sì, credo di essere in grado di provare...

Iniziamo estendendo CursorAdapter.
    class MyCursorAdapter extends CursorAdapter {

        Context context;
        public MyCursorAdapter(Context context, Cursor c) {
            super(context, c);
            this.context=context;
        }

        @Override
        public View newView(Context context, Cursor cursor, ViewGroup parent) {
            LayoutInflater layoutInflater=(LayoutInflater)context.getSystemService(LAYOUT_INFLATER_SERVICE);
            return layoutInflater.inflate(R.layout.row,null);
        }

        @Override
        public void bindView(View view, Context context, Cursor cursor) {

            TextView textView=(TextView)view.findViewById(R.id.textView);
            Button button=(Button)view.findViewById(R.id.button2);
            textView.setText(cursor.getString(cursor.getColumnIndexOrThrow("voce")));
        }
    }
E l'ho sperimentato: ecco tutto il codice:
public class Lista extends AppCompatActivity {

    Helper helper;
    MyCursorAdapter myCursorAdapter;
    ListView listView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_lista);

        helper=new Helper(this);
        Cursor crs=helper.query();
        myCursorAdapter=new MyCursorAdapter(this,crs);
        listView=(ListView)findViewById(R.id.listView);
        listView.setAdapter(myCursorAdapter);





    }

    @Override
    protected void onStop(){
        super.onStop();

        Intent intent=new Intent(Lista.this,Lista.class);
        PendingIntent pendingIntent=PendingIntent.getActivity(getApplicationContext(),0,intent,0);
        AlarmManager alarmManager=(AlarmManager) getApplicationContext().getSystemService(ALARM_SERVICE);
        alarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime()+5*1000,pendingIntent);

    }

    class MyCursorAdapter extends CursorAdapter {

        Context context;
        public MyCursorAdapter(Context context, Cursor c) {
            super(context, c);
            this.context=context;
        }

        @Override
        public View newView(Context context, Cursor cursor, ViewGroup parent) {
            LayoutInflater layoutInflater=(LayoutInflater)context.getSystemService(LAYOUT_INFLATER_SERVICE);
            return layoutInflater.inflate(R.layout.row,null);
        }

        @Override
        public void bindView(View view, Context context, Cursor cursor) {

            TextView textView=(TextView)view.findViewById(R.id.textView);
            Button button=(Button)view.findViewById(R.id.button2);
            textView.setText(cursor.getString(cursor.getColumnIndexOrThrow("voce")));
        }
    }



}
Funziona perfettamente!

Aggiunta di eventi nel CustomAdapter

Ho modificato il CustomAdapter in modo da aggiungere un listener al button in ogni layout inflatato nella ListView.
    class CustomAdapter extends ArrayAdapter{

        Context context;
        int resource;
        ArrayList arrayList;
        public CustomAdapter(Context context, int resource, ArrayList objects) {
            super(context, resource, objects);
            this.context=context;
            this.resource=resource;
            this.arrayList=(ArrayList)objects;
        }

        @Override
        public View getView(int position,View convertView,ViewGroup group){
            LayoutInflater layoutInflater=(LayoutInflater)context.getSystemService(LAYOUT_INFLATER_SERVICE);
            convertView=layoutInflater.inflate(this.resource,null);
            final TextView textView=(TextView)convertView.findViewById(R.id.textView);
            Button button=(Button)convertView.findViewById(R.id.button2);
            textView.setText(arrayList.get(position).testoText);
            button.setText(arrayList.get(position).testoButton);
            button.setOnClickListener(new View.OnClickListener(){

                @Override
                public void onClick(View v) {
                    textView.setText("OKAY");
                }
            });
            return convertView;
        }
    }
Funziona.

Ripasso di CustomAdapter che estende ArrayAdapter

ArrayAdapter ha diversi tipi di costruttori. Mi sono rinfrescate le idee su cose viste, peraltro, anche abbastanza recentemente, ma che scordo con estrema facilità.
Ecco qui l'elenco delle firme dei costruttori:
Context, int
Context, int, int
Context, int, T[]
Context, int, int, T[]
Context, int, List
Context, int, int, List
In particolare, quello che ho usato prima è un costruttore a quattro parametri, precisamente l'ultimo in quanto ho usato una classe che eredita da List.
A quattro parametri posso usare anche il terzultimo, che invece di una classe di tipo List usa un semplice Array.
Poi si può usare a tre parametri, senza selezionare la view del layout.
La creazione di un CustomView estende ArrayAdapter e ne usa il costruttore a tre parametri context, layout e array, ossia il penultimo, Context, int, List
Provo a estendermi ArrayAdapter per crearmi un adapter personalizzato. Mi creo un tipo con due membri:
    class Tipo{
        public String testoText;
        public String testoButton;
    }
Di questo tipo creerò diverse istanze, che collocherò in un'arrayList.

Ora provo a estendere ArrayAdapter:
    class CustomAdapter extends ArrayAdapter{

        Context context;
        int resource;
        ArrayList<Tipo> arrayList;
        public CustomAdapter(Context context, int resource, ArrayList<Tipo> objects) {
            super(context, resource, objects);
            this.context=context;
            this.resource=resource;
            this.arrayList=(ArrayList)objects;
        }

        @Override
        public View getView(int position,View convertView,ViewGroup group){
            LayoutInflater layoutInflater=(LayoutInflater)context.getSystemService(LAYOUT_INFLATER_SERVICE);
            convertView=layoutInflater.inflate(this.resource,null);
            TextView textView=(TextView)convertView.findViewById(R.id.textView);
            Button button=(Button)convertView.findViewById(R.id.button2);
            textView.setText(arrayList.get(position).testoText);
            button.setText(arrayList.get(position).testoButton);
            return convertView;
        }
    } 
Creo diverse istanze di Tipo, le metto in un arrayList e do l'arrayList in pasto a una istanza di CustomAdapter.
        Tipo tipo=new Tipo();
        tipo.testoButton="Bottone";
        tipo.testoText="Testo";
        
        Tipo tipo1=new Tipo();
        tipo1.testoButton="Bottone secondo";
        tipo1.testoText="Testo secondo";
        
        Tipo tipo2=new Tipo();
        tipo2.testoButton="Altro bottone";
        tipo2.testoText="Altro testo";

        arrayList=new ArrayList<Tipo>();
        arrayList.add(tipo);
        arrayList.add(tipo1);
        arrayList.add(tipo2);

        customAdapter=new CustomAdapter(this,R.layout.row,arrayList);

        listView=(ListView) findViewById(R.id.listView);
        listView.setAdapter(customAdapter); 
Proviamo...



Sì, eccolo.