Autore Topic: pulsante in una listView  (Letto 317 volte)

Offline newbie2016

  • Utente junior
  • **
  • Post: 79
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Cubot X9
  • Sistema operativo:
    Windows 7
pulsante in una listView
« il: 05 Agosto 2016, 03:08:44 CEST »
0
Salve, ho una listView con l'elenco di inviti ricevuti.
Ogni invito ha due pulsanti Accetta e Rifiuta. A seconda della scelta dell'utente viene registrato nel DB MYSQL il dato della scelta.

Ogni invito ha i seguenti Button
Codice (XML): [Seleziona]
<LinearLayout
       android:layout_width="300dp"
       android:layout_height="40dp"
       android:layout_gravity="center_horizontal"
       android:layout_marginTop="12dp"
       android:background="@drawable/top_corner_gradient"
       android:orientation="horizontal"
       android:paddingLeft="6dp"
       android:paddingRight="6dp"
       android:gravity="center">



        <Button
           style="?android:attr/buttonStyleSmall"
           android:id="@+id/btn_accept"
           android:layout_width="150dp"
           android:layout_height="wrap_content"
           android:background="@color/material_deep_teal_500"
           android:padding="10dp"
           android:text="Accetta"
           android:gravity="center"
           android:textColor="@color/abc_primary_text_disable_only_material_dark"
           android:textStyle="bold" />
        <Button
           style="?android:attr/buttonStyleSmall"
           android:id="@+id/btn_decline"
           android:layout_width="150dp"
           android:layout_height="wrap_content"
           android:background="@color/design_textinput_error_color_light"
           android:padding="10dp"
           android:text="Rifiuta"
           android:gravity="center"
           android:textColor="@color/abc_primary_text_disable_only_material_dark"
           android:textStyle="bold" />
    </LinearLayout>

come faccio a dare l'input per ogni invito?

Codice (Java): [Seleziona]
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

    }

Grazie

Offline DCode

  • Utente junior
  • **
  • Post: 69
  • Respect: +20
    • Mostra profilo
  • Sistema operativo:
    Ubuntu 16.04 LTS
Re:pulsante in una listView
« Risposta #1 il: 05 Agosto 2016, 09:15:44 CEST »
+1
Presumo che la tua ListView abbia un adapter con un ViewHolder per ottimizzarlo, se è così al suo interno prova a fare così
  • Implementa l'onClickListener dei button nell'adapter
  • Nel ViewHolder settati sui button un onClickListener
  • Nell'override del metodo onClick() ti gestisci cosa devono fare i 2 button

Consigli
  • Nell'onClick() per controllare quale dei due button hai cliccato confronta l'id della view che trovi come parametro nel metodo con R.id....
  • Per capire quale elemento della listView hai cliccato usa getAdapterPosition()

Buona giornata  :-)
┻━┻ ︵ヽ(°□°ヽ) Develop w/ ( ( ObjC || Swift ) && Java[ "Android" ] ) (╯°□°)╯︵ ┻━┻

Offline newbie2016

  • Utente junior
  • **
  • Post: 79
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Cubot X9
  • Sistema operativo:
    Windows 7
Re:pulsante in una listView
« Risposta #2 il: 05 Agosto 2016, 12:34:32 CEST »
0
Il codice della listView è il seguente e non c'è un viewHolder:

Codice (Java): [Seleziona]
public class ViewAllEventiReceived extends AppCompatActivity implements ListView.OnItemClickListener {

    private ListView listView;

    private String JSON_STRING;
    private EditText editTextEmail;

    private String id, accept, emaila, emailda, txtViewEmail;

    private Button btn_accept, btn_invreceived, btn_invposted;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_view_all_inviti_rec);
        listView = (ListView) findViewById(R.id.listView);
        listView.setOnItemClickListener(this);

        Intent intent = getIntent();
        emaila = getIntent().getExtras().getString("emailda");


        getJSON();
    }


    private void showEmployee(){
        JSONObject jsonObject = null;
        ArrayList<HashMap<String,String>> list = new ArrayList<HashMap<String, String>>();
        try {
            jsonObject = new JSONObject(JSON_STRING);
            JSONArray result = jsonObject.getJSONArray(Config.TAG_JSON_ARRAY);

            for(int i = 0; i<result.length(); i++){
                JSONObject jo = result.getJSONObject(i);
                String id = jo.getString(Config.TAG_ID);
                String cognomea = jo.getString(Config.TAG_COGNOMEA);
                String nomea = jo.getString(Config.TAG_NOMEA);
                String emaila = jo.getString(Config.TAG_EMAILA);
                String dove = jo.getString(Config.TAG_APPUNTDOVE);
                String data_appuntamento = jo.getString(Config.TAG_DATAINCONTRO);
                String ora_appuntamento = jo.getString(Config.TAG_ORAINCONTRO);

                HashMap<String,String> employees = new HashMap<>();
                employees.put(Config.TAG_ID,id);
                employees.put(Config.TAG_COGNOMEA,cognomea);
                employees.put(Config.TAG_NOMEA,nomea);
                employees.put(Config.TAG_EMAILA,emaila);
                employees.put(Config.TAG_APPUNTDOVE,dove);
                employees.put(Config.TAG_DATAINCONTRO,data_appuntamento);
                employees.put(Config.TAG_ORAINCONTRO,ora_appuntamento);
                list.add(employees);
            }

        } catch (JSONException e) {
            e.printStackTrace();
        }

        ListAdapter adapter = new SimpleAdapter(
                ViewAllEventiReceived.this, list, R.layout.list_inviti_ricevuti,
                new String[]{Config.TAG_ID,Config.TAG_COGNOMEA,Config.TAG_NOMEA,Config.TAG_EMAILA,Config.TAG_APPUNTDOVE,Config.TAG_DATAINCONTRO,Config.TAG_ORAINCONTRO},
                new int[]{R.id.id, R.id.cognomea, R.id.nomea, R.id.emaila, R.id.dove, R.id.data_appuntamento, R.id.ora_appuntamento});


        listView.setAdapter(adapter);
    }

    private void getJSON(){
        class GetJSON extends AsyncTask<Void,Void,String>{

            ProgressDialog loading;
            @Override
            protected void onPreExecute() {
                super.onPreExecute();
                loading = ProgressDialog.show(ViewAllEventiReceived.this,"Fetching Data","Wait...",false,false);
            }

            @Override
            protected void onPostExecute(String s) {
                super.onPostExecute(s);
                loading.dismiss();
                JSON_STRING = s;
                showEmployee();
            }

            @Override
            protected String doInBackground(Void... params) {
                RequestHandler rh = new RequestHandler();
                String s = rh.sendGetRequestParam(Config.URL_GET_EVENTI_RIC,emaila);
                return s;
            }
        }
        GetJSON gj = new GetJSON();
        gj.execute();
    }
    private void updateEmployee(){
        final String accept = "SI";

        class UpdateEmployee extends AsyncTask<Void,Void,String>{
            ProgressDialog loading;
            @Override
            protected void onPreExecute() {
                super.onPreExecute();
                loading = ProgressDialog.show(ViewAllEventiReceived.this,"Updating...","Wait...",false,false);
            }

            @Override
            protected void onPostExecute(String s) {
                super.onPostExecute(s);
                loading.dismiss();
                Toast.makeText(ViewAllEventiReceived.this,s,Toast.LENGTH_LONG).show();
            }

            @Override
            protected String doInBackground(Void... params) {
                HashMap<String,String> hashMap = new HashMap<>();
                hashMap.put(Config.KEY_EMP_ID,id);
                hashMap.put(Config.KEY_EMP_ACCETTA,accept);

                RequestHandler rh = new RequestHandler();

                String s = rh.sendPostRequest(Config.URL_UPDATE_EMP,hashMap);

                return s;
            }
        }

        UpdateEmployee ue = new UpdateEmployee();
        ue.execute();
        startActivity(new Intent(ViewAllEventiReceived.this,ProfileActivity.class));
    }

    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

    }

}

Offline DCode

  • Utente junior
  • **
  • Post: 69
  • Respect: +20
    • Mostra profilo
  • Sistema operativo:
    Ubuntu 16.04 LTS
Re:pulsante in una listView
« Risposta #3 il: 05 Agosto 2016, 14:36:23 CEST »
0
Devi creare un adapter allora, non ti basta secondo me il SimpleAdapter per controllare il listener sui button
┻━┻ ︵ヽ(°□°ヽ) Develop w/ ( ( ObjC || Swift ) && Java[ "Android" ] ) (╯°□°)╯︵ ┻━┻

Offline newbie2016

  • Utente junior
  • **
  • Post: 79
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Cubot X9
  • Sistema operativo:
    Windows 7
Re:pulsante in una listView
« Risposta #4 il: 05 Agosto 2016, 17:02:15 CEST »
0
Ho fatto così, ho inserito un AlertDialog

Codice (Java): [Seleziona]
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        AlertDialog.Builder a_builder = new AlertDialog.Builder(ViewAllEventiReceived.this);
        a_builder.setMessage("What do you want to do?")
                .setCancelable(false)
                .setPositiveButton("Accept",new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                            updateEmployee();
                    }
                })
                .setNegativeButton("Decline",new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        dialog.cancel();
                    }
                }) ;
        AlertDialog alert = a_builder.create();
        alert.setTitle("What do you want to do?");
        alert.show();

    }

A seconda della scelta di inserisce il campo nel Database.

Però non riesco a far passare l'id della listview come parametro per aggiornare il record nel Database

di seguito il codice di ViewInviti.java
Codice (Java): [Seleziona]
public class ViewInviti extends AppCompatActivity implements ListView.OnItemClickListener {

    private ListView listView;

    private String JSON_STRING;
    private EditText editTextEmail;
    private TextView id;

    private String accept, emaila, emailda, txtViewEmail;

    private Button btn_accept, btn_invreceived, btn_invposted;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_view_all_inviti_rec);
        listView = (ListView) findViewById(R.id.listView);
        listView.setOnItemClickListener(this);

        id = (TextView) findViewById(R.id.id);

        Intent intent = getIntent();
        emaila = getIntent().getExtras().getString("emailda");

        getJSON();
    }


    private void showEmployee(){
        JSONObject jsonObject = null;
        ArrayList<HashMap<String,String>> list = new ArrayList<HashMap<String, String>>();
        try {
            jsonObject = new JSONObject(JSON_STRING);
            JSONArray result = jsonObject.getJSONArray(Config.TAG_JSON_ARRAY);

            for(int i = 0; i<result.length(); i++){
                JSONObject jo = result.getJSONObject(i);
                String id = jo.getString(Config.TAG_ID);
                String cognomea = jo.getString(Config.TAG_COGNOMEA);
                String nomea = jo.getString(Config.TAG_NOMEA);
                String emaila = jo.getString(Config.TAG_EMAILA);
                String dove = jo.getString(Config.TAG_APPUNTDOVE);
                String data_appuntamento = jo.getString(Config.TAG_DATAINCONTRO);
                String ora_appuntamento = jo.getString(Config.TAG_ORAINCONTRO);

                HashMap<String,String> employees = new HashMap<>();
                employees.put(Config.TAG_ID,id);
                employees.put(Config.TAG_COGNOMEA,cognomea);
                employees.put(Config.TAG_NOMEA,nomea);
                employees.put(Config.TAG_EMAILA,emaila);
                employees.put(Config.TAG_APPUNTDOVE,dove);
                employees.put(Config.TAG_DATAINCONTRO,data_appuntamento);
                employees.put(Config.TAG_ORAINCONTRO,ora_appuntamento);
                list.add(employees);
            }

        } catch (JSONException e) {
            e.printStackTrace();
        }

        ListAdapter adapter = new SimpleAdapter(
                ViewInviti.this, list, R.layout.list_inviti_ricevuti,
                new String[]{Config.TAG_ID,Config.TAG_COGNOMEA,Config.TAG_NOMEA,Config.TAG_EMAILA,Config.TAG_APPUNTDOVE,Config.TAG_DATAINCONTRO,Config.TAG_ORAINCONTRO},
                new int[]{R.id.id, R.id.cognomea, R.id.nomea, R.id.emaila, R.id.dove, R.id.data_appuntamento, R.id.ora_appuntamento});


        listView.setAdapter(adapter);
    }

    private void getJSON(){
        class GetJSON extends AsyncTask<Void,Void,String>{

            ProgressDialog loading;
            @Override
            protected void onPreExecute() {
                super.onPreExecute();
                loading = ProgressDialog.show(ViewInviti.this,"Fetching Data","Wait...",false,false);
            }

            @Override
            protected void onPostExecute(String s) {
                super.onPostExecute(s);
                loading.dismiss();
                JSON_STRING = s;
                showEmployee();
            }

            @Override
            protected String doInBackground(Void... params) {
                RequestHandler rh = new RequestHandler();
                String s = rh.sendGetRequestParam(Config.URL_GET_EVENTI_RIC,emaila);
                return s;
            }
        }
        GetJSON gj = new GetJSON();
        gj.execute();
    }
    private void updateEmployee(){
        final String id = "4";
        final String accept = "Accept";

        class UpdateEmployee extends AsyncTask<Void,Void,String>{
            ProgressDialog loading;
            @Override
            protected void onPreExecute() {
                super.onPreExecute();
                loading = ProgressDialog.show(ViewInviti.this,"Updating...","Wait...",false,false);
            }

            @Override
            protected void onPostExecute(String s) {
                super.onPostExecute(s);
                loading.dismiss();
                Toast.makeText(ViewInviti.this,s,Toast.LENGTH_LONG).show();
            }

            @Override
            protected String doInBackground(Void... params) {
                HashMap<String,String> hashMap = new HashMap<>();
                hashMap.put(Config.KEY_EMP_ID,id);
                hashMap.put(Config.KEY_EMP_ACCETTA,accept);

                RequestHandler rh = new RequestHandler();

                String s = rh.sendPostRequest(Config.URL_ACCEPTINVITES_EMP,hashMap);

                return s;
            }
        }

        UpdateEmployee ue = new UpdateEmployee();
        ue.execute();
    }

    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        AlertDialog.Builder a_builder = new AlertDialog.Builder(ViewInviti.this);
        a_builder.setMessage("What do you want to do?")
                .setCancelable(false)
                .setPositiveButton("Accept",new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                            updateEmployee();
                    }
                })
                .setNegativeButton("Decline",new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        dialog.cancel();
                    }
                }) ;
        AlertDialog alert = a_builder.create();
        alert.setTitle("What do you want to do?");
        alert.show();

    }
}

deve passare questi due parametri
final String id = "4";
        final String accept = "Accept";


Se io lo lascio così mi aggiorna il record 4.

Come faccio a far prelevare l'id esatto del record che ho cliccato?

Grazie

Offline DCode

  • Utente junior
  • **
  • Post: 69
  • Respect: +20
    • Mostra profilo
  • Sistema operativo:
    Ubuntu 16.04 LTS
Re:pulsante in una listView
« Risposta #5 il: 05 Agosto 2016, 18:28:03 CEST »
+1
Nell'onItemClick hai il parametro view
Usalo per prendere la view ( dentro il layout che passi all'adapter "R.layout.list_inviti_ricevuti" ) dove ti salvi l'id.

A disposizione  ;-)
┻━┻ ︵ヽ(°□°ヽ) Develop w/ ( ( ObjC || Swift ) && Java[ "Android" ] ) (╯°□°)╯︵ ┻━┻

Offline newbie2016

  • Utente junior
  • **
  • Post: 79
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Cubot X9
  • Sistema operativo:
    Windows 7
Re:pulsante in una listView
« Risposta #6 il: 06 Agosto 2016, 15:06:28 CEST »
0
ho fatto così:
Codice (Java): [Seleziona]
public void onItemClick(final AdapterView<?> parent, View view, final int position, long id) {
        AlertDialog.Builder a_builder = new AlertDialog.Builder(ViewAllEventiReceived.this);
        a_builder.setMessage("What do you want to do?")
                .setCancelable(false)
                .setPositiveButton("Accept",new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        HashMap<String,String> map =(HashMap)parent.getItemAtPosition(position);
                        String empid = map.get(Config.TAG_ID).toString();
                        acceptInvite();
                    }
                })
                .setNegativeButton("Decline",new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        HashMap<String,String> map =(HashMap)parent.getItemAtPosition(position);
                        String empid = map.get(Config.TAG_ID).toString();
                        declineInvite();
                    }
                }) ;
        AlertDialog alert = a_builder.create();
        alert.setTitle("What do you want to do?");
        alert.show();

    }

però se inserisco un Toast mi visualizza l'id dell'item selezionato.
Come faccio ad inviare l'id per l'aggiornamento del record ?

Codice (Java): [Seleziona]
private void acceptInvite(){
        final String empid = toString();
        final String accept = "Accept";

        class acceptInvite extends AsyncTask<Void,Void,String>{
            ProgressDialog loading;
            @Override
            protected void onPreExecute() {
                super.onPreExecute();
                loading = ProgressDialog.show(ViewAllEventiReceived.this,"Updating...","Wait...",false,false);
            }

            @Override
            protected void onPostExecute(String s) {
                super.onPostExecute(s);
                loading.dismiss();
                Toast.makeText(ViewAllEventiReceived.this,s,Toast.LENGTH_LONG).show();
            }

            @Override
            protected String doInBackground(Void... params) {
                HashMap<String,String> hashMap = new HashMap<>();
                hashMap.put(Config.KEY_EMP_ID,empid);
                hashMap.put(Config.KEY_EMP_ACCETTA,accept);

                RequestHandler rh = new RequestHandler();

                String s = rh.sendPostRequest(Config.URL_ACCEPTINVITES_EMP,hashMap);

                return s;
            }
        }

        acceptInvite ue = new acceptInvite();
        ue.execute();
        startActivity(new Intent(ViewAllEventiReceived.this,ViewAllEventiReceived.class));
    }
Grazie

Post unito: 06 Agosto 2016, 16:11:21 CEST
risolto, avevo dimenticato di recuperare il campo id

ho fatto così:
Codice (Java): [Seleziona]
Bundle recuperoid= getIntent().getExtras();
        final String id = recuperoid.getString("item_id");

Funziona!

Per il futuro vorrei chiedervi se questa procedura anche se funziona va bene oppure c'è un metodo più semplice?
Grazie
« Ultima modifica: 06 Agosto 2016, 16:11:21 CEST da newbie2016, Reason: Merged DoublePost »

Offline DCode

  • Utente junior
  • **
  • Post: 69
  • Respect: +20
    • Mostra profilo
  • Sistema operativo:
    Ubuntu 16.04 LTS
Re:pulsante in una listView
« Risposta #7 il: 06 Agosto 2016, 22:07:41 CEST »
0
Personalmente creerei un adapter e dentro di questo mi gestisco tutti gli eventi degli elementi della lista.

Questo semplicemente perché ho più controllo, perché se vedi tu non hai risolto il problema principale della domanda ovvero quello di gestire il click di 2 button all'interno dell'elemento della tua lista, ma hai trovato una soluzione alternativa con l'uso del dialog.
Con l'adapter avresti avuto invece la possibilità di gestirlo  ;-)
┻━┻ ︵ヽ(°□°ヽ) Develop w/ ( ( ObjC || Swift ) && Java[ "Android" ] ) (╯°□°)╯︵ ┻━┻