- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在我的 Activity 中,我显示了一个数据列表,每一行都有一个编辑和删除按钮。这些按钮的监听器在 ListView 适配器内定义。
我已经实现了一个自定义数组适配器:
public class SalesArrayAdapter extends ArrayAdapter<SaleModel> {
private Context context;
private int altColour;
private SaleModel sale;
private int position;
private ArrayList<SaleModel> sales;
private static class ViewHolder{
RelativeLayout container;
TextView tvId;
TextView tvDate;
TextView tvBusNo;
TextView tvDriver;
TextView tvNoOfTrips;
TextView tvTotalExpenditure;
TextView tvTotal;
TextView tvAmountReceived;
TextView tvStatus;
TextView tvReceiptCode;
ImageButton btnEdit;
ImageButton btnRemove;
}
public SalesArrayAdapter(@NonNull Context context, @NonNull ArrayList<SaleModel> sales) {
super(context, R.layout.row_sales, sales);
//this.getContext() = getContext();
//this.sales = sales;
}
@NonNull
@TargetApi(Build.VERSION_CODES.JELLY_BEAN)
@Override
public View getView(final int position, View convertView, @NonNull ViewGroup parent) {
// Get the data item for this position
sale = getItem(position);
// Check if an existing view is being reused, otherwise inflate the view
ViewHolder viewHolder; // view lookup cache stored in tag
if (convertView == null) {
// If there's no view to re-use, inflate a brand new view for row
viewHolder = new ViewHolder();
LayoutInflater inflater = LayoutInflater.from(getContext());
convertView = inflater.inflate(R.layout.row_sales, parent, false);
viewHolder.container = (RelativeLayout) convertView.findViewById(R.id.row_sales_ll_container);
viewHolder.tvId = (TextView) convertView.findViewById(R.id.row_sales_tv_id);
viewHolder.tvDate = (TextView) convertView.findViewById(R.id.row_sales_tv_date);
viewHolder.tvDriver = (TextView) convertView.findViewById(R.id.row_sales_tv_driver);
viewHolder.tvNoOfTrips = (TextView) convertView.findViewById(R.id.row_sales_tv_total_no_of_trips);
viewHolder.tvTotalExpenditure = (TextView) convertView.findViewById(R.id.row_sales_tv_total_expenditure);
viewHolder.tvTotal = (TextView) convertView.findViewById(R.id.row_sales_tv_total);
viewHolder.tvAmountReceived = (TextView) convertView.findViewById(R.id.row_sales_tv_amount_received);
viewHolder.tvStatus = (TextView) convertView.findViewById(R.id.row_sales_tv_status);
viewHolder.tvReceiptCode = (TextView) convertView.findViewById(R.id.row_sales_tv_receipt_code);
viewHolder.btnEdit = (ImageButton) convertView.findViewById(R.id.row_sales_btn_edit);
viewHolder.btnRemove = (ImageButton) convertView.findViewById(R.id.row_sales_btn_trash);
// Cache the viewHolder object inside the fresh view
convertView.setTag(viewHolder);
} else {
// View is being recycled, retrieve the viewHolder object from tag
viewHolder = (ViewHolder) convertView.getTag();
}
// Populate the data from the data object via the viewHolder object
// into the template view.
if (altColour == 0) {
viewHolder.container.setBackgroundColor(Color.parseColor("#FFFFFF"));
altColour = 1;
} else {
viewHolder.container.setBackgroundColor(Color.parseColor("#EFEFEF"));
altColour = 0;
}
viewHolder.tvId.setText(String.valueOf(sale.getId()));
viewHolder.tvDate.setText(sale.getDate());
viewHolder.tvDriver.setText(sale.getDriver());
double totalTripsAmount = 0;
for(int c = 0; c < sale.getTrips().length(); c++) {
try {
totalTripsAmount += sale.getTrips().getJSONObject(c).getDouble("trip_amount");
} catch (JSONException e) {
e.printStackTrace();
}
}
viewHolder.tvNoOfTrips.setText("GHS "+totalTripsAmount);
double totalExpenditureAmount = 0;
for(int c = 0; c < sale.getExpenditure().length(); c++) {
try {
totalExpenditureAmount += sale.getExpenditure().getJSONObject(c).getDouble("amount");
} catch (JSONException e) {
e.printStackTrace();
}
}
viewHolder.tvTotalExpenditure.setText("GHS "+totalExpenditureAmount);
viewHolder.tvTotal.setText("GHS "+sale.getTotal());
viewHolder.tvAmountReceived.setText("GHS "+sale.getAmountReceived());
viewHolder.tvStatus.setText(sale.getIsPending() == 1 ? "Pending" : "Complete");
viewHolder.tvReceiptCode.setText(sale.getReceiptCode());
viewHolder.btnEdit.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent editSaleIntent = new Intent(getContext(), EditSaleActivity.class);
editSaleIntent.putExtra("sale", sale.toJson().toString());
((Activity) getContext()).startActivityForResult(editSaleIntent, 800);
}
});
viewHolder.btnRemove.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
int pos = new Integer(getPosition(sale));
removeSale(pos);
}
});
// Return the completed view to render on screen
return convertView;
}
private void removeSale(final int position) {
AlertDialog.Builder builder = new AlertDialog.Builder(getContext());
builder.setTitle("Confirm");
builder.setMessage("Are you sure you want to delete?");
builder.setPositiveButton("YES", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
//Log.i("btnYes", "works");
SalesRequest salesRequest = new SalesRequest(getContext());
remove(getItem(position));
notifyDataSetChanged();
salesRequest.remove(getItem(position).getId(), mTrashOnSuccessListener, mTrashOnErrorListener);
}
});
builder.setNegativeButton("NO", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// Do nothing
dialog.dismiss();
}
});
AlertDialog alert = builder.create();
alert.show();
}
private Response.Listener<JSONObject> mTrashOnSuccessListener = new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
//
}
};
Response.ErrorListener mTrashOnErrorListener = new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Utils.showNetworkResponse(getContext(), error);
}
};
}
现在我的问题是,当我点击任何正在显示的项目的删除或编辑按钮时,它总是选择 ListView 中显示的最后一个项目的位置或 ID。
例如,如果我想删除 ListView 中位置为 1 的第二个项目,它将选择显示的最后一个位置为 10 的项目。
我已经尝试了很多东西并进行了很多更改,但到目前为止没有任何效果,这是我的最终代码。
最佳答案
您可以在按钮中添加标签。每次调用 getView 方法时,将当前位置标记到按钮上。单击按钮时获取按钮的标签,它将返回按钮的更新值/位置。并在该按钮单击的回调中对当前位置执行您想执行的操作。希望有帮助添加更多信息你有这行代码
viewHolder.btnEdit
这是编辑按钮。现在你应该使用下面的代码向这个按钮添加一个标签。您需要在 Viewholder 对象初始化的 else 子句之后使用以下代码。
viewHolder.btnEdit.setTag(位置);
并在 onclick 的回调中使用下面的代码
button.getTag()
关于android - 适配器 View 内部的 OnClickListener,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48168863/
当我单击图像时,它不会更改显示 TextView ,我哪里出错了? **List fields = new ArrayList(); for(int i = 0; i < 64; i+
我想做的是提供一个平台列表供用户选择。通过单击一个平台,它会将相应的 sql 表名称的名称放入变量中。但我不知道如何在我的提交按钮 clickListener 中使用该变量。这是我正在使用的代码部分。
我可以在我的 recyclerView holder 中实现它们 public class PagosPendientesViewHolder extends RecyclerView.ViewHol
已关闭。此问题需要 debugging details 。目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and the
当我想向 setOnClickListener 添加参数(例如按钮)时,我从 eclipse 警报中单击 View.OnClickListener() ,但 eclipse 类型 new OnClic
我看了http://developer.android.com/reference/android/view/package-summary.html并看到 View 类有一个名为“View.OnCl
我正在尝试 android 上的示例应用程序。我可以获得输出。 studentFormsActiviyt.java package com.example.android.accelerometerp
我有一个关于实现 OnClickListeners 以使用 ADT 进行开发的问题。我不确定哪种方法更有效,谁能告诉我每种方法的优缺点? class x extends Activity implem
我要问一个非常基本的问题,但我被困了很长时间。 在卡片 View 之后有一个回收 View ,每行有 2 个图像。现在我想在图像上创建点击监听器而不是 recycleview。 这个 Activity
我的理解是,当我创建一个监听点击的按钮对象时,我必须: 创建按钮对象 使用OnClickListner让它监听用户的点击 使用onClick在用户点击按钮后执行 Action 现在, setOnCli
我正在学习 android 开发的初学者教程,但我不明白这个错误。 错误在行“callButton.setOnClickListener(new OnClickListener() {” 是的,我知道
当使用下面的代码时,我不断收到错误,我知道还有另一种使用 onclick 函数的方法,android:onclick ...但我更喜欢这种“更清洁”的方式。 textview 的 id 名称是正确的,
尝试将 onClickListener 添加到我的 listView 中的项目时,我收到一条错误消息:“View 类型中的方法 setOnClickListener(View.OnClickListe
我有一个问题...我有不同的 TextView 和一个监听器。像这些: help_modul.setOnClickListener(this); help_timetable.setO
我创建了一个自定义的 AutocompleteAdapter,我需要允许用户选择某个对象(客户)。 我的 AutoCompleteAdapter 看起来像这样: package nl.raakict.
我有一个程序,它有一个用户可以编辑的文本框。当用户按下按钮时,会创建一个对话框,显示用户的文本和确认“是/否”选项。 public void setIP(View v){ //get the
这个问题在这里已经有了答案: NullPointerException accessing views in onCreate() (13 个回答) What is a NullPointerExce
我有一个自定义 View ,我想当我设置 onClickListener 时我总是会崩溃。 public class Holder extends View implements OnClickLis
我有一组复选框,它们都需要 OnClickListener 来查看它们何时被选中/取消选中。这是我所拥有的: CheckBox[] sens = new CheckBox[3]; for (int i
我有两个简单的不同类,其中一个类扩展了另一个类。我的第一个类是: public class MyObject {} 里面没有任何东西。 还有另一个: public class People exten
我是一名优秀的程序员,十分优秀!