这是创建自定义适配器的方法,该方法通过每行一个按钮将View.OnClickListener连接到ListView。
1.为典型的行创建布局
在这种情况下,该行由三个视图组件组成:
- 名称(EditText)
- 值(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类,它是pay_list_item.xml的控制器。
它保留其所有视图的引用,还将这些引用放入标记中,从而扩展了ArrayAdapter接口。
适配器:
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:静态类,其中包含对我必须在此列表项中设置的所有视图的引用。我还将保留引用该特定项目的Payment对象在列表中。我将其设置为ImageButton的标记,这将帮助我在列表中找到该用户想要删除的“付款”项
- 重写getView方法:由超类调用。其目标是返回单个列表行。我们创建其字段并设置其值,并将其存储在静态持有人中。然后将持有人放入行的tag元素中。请注意,存在性能问题,因为每次显示该行时都会重新创建该行。我曾经在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); }...}
每个未显示的专用字段都有其他获取和设置。
3.将ListView添加到活动布局xml文件中
以最简单的形式,将这个视图添加到活动布局就足够了:
<ListView android:id="@+id/EnterPays_PaysList" android:layout_width="fill_parent" android:layout_height="wrap_content"></ListView>
4.在活动Java代码中将适配器设置为此列表视图
为了在ListView中显示项目,您需要设置其适配器并将其映射到其他一些Payment对象的ArrayList(因为我在这里扩展了Array适配器)。这是负责将适配器绑定到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按钮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的Tag元素中。现在就足以从Tag中读取它,并将其从适配器中删除。
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构建器模式。我不处理NegativeButton单击动作-
默认情况下,该对话框只是隐藏的。如果单击对话框的确认按钮,则会调用我的handleRemove/confirm/i回调,并根据对话框的ID执行 *** 作:
protected void handleRemoveConfirm(int dialogType) { if(dialogType == DIALOG_REMOVE_PERSON){ calc.removePerson(); }else if(dialogType == DIALOG_REMOVE_CALC){ removeCalc(); }}
c)显示对话框
单击删除按钮后显示对话框。showDialog(int)是Android的Activity的方法:
onClickListener removeCalcButtonClickListener = new onClickListener() { public void onClick(View v) { showDialog(DIALOG_REMOVE_CALC); }};
showDialog(int)方法调用onCreateDialog(也在Activity类中定义)。覆盖它,并告诉您的应用程序如果请求showDialog时该怎么做:
@Overrideprotected Dialog onCreateDialog(int id) { switch (id) { case DIALOG_REMOVE_CALC: return createDialogRemoveConfirm(DIALOG_REMOVE_CALC); case DIALOG_REMOVE_PERSON: return createDialogRemoveConfirm(DIALOG_REMOVE_PERSON); }}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)