【问题标题】:Android : How to set onClick event for Button in List item of ListViewAndroid:如何在 ListView 的列表项中为 Button 设置 onClick 事件
【发布时间】:2012-09-17 18:03:43
【问题描述】:

我想为Listview 项目中使用的按钮添加onClick 事件。 如何为列表项中的按钮提供onClick 事件。

【问题讨论】:

标签: android listview


【解决方案1】:

在适配器类中

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 不可聚焦?我的意思是当我们这样做时会发生什么?
  • ListView 仅响应单击行但 Button 将停止获得焦点。当我们添加复选框、图像视图或按钮时,有时 Listview 会停止响应单击
  • 嗨。感谢您提供此解决方案。以及如何将数据发送回包含 Listview 的活动?更清楚的是,适配器如何将一行 imageButtowm 上的点击事件发送到父活动。 (因为我需要父活动做出反应。
  • @Franck 尝试使用处理程序发回数据。
  • 这非常有效,而且一定是正确的答案。 ListView 可聚焦 true,按钮可聚焦 false。谢谢!
【解决方案2】:

您可以在自定义适配器的getView 方法中设置onClick 事件..
检查链接http://androidforbeginners.blogspot.it/2010/03/clicking-buttons-in-listview-row.html

【讨论】:

  • UI 操作或侦听器不应在适配器中完成。如果我想把它带到调用活动中。我该怎么做?
【解决方案3】:

试试这个,

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

也许对你有帮助....

【讨论】:

  • 每个 convertView 只能设置一个 ClickListener
  • 但是你会在每个getView上创建OnClickListener对象,这样还不错吧?
【解决方案4】:

在您的自定义适配器中的 getView 方法中:

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

【讨论】:

  • 这里如何获取列表项详细信息,如位置和所有
【解决方案5】:

这已在许多帖子中讨论过,但我仍然无法找到解决方案:

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

以下解决方案适用于任何 ui 组件:Button、ImageButtons、ImageView、Textview。 LinearLayout,RelativeLayout在listview单元格内点击,也会响应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
【解决方案6】:

我假设您已经为您的 ListView 定义了自定义适配器。

如果是这种情况,那么您可以在自定义适配器的 getView() 方法中为您的按钮分配 onClickListener

【讨论】:

    【解决方案7】:

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

    主xml中的ListView:

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

    【讨论】:

      【解决方案8】:

      在 getview 方法中,将侦听器放在检查视图之外..尝试遵循这个..它在我的情况下有效..How to Increase or decrease value of edittext in listview's each row?

      【讨论】:

        【解决方案9】:

        我发现

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

        可以解决问题。如果您想在单击按钮时获取一些数据,使用标签很有帮助。这里按钮被声明为final,因为它将在内部类中使用。

        【讨论】:

        • 这没有提供问题的答案。您可以search for similar questions,或参考页面右侧的相关和链接问题找到答案。如果您有一个相关但不同的问题,ask a new question,并包含指向此问题的链接以帮助提供上下文。见:Ask questions, get answers, no distractions
        • 它应该是一个答案吗?
        • 我只是在设置 OnClickListener 之前添加了第一行,它似乎工作,但我不知道为什么。
        【解决方案10】:

        对于 KOTLIN 用户

        如果您尝试通过按钮 onClickListener 启动活动,请在 getView(...) 方法中:

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

        为“this”传递正确的指针

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2019-08-12
          • 2022-09-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-12-28
          相关资源
          最近更新 更多