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?.
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
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:
Android:focusable="true"
Android:focusable="false"
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 ....
Dans votre adaptateur personnalisé dans la méthode getView:
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// Do things Here
}
});
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é.
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();
}
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>
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.
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?
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"