Android: Як встановити подію onClick для кнопки у елементі списку ListView


80

Я хочу додати onClickподію для кнопок, що використовуються в елементі Listview. Як я можу дати onClickподію для кнопок у елементі списку.


2
Потурбуйтесь пояснити кодом, який ви зробили ???
Renjith

Опублікуйте свій код спеціального lisview.
Chirag


Я написав своє рішення за цим посиланням stackoverflow.com/questions/2098558/…
Сем

Відповіді:


67

Ви можете встановити onClickподію getViewметодом власного адаптера .
Перевірте посилання http://androidforbeginners.blogspot.it/2010/03/clicking-buttons-in-listview-row.html


10
Операції з інтерфейсом користувача або прослуховувачі не повинні виконуватися в адаптері. Якщо я хочу донести це до телефонної діяльності. Як мені це зробити?
CodeShadow

98

У класі адаптера

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

Але ви можете отримати проблему - рядок listView не можна натиснути . Рішення:

  • зробити ListView сфокусованим android:focusable="true"
  • Кнопка не фокусується android:focusable="false"

Навіщо робити ListViewфокусування та Buttonне фокусування? Я маю на увазі, що відбувається, коли ми робимо це?
Помилки трапляються

2
ListView відповідає лише на натискання рядка, але кнопка перестає отримувати фокус. Коли ми додаємо прапорець, перегляд зображення або кнопку, то деякий час Listview зупиняє відповідь на клік
mukesh

1
Привіт. Дякую за це рішення. І як відправити дані назад до діяльності, яка містить Listview? Більш зрозуміло, як адаптер може надіслати подію клацання на рядок imageButtowm батьківській діяльності. (тому що мені потрібна батьківська діяльність, щоб реагувати.
Франк,

@Franck спробуйте використати обробник для повернення даних назад.
Бінг Лан

Це спрацювало чудово, і це повинна бути правильна відповідь. ListView фокусується true, кнопка фокусується false. Дякую!
Юозас,

13

Спробуйте це,

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

Це може вам допомогти ....


3
Ви повинні встановити лише один ClickListener для convertView
Arvis

1
Але ви будете створювати об'єкт OnClickListener на кожному getView, це непогано?
Даніель Гомес Ріко

3

У вашому користувацькому адаптері всередині методу getView:

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

Ось як отримати деталі списку, такі як позиція та все
інше

2

Це обговорювалось у багатьох повідомленнях, але я все ще не міг знайти рішення за допомогою:

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

Наведене нижче рішення буде працювати з будь-яким із компонентів інтерфейсу користувача: Button, ImageButtons, ImageView, Textview. LinearLayout, RelativeLayout клацає всередині комірки перегляду списку, а також реагуватиме на onItemClick:

Клас адаптера - 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);
        }

    }

У цьому ви можете отримати кнопку, натиснуту на об'єкт діяльності. (Особливо, коли ви хочете, щоб кнопка діяла як прапорець із вибраними та невибраними станами):

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

    }

Ось посилання для завантаження на заархівований проект Android Studio, який робить саме те, що ви хочете. Він чудово працює і ретельно перевірений. developersfound.com/ListButtonClickExample.zip Також техніка в цьому проекті також працює з новими RecycleLists
user2288580

1

Я припускаю, що ви визначили спеціальний адаптер для вашого ListView.

Якщо це так, тоді ви можете призначити onClickListenerдля своєї кнопки всередині getView()способу користувацького адаптера .



0

Клас для 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; }


}

Основна діяльність:

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

Спеціальний клас адаптера

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 у головному xml:

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

    </ListView>

Макет ресурсу для подання списку 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

я знайшов

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

може вирішити проблему. Якщо ви хочете отримати деякі дані, натиснувши кнопку, корисно використовувати теги. Тут кнопка оголошена остаточною, оскільки вона буде використовуватися у внутрішньому класі.


Це не дає відповіді на запитання. Ви можете шукати подібні запитання або шукати відповіді на пов’язані та пов’язані запитання в правій частині сторінки. Якщо у вас пов’язане, але інше запитання, поставте нове запитання та додайте посилання на це, щоб допомогти надати контекст. Дивіться: Задавайте запитання, отримуйте відповіді, не відволікайте уваги
Фільнор,

це має бути відповідь?
Джим Джонс,

Я просто додаю перший рядок перед тим, як встановити OnClickListener, і це, здається, працює, але я не знаю чому.
FrankJenq,

0

ДЛЯ КОРИСТУВАЧІВ KOTLIN

всередині вашого методу getView (...), якщо ви намагаєтеся розпочати діяльність за допомогою кнопки onClickListener:

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

Передайте правильний вказівник на "це"

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.