Android: So legen Sie das onClick-Ereignis für Button im Listenelement von ListView fest


79

Ich möchte ein onClickEreignis für Schaltflächen hinzufügen , die in Element von verwendet werden Listview. Wie kann ich ein onClickEreignis für Schaltflächen im Listenelement angeben?


2
Möchtest du mit etwas Code erklären, den du gemacht hast ???
Renjith

Veröffentlichen Sie Ihren Code für die benutzerdefinierte Ansicht.
Chirag


Ich habe meine Lösung in diesem Link geschrieben stackoverflow.com/questions/2098558/…
Sam

Antworten:



98

In der Adapterklasse

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) {
            //...
        }
    });
}

Es kann jedoch zu einem Problem kommen - die listView-Zeile kann nicht angeklickt werden . Lösung:

  • ListView fokussierbar machen android:focusable="true"
  • Taste nicht fokussierbar android:focusable="false"

Warum ListViewfokussierbar und Buttonnicht fokussierbar machen? Ich meine, was passiert, wenn wir das tun?
Bugs passieren

2
ListView reagiert nur auf das Klicken auf eine Zeile, aber die Schaltfläche erhält keinen Fokus mehr. Wenn wir ein Kontrollkästchen, eine Bildansicht oder eine Schaltfläche hinzufügen, stoppt Listview die Antwort auf Klick
Mukesh

1
Hallo. Danke für diese Lösung. Und wie senden Sie die Daten an die Aktivität zurück, die die Listenansicht enthält? Klarer, wie der Adapter das Klickereignis in einer Zeile imageButtowm an die übergeordnete Aktivität senden kann. (weil ich die Elternaktivität brauche, um zu reagieren.
Franck

@Franck versuchen Sie mit dem Handler Daten zurückzusenden.
Bing Lan

Dies hat perfekt funktioniert und muss die richtige Antwort sein. ListView fokussierbar wahr, Schaltfläche fokussierbar falsch. Vielen Dank!
Juozas

13

Versuche dies,

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 ;
}

Es kann Ihnen helfen ...


3
Sie müssen nur einen ClickListener pro convertView
Arvis

1
Aber Sie werden OnClickListener-Objekt auf jedem getView erstellen, das ist nicht schlecht?
Daniel Gomez Rico

3

In Ihrem benutzerdefinierten Adapter in der getView-Methode:

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

Hier, wie man die Details des Listenelements wie Postion und alles
bekommt

2

Dies wurde in vielen Beiträgen diskutiert, aber ich konnte immer noch keine Lösung finden mit:

android:focusable="false"
android:focusableInTouchMode="false"
android:focusableInTouchMode="false"

Die folgende Lösung funktioniert mit allen UI-Komponenten: Button, ImageButtons, ImageView, Textview. LinearLayout, RelativeLayout klickt in eine Listenansichtszelle und antwortet auch auf onItemClick:

Adapterklasse - 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);
        }

    }

In diesem Fall können Sie das auf die Schaltfläche geklickte Objekt zur Aktivität bringen. (Insbesondere, wenn die Schaltfläche als Kontrollkästchen für ausgewählte und nicht ausgewählte Status fungieren soll):

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

    }

Hier ist ein Download-Link zu einem komprimierten Android Studio-Projekt, das genau das tut, was Sie wollen. Es funktioniert perfekt und ist gründlich getestet. developerfound.com/ListButtonClickExample.zip Auch die Technik in diesem Projekt funktioniert mit den neuen RecycleLists
user2288580

1

Ich gehe davon aus, dass Sie einen benutzerdefinierten Adapter für Ihre ListView definiert haben.

Wenn dies der Fall ist, können Sie onClickListenerIhre Schaltfläche innerhalb der getView()Methode des benutzerdefinierten Adapters zuweisen .



0

Klasse für 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; }


}

Hauptaktivität:

 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);

Benutzerdefinierte Adapterklasse

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 in der Haupt-XML:

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

    </ListView>

Ressourcenlayout für die Listenansicht 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

ich finde

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

kann das Problem lösen. Wenn Sie beim Klicken auf die Schaltfläche Daten abrufen möchten, ist die Verwendung von Tags hilfreich. Hier wird die Schaltfläche als endgültig deklariert, da sie innerhalb der inneren Klasse verwendet wird.


Dies gibt keine Antwort auf die Frage. Sie können nach ähnlichen Fragen suchen oder auf die verwandten und verknüpften Fragen auf der rechten Seite der Seite verweisen, um eine Antwort zu finden. Wenn Sie eine verwandte, aber andere Frage haben, stellen Sie eine neue Frage und fügen Sie einen Link zu dieser hinzu, um den Kontext bereitzustellen. Siehe: Fragen stellen, Antworten erhalten, keine Ablenkungen
Filnor

soll es eine antwort sein
Jim Jones

Ich füge nur die erste Zeile hinzu, bevor ich einen OnClickListener einstelle, und es scheint zu funktionieren, aber ich weiß nicht warum.
FrankJenq

0

FÜR KOTLIN-BENUTZER

in Ihrer Methode getView (...), wenn Sie versuchen, eine Aktivität über die Schaltfläche onClickListener zu starten:

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

Übergeben Sie den richtigen Zeiger für "dies"

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.