web-dev-qa-db-fra.com

Android: Comment définir l'événement onClick pour le bouton dans l'élément de liste de ListView

Je veux ajouter un événement onClick pour les boutons utilisés dans l'élément de la variable Listview. Comment puis-je donner l'événement onClick pour les boutons de l'élément de liste?.

73
Sagar D

Vous pouvez définir l'événement onClick dans la méthode getView de votre adaptateur personnalisé.
vérifiez le lien http://androidforbeginners.blogspot.it/2010/03/clicking-buttons-in-listview-row.html

64
Nermeen

Dans la classe d'adaptateur

public View getView(final int position, View convertView, ViewGroup parent) {
    LayoutInflater inflater = getLayoutInflater();
    View row = inflater.inflate(R.layout.vehicals_details_row, parent, false);
    Button deleteImageView = (Button) row.findViewById(R.id.DeleteImageView);
    deleteImageView.setOnClickListener(new OnClickListener() {
        public void onClick(View v) {
            //...
        }
    });
}

Mais vous pouvez obtenir un problème - listView row non cliquable . Solution:

  • rendre ListView focusable Android:focusable="true"
  • Bouton non focalisable Android:focusable="false"
89
mukesh

Essaye ça,

public View getView(final int position, View convertView,ViewGroup parent) 
{
   if(convertView == null)
   {
        LayoutInflater inflater = getLayoutInflater();
        convertView  = (LinearLayout)inflater.inflate(R.layout.YOUR_LAYOUT, null);
   }

   Button Button1= (Button)  convertView  .findViewById(R.id.BUTTON1_ID);

   Button1.setOnClickListener(new OnClickListener() 
   { 
       @Override
       public void onClick(View v) 
       {
           // Your code that you want to execute on this button click
       }

   });


   return convertView ;
}

Cela peut vous aider .... 

12
Hemant

Dans votre adaptateur personnalisé dans la méthode getView:

button.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        // Do things Here 
    }
});
3
magirtopcu

Je suppose que vous avez défini un adaptateur personnalisé pour votre ListView.

Dans ce cas, vous pouvez affecter onClickListener à votre bouton dans la méthode getView() de l'adaptateur personnalisé.

1
Paresh Mayani

Cela a été discuté dans de nombreux posts mais je ne pouvais toujours pas trouver de solution avec:

Android:focusable="false"
Android:focusableInTouchMode="false"
Android:focusableInTouchMode="false"

La solution ci-dessous fonctionnera avec l’un des composants de l’interface utilisateur: Bouton, Boutons Image, ImageView, Textview. LinearLayout, RelativeLayout clique à l'intérieur d'une cellule listview et répondra également à onItemClick:

Classe d'adaptateur - getview ():

    @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            View view = convertView;
            if (view == null) {
                view = lInflater.inflate(R.layout.my_ref_row, parent, false);
            }
            final Organization currentOrg = organizationlist.get(position).getOrganization();

            TextView name = (TextView) view.findViewById(R.id.name);
            Button btn = (Button) view.findViewById(R.id.btn_check);
            btn.setOnClickListener(new OnClickListener() {

                @Override
                public void onClick(View v) {
                    context.doSelection(currentOrg);

                }
            });

       if(currentOrg.isSelected()){
            btn.setBackgroundResource(R.drawable.sub_search_tick);
        }else{
            btn.setBackgroundResource(R.drawable.sub_search_tick_box);
        }

    }

En cela, vous pouvez obtenir le bouton objet cliqué pour l'activité. (Spécialement lorsque vous souhaitez que le bouton agisse comme une case à cocher avec les états sélectionnés et non sélectionnés):

    public void doSelection(Organization currentOrg) {
        Log.e("Btn clicked ", currentOrg.getOrgName());
        if (currentOrg.isSelected() == false) {
            currentOrg.setSelected(true);
        } else {
            currentOrg.setSelected(false);
        }
        adapter.notifyDataSetChanged();

    }
1
TharakaNirmana

Classe pour ArrayList & ArrayAdapter

class RequestClass {
    private String Id;
    private String BookingTime;
    private String UserName;
    private String Rating;

    public RequestClass(String Id,String bookingTime,String userName,String rating){
        this.Id=Id;
        this.BookingTime=bookingTime;
        this.UserName=userName;
        this.Rating=rating;
    }

    public String getId(){return Id; }
    public String getBookingTime(){return BookingTime; }
    public String getUserName(){return UserName; }
    public String getRating(){return Rating; }


}

Activité principale:

 ArrayList<RequestClass> _requestList;
    _requestList=new ArrayList<>();
                    try {
                        JSONObject jsonobject = new JSONObject(result);
                        JSONArray JO = jsonobject.getJSONArray("Record");
                        JSONObject object;
                        for (int i = 0; i < JO.length(); i++) {
                            object = (JSONObject) JO.get(i);

                            _requestList.add(new RequestClass( object.optString("playerID"),object.optString("booking_time"),
                                    object.optString("username"),object.optString("rate") ));
                        }//end of for loop

                        RequestCustomAdapter adapter = new RequestCustomAdapter(context, R.layout.requestlayout, _requestList);
                        listView.setAdapter(adapter);

Classe d'adaptateur personnalisé

import Android.content.Context;
import Android.support.annotation.NonNull;
import Android.view.LayoutInflater;
import Android.view.View;
import Android.view.ViewGroup;
import Android.widget.ArrayAdapter;
import Android.widget.Button;
import Android.widget.RelativeLayout;
import Android.widget.TextView;
import Android.widget.Toast;

import Java.util.ArrayList;

/**
 * Created by wajid on 1/12/2018.
 */

class RequestCustomAdapter extends ArrayAdapter<RequestClass> {
    Context mContext;
    int mResource;
    public RequestCustomAdapter(Context context, int resource,ArrayList<RequestClass> objects) {
        super(context, resource, objects);
        mContext=context;
        mResource=resource;
    }
    public static class ViewHolder{
        RelativeLayout _layout;
        TextView _bookingTime;
        TextView _ratingTextView;
        TextView _userNameTextView;
        Button acceptButton;
        Button _rejectButton;
    }

    @NonNull
    @Override
    public View getView(final int position, View convertView, ViewGroup parent){
       final ViewHolder holder;
        if(convertView == null) {
            LayoutInflater inflater=LayoutInflater.from(mContext);
            convertView=inflater.inflate(mResource,parent,false);
            holder=new ViewHolder();
            holder._layout = convertView.findViewById(R.id.requestLayout);
            holder._bookingTime = convertView.findViewById(R.id.bookingTime);
            holder._userNameTextView = convertView.findViewById(R.id.userName);
            holder._ratingTextView = convertView.findViewById(R.id.rating);
            holder.acceptButton = convertView.findViewById(R.id.AcceptRequestButton);
            holder._rejectButton = convertView.findViewById(R.id.RejectRequestButton);

            holder._rejectButton.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    Toast.makeText(mContext, holder._rejectButton.getText().toString(), Toast.LENGTH_SHORT).show();
                }
            });

            holder.acceptButton.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    Toast.makeText(mContext, holder.acceptButton.getText().toString(), Toast.LENGTH_SHORT).show();
                }
            });


            convertView.setTag(holder);

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

        }
        holder._bookingTime.setText(getItem(position).getBookingTime());
        if(!getItem(position).getUserName().equals("")){

            holder._userNameTextView.setText(getItem(position).getUserName());
        }
        if(!getItem(position).getRating().equals("")){
            holder._ratingTextView.setText(getItem(position).getRating());
        }
        return  convertView;
    }

}

ListView dans Main xml:

<ListView
        Android:layout_width="match_parent"
        Android:layout_height="match_parent"
        Android:focusable="true"
        Android:id="@+id/AllRequestListView">

    </ListView>

Disposition des ressources pour la vue liste requestlayout.xml:

<RelativeLayout
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:id="@+id/requestLayout"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent">
    <TextView
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content"
        Android:id="@+id/bookingTime"/>
    <TextView
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content"
        Android:layout_below="@+id/bookingTime"
        Android:text="Temp Name"
        Android:id="@+id/userName"/>
    <TextView
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content"
        Android:layout_below="@+id/userName"
        Android:text="No Rating"
        Android:id="@+id/rating"/>
    <Button
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content"
        Android:id="@+id/AcceptRequestButton"
        Android:focusable="false"
        Android:layout_below="@+id/rating"
        Android:text="Accept"/>
    <Button
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content"
        Android:id="@+id/RejectRequestButton"
        Android:layout_below="@+id/AcceptRequestButton"
        Android:focusable="false"
        Android:text="Reject"
        />

</RelativeLayout>
0
Wajid khan

Je trouve

final Button yourButton = (Button)view.findViewById(R.id.your_button);
yourButton.setFocusable(false);
yourButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
        ...///);

peut résoudre le problème. Si vous souhaitez obtenir des données lorsque vous cliquez sur le bouton, l’utilisation de balises est utile. Ici, le bouton est déclaré final car il sera utilisé dans la classe interne.

0
FrankJenq

Dans la méthode getview, mettez l'auditeur en dehors de la vérification de la vue ... essayez de suivre ceci ... cela a fonctionné dans mon cas .. Comment augmenter ou diminuer la valeur de edittext dans listview de chaque ligne?

0
Aditya

POUR LES UTILISATEURS DE KOTLIN

dans votre méthode getView (...) si vous essayez de démarrer une activité avec le bouton onClickListener:

   myButton.setOnClickListener{
        val intent = Intent(this@CurrentActivity, SecondActivity::class.Java)
        startActivity(intent)
   }

Passer le bon pointeur pour "this"

0
Asim