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?
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(newOnClickListener()
{
@OverridepublicvoidonClick(View v)
{
// Your code that you want to execute on this button click
}
});
return convertView ;
}
Die folgende Lösung funktioniert mit allen UI-Komponenten: Button, ImageButtons, ImageView, Textview. LinearLayout, RelativeLayout klickt in eine Listenansichtszelle und antwortet auch auf onItemClick:
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):
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 .
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.
Antworten:
Sie können das
onClick
Ereignis in dergetView
Methode Ihres benutzerdefinierten Adapters festlegen .Überprüfen Sie den Link http://androidforbeginners.blogspot.it/2010/03/clicking-buttons-in-listview-row.html
quelle
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:
android:focusable="true"
android:focusable="false"
quelle
ListView
fokussierbar undButton
nicht fokussierbar machen? Ich meine, was passiert, wenn wir das tun?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 ...
quelle
In Ihrem benutzerdefinierten Adapter in der getView-Methode:
button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // Do things Here } });
quelle
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(); }
quelle
Ich gehe davon aus, dass Sie einen benutzerdefinierten Adapter für Ihre ListView definiert haben.
Wenn dies der Fall ist, können Sie
onClickListener
Ihre Schaltfläche innerhalb dergetView()
Methode des benutzerdefinierten Adapters zuweisen .quelle
Bei der getview-Methode überprüfen Sie den Listener außerhalb der Ansicht. Versuchen Sie, dies zu befolgen. In meinem Fall hat es funktioniert. Wie kann der Wert von edittext in jeder Zeile der Listenansicht erhöht oder verringert werden?
quelle
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>
quelle
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.
quelle
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"
quelle