Android:如何在 ListView 的列表项中为 Button 设置 onClick 事件
Posted
技术标签:
【中文标题】Android:如何在 ListView 的列表项中为 Button 设置 onClick 事件【英文标题】:Android : How to set onClick event for Button in List item of ListView 【发布时间】:2012-09-17 18:03:43 【问题描述】:我想为Listview
项目中使用的按钮添加onClick
事件。
如何为列表项中的按钮提供onClick
事件。
【问题讨论】:
用你做过的代码解释一下??? 发布您的自定义lisview代码。 另见***.com/questions/2098558/… 我的解决方案已经写在这个链接***.com/questions/2098558/… 【参考方案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_
android:layout_
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_
android:layout_>
<TextView
android:layout_
android:layout_
android:id="@+id/bookingTime"/>
<TextView
android:layout_
android:layout_
android:layout_below="@+id/bookingTime"
android:text="Temp Name"
android:id="@+id/userName"/>
<TextView
android:layout_
android:layout_
android:layout_below="@+id/userName"
android:text="No Rating"
android:id="@+id/rating"/>
<Button
android:layout_
android:layout_
android:id="@+id/AcceptRequestButton"
android:focusable="false"
android:layout_below="@+id/rating"
android:text="Accept"/>
<Button
android:layout_
android:layout_
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”传递正确的指针
【讨论】:
以上是关于Android:如何在 ListView 的列表项中为 Button 设置 onClick 事件的主要内容,如果未能解决你的问题,请参考以下文章
当您在 android listview 中滑动任何列表项时想要调用
在 Android 中以编程方式创建带有自定义列表项的 ListView - 没有 xml 列表项布局