gpt4 book ai didi

java - ListView行按钮:如何创建将View.OnClickListener连接到ListView每行按钮的自定义适配器?

转载 作者:太空狗 更新时间:2023-10-29 15:36:39 25 4
gpt4 key购买 nike

我希望我的ListView包含按钮,但是设置按钮的XML属性onclick=“myFunction”,然后在活动中放置公共void myFunction(android.view.view view view)方法会导致抛出NoSuchMethodException(堆栈跟踪为空)。尽管onclick监听器在那里,但它不会触发myfunction(…)并导致活动关闭。
如何创建将view.onClickListener连接到ListView每行上的按钮的自定义适配器?
我的列表视图创建如下…
[活动.java内容..]

public void myFunction(android.view.View view)
{
//Do stuff
}

[活动.xml内容..]
<LinearLayout xmlns:tools="http://schemas.android.com/tools" xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context=".FrmCustomerDetails" >
<ListView android:id="@+id/LstCustomerDetailsList" android:layout_width="fill_parent" android:layout_height="0dip" android:layout_weight="1" android:clickable="true" android:clipChildren="true" android:divider="@null" android:dividerHeight="0dp" android:fastScrollEnabled="true" android:footerDividersEnabled="false" android:headerDividersEnabled="false" android:requiresFadingEdge="vertical" android:smoothScrollbar="true" />
</LinearLayout>

[活动行项目.xml内容..]
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/Llt" android:layout_width="match_parent" android:layout_height="match_parent" >
<Button android:id="@+id/Btn" android:text="Click me" android:onClick="myFunction" />
</LinearLayout>

最佳答案

下面是如何创建自定义适配器,将view.onclicklistener连接到每行有一个按钮的ListView…
1。为典型行创建布局
在这种情况下,行由三个视图组件组成:
名称(编辑文本)
值(edittext:inputtype=“numberDecimal”)
删除(按钮)
XML
pay_list_item.xml布局如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >

<EditText
android:id="@+id/pay_name"
android:layout_width="0dp"
android:layout_height="fill_parent"
android:layout_weight="2"
android:hint="Name" />

<EditText
android:id="@+id/pay_value"
android:layout_width="0dp"
android:layout_height="fill_parent"
android:layout_weight="1"
android:inputType="numberDecimal"
android:text="0.0" />

<Button
android:id="@+id/pay_removePay"
android:layout_width="100dp"
android:layout_height="fill_parent"
android:text="Remove Pay"
android:onClick="removePayOnClickHandler" />

</LinearLayout>

注意:按钮在XML布局文件中定义了onclick处理程序,因为我们希望将其操作引用到特定的列表项。
这样做意味着处理程序将在活动文件中实现,并且每个按钮都知道它属于哪个列表项。
2。创建列表项适配器
这是Java类,它是PayjListIt.xml的控制器。
它保留所有视图的引用,还将这些引用放入标记中,扩展arrayadapter接口。
Adapter:
public class PayListAdapter extends ArrayAdapter<Payment> {

private List<Payment> items;
private int layoutResourceId;
private Context context;

public PayListAdapter(Context context, int layoutResourceId, List<Payment> items) {
super(context, layoutResourceId, items);
this.layoutResourceId = layoutResourceId;
this.context = context;
this.items = items;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
View row = convertView;
PaymentHolder holder = null;

LayoutInflater inflater = ((Activity) context).getLayoutInflater();
row = inflater.inflate(layoutResourceId, parent, false);

holder = new PaymentHolder();
holder.Payment = items.get(position);
holder.removePaymentButton = (ImageButton)row.findViewById(R.id.pay_removePay);
holder.removePaymentButton.setTag(holder.Payment);

holder.name = (TextView)row.findViewById(R.id.pay_name);
holder.value = (TextView)row.findViewById(R.id.pay_value);

row.setTag(holder);

setupItem(holder);
return row;
}

private void setupItem(PaymentHolder holder) {
holder.name.setText(holder.Payment.getName());
holder.value.setText(String.valueOf(holder.Payment.getValue()));
}

public static class PaymentHolder {
Payment Payment;
TextView name;
TextView value;
ImageButton removePaymentButton;
}
}

这里我们列出了付款类项目。
这里有三个最重要的元素:
paylistadapter构造函数:设置一些私有字段并调用超类构造函数。它还获取支付对象的列表。它的实施是必须的。
paymentholder:静态类,它保存对必须在此列表项中设置的所有视图的引用。我还将引用此特定项目的付款对象保留在列表中。我将其设置为imagebutton的标记,这将帮助我在列表中找到用户要删除的付款项目
重写的getview方法:由超类调用。它的目标是返回单个列表行。我们创建它的字段并设置它们的值并将它们存储在静态保持器中。然后将holder放入行的tag元素中。请注意,存在性能问题,因为每次显示行时都会重新创建该行。我曾经在holder中添加一些标志,比如iscreated,并在已经创建行之后将其设置为true。然后您可以添加if语句并读取标记的持有者,而不是从头开始创建它。
payment.java目前非常简单,它看起来有点像BasicNameValuePair:
public class Payment implements Serializable {
private String name = "";
private double value = 0;

public Payment(String name, double value) {
this.setName(name);
this.setValue(value);
}
...
}

没有显示每个私有字段的其他get和set。
三。将ListView添加到活动布局XML文件
以最简单的形式,将此视图添加到活动布局就足够了:
<ListView 
android:id="@+id/EnterPays_PaysList"
android:layout_width="fill_parent"
android:layout_height="wrap_content">
</ListView>

4。在活动Java代码中将适配器设置到此列表视图
为了在listview中显示项目,您需要设置它的适配器并将其映射到支付对象的其他arrayList(因为我在这里扩展了一个数组适配器)。下面是负责将适配器绑定到EditPersonData.getPayments()ArrayList的代码:
PayListAdapter adapter = new PayListAdapter(AddNewPerson.this, R.layout.pay_list_item, editPersonData.getPayments());
ListView PaysListView = (ListView)findViewById(R.id.EnterPays_PaysList);
PaysListView.setAdapter(adapter);

5。向ListView添加/删除项(及其适配器)
适配器的处理方式与任何其他ArrayList一样,因此向其添加新元素非常简单,如:
Payment testPayment = new Payment("Test", 13);
adapter.add(testPayment);
adapter.remove(testPayment);

6。处理删除付款按钮单击事件
在显示listview的活动代码中,添加将处理remove button click操作的公共方法。方法名必须与pay_list_item.xml中的方法名完全相同:
android:onClick="removePayOnClickHandler"
The method body is as follows:

public void removePayOnClickHandler(View v) {
Payment itemToRemove = (Payment)v.getTag();
adapter.remove(itemToRemove);
}

付款对象存储在ImageButton的标记元素中。现在可以从标记中读取它,并从适配器中删除此项。
7。合并删除确认对话框窗口
可能还需要确保用户在确认对话框中询问其他问题,从而故意按下删除按钮。
对话
a)创建对话框的ID常量
这只是对话框的ID。它在当前活动处理的任何其他对话框窗口中应该是唯一的。我是这样设置的:
protected static final int DIALOG_REMOVE_CALC = 1;
protected static final int DIALOG_REMOVE_PERSON = 2;

b)生成对话框
我使用此方法生成对话框窗口:
private Dialog createDialogRemoveConfirm(final int dialogRemove) {
return new AlertDialog.Builder(getApplicationContext())
.setIcon(R.drawable.trashbin_icon)
.setTitle(R.string.calculation_dialog_remove_text)
.setPositiveButton(R.string.calculation_dialog_button_ok, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
handleRemoveConfirm(dialogRemove);
}
})
.setNegativeButton(R.string.calculation_dialog_button_cancel, null)
.create();
}

这里使用AlertDialog生成器模式。我不处理否定按钮点击操作-默认情况下,对话框只是被隐藏。如果单击对话框的“确认”按钮,将调用我的handleRemoveConfirm回调,并根据对话框的ID执行操作:
protected void handleRemoveConfirm(int dialogType) {
if(dialogType == DIALOG_REMOVE_PERSON){
calc.removePerson();
}else if(dialogType == DIALOG_REMOVE_CALC){
removeCalc();
}
}

c)显示对话框
单击“删除”按钮后显示对话框。showDialog(int)是Android活动的方法:
OnClickListener removeCalcButtonClickListener = new OnClickListener() {
public void onClick(View v) {
showDialog(DIALOG_REMOVE_CALC);
}
};

showDialog(int)方法调用onCreateDialog(也在活动的类中定义)。覆盖它并告诉应用程序在请求ShowDialog时应执行的操作:
@Override
protected Dialog onCreateDialog(int id) {
switch (id) {
case DIALOG_REMOVE_CALC:
return createDialogRemoveConfirm(DIALOG_REMOVE_CALC);
case DIALOG_REMOVE_PERSON:
return createDialogRemoveConfirm(DIALOG_REMOVE_PERSON);
}
}

关于java - ListView行按钮:如何创建将View.OnClickListener连接到ListView每行按钮的自定义适配器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16076985/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com