如何访问ListView中的特定行并对该行的内容进行操作?
我有一个使用自定义适配器和行布局填充对象数组的列表视图。该行显示对象的名称,价格,包含用于更改数量的按钮,并根据所选数量显示总计。如何访问ListView中的特定行并对该行的内容进行操作?
Example of list populated with 3 items
这里的问题:我想告诉列表视图,例如,当用户点击第二行中的数量按钮,我想访问同一行中的价格和数量值,&将结果显示在特定行末尾的总单元格中。我无法弄清楚如何做到这一点。我很困惑,因为按钮元素在XML布局中有一个ID,所以我怎么区分第二行中的按钮与第一行或最后一行中的按钮,因为它们都是重复的?
我知道OnClickListener方法的语法,它将执行我需要的数学运算,我只是不知道应该在程序的哪个位置执行它。我尝试过在适配器中,但只有列表中最后一行的按钮正常工作,而不是全部。我一直在搜索和谷歌搜索几天,我看到了不同的方法,但我正在努力实施它们。
我最好的领导是关于一个名为ListView.getChildAt(index)的方法,它应该基于索引返回列表中的特定行,但是如何根据哪个按钮获得行的索引点击?该适配器
public class ShopActivity extends AppCompatActivity {
ListView listView;
ItemListAdapter adapter;
ArrayList<ShoppingItem> shoppingItems = new ArrayList<ShoppingItem>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.shop_activity);
shoppingItems.add(new ShoppingItem("Drink", "Water Bottle 1.5 ltr", 11));
shoppingItems.add(new ShoppingItem("Drink", "Pepsi 2 ltr", 10));
shoppingItems.add(new ShoppingItem("Drink", "Orange Juice 1.5 ltr", 7));
listView = (ListView) findViewById(R.id.itemListView);
adapter = new ItemListAdapter(this, R.layout.item_layout, shoppingItems);
listView.setAdapter(adapter);
}
代码:This is the stackoverflow post where I read on the .getChildAt(index) method
我给你提供的代码下面我的项目:
代码为ShopActivity.java
public class ItemListAdapter extends ArrayAdapter<ShoppingItem> {
private ArrayList<ShoppingItem> items;
private int layoutResourceId;
private Context context;
ItemHolder holder = new ItemHolder();
public ItemListAdapter(Context context, int layoutResourceId, ArrayList<ShoppingItem> items) {
super(context, layoutResourceId, items);
this.layoutResourceId = layoutResourceId;
this.context = context;
this.items = items;
}
public static class ItemHolder {
public ShoppingItem shoppingItem;
public TextView itemName;
public TextView itemPrice;
public TextView itemQuantity;
public TextView totalPriceNumber;
public ImageButton plusButton;
public ImageButton minusButton;
}
@Override
public int getCount() {
return items.size();
}
@Override
public ShoppingItem getItem(int position) {
return items.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
View rowView = convertView;
if (convertView == null) {
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
rowView = inflater.inflate(layoutResourceId, parent, false);
TextView itemName = (TextView) rowView.findViewById(R.id.itemName);
TextView itemPrice = (TextView) rowView.findViewById(R.id.itemPrice);
TextView itemQuantity = (TextView) rowView.findViewById(R.id.itemQuantity);
TextView totalPriceNumber = (TextView) rowView.findViewById(R.id.totalPrice);
ImageButton plusButton = (ImageButton) rowView.findViewById(R.id.plusButton);
ImageButton minusButton = (ImageButton) rowView.findViewById(R.id.minusButton);
holder.itemName = itemName;
holder.itemPrice = itemPrice;
holder.itemQuantity = itemQuantity;
holder.totalPriceNumber = totalPriceNumber;
holder.plusButton = plusButton;
holder.minusButton = minusButton;
rowView.setTag(holder);
} else
holder = (ItemHolder) rowView.getTag();
holder.shoppingItem = items.get(position);
holder.itemName.setText(holder.shoppingItem.getItemName());
holder.itemPrice.setText(Double.toString(holder.shoppingItem.getItemPrice()));
holder.itemQuantity.setText(Integer.toString(holder.shoppingItem.getQuantity()));
holder.totalPriceNumber.setText(Double.toString(holder.shoppingItem.getItemPrice() * holder.shoppingItem.getQuantity()));
final int rowPosition = position;
holder.plusButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
holder.shoppingItem = items.get(rowPosition);
int newQuantity = holder.shoppingItem.getQuantity();
newQuantity++;
holder.shoppingItem.setQuantity(newQuantity);
holder.itemQuantity.setText(Integer.toString(newQuantity));
holder.totalPriceNumber.setText(Double.toString(holder.shoppingItem.getItemPrice() * holder.shoppingItem.getQuantity()));
notifyDataSetChanged();
}
});
return rowView;
}
代码行XML:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:padding="5dp">
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TableRow>
<CheckBox
android:layout_width="25dp"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:gravity="center" />
<ImageView
android:id="@+id/imageBar"
android:layout_width="50dp"
android:layout_height="75dp"
android:layout_gravity="center"
android:src="@drawable/drink" />
<TextView
android:id="@+id/itemName"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_weight="3"
android:width="0dp" />
<TextView
android:id="@+id/itemPrice"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_weight="1"
android:width="0dp"
android:gravity="center" />
<ImageButton
android:id="@+id/minusButton"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_weight="0.3" />
<TextView
android:id="@+id/itemQuantity"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_weight="0.4"
android:width="0dp"
android:gravity="center" />
<ImageButton
android:id="@+id/plusButton"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_weight="0.3" />
<TextView
android:id="@+id/totalPrice"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_weight="1"
android:width="0dp"
android:gravity="center" />
</TableRow>
</TableLayout>
代码为ShoppingItem对象:
public class ShoppingItem {
private String itemType;
private String itemName;
private double itemPrice;
private int quantity = 1;
public ShoppingItem(String itemType, String itemName, double itemPrice, int quantity) {
this.itemType = itemType;
this.itemName = itemName;
this.itemPrice = itemPrice;
this.quantity = quantity;
}
public String getItemType() {
return this.itemType;
}
public void setItemType(String itemType) {
this.itemType = itemType;
}
public String getItemName() {
return this.itemName;
}
public void setItemName(String itemName) {
this.itemName = itemName;
}
public double getItemPrice() {
return this.itemPrice;
}
public void setItemPrice(double itemPrice) {
this.itemPrice = itemPrice;
}
public int getQuantity() {
return this.quantity;
}
public void setQuantity(int quantity) {
this.quantity = quantity;
}
我是新来的Android开发现场。
您的每行代表一个数据集。例如,你有一个项目的数据类。
data class Item(name: String, price: Double)
的数量quantity: Int
添加一个字段中onClick
的加号按钮,增加该项目的quantity
变量。例如像这样:
// data set is something like this...
val dataSet = mutableListOf<Item>()
// creating the view for row i...
plusButton.onClick {
dataSet[i].quantity++
notifyItemChanged(i) // dont think this exists for ListView, but you can also just use notifyDataSetChanged, which will invalidate all rows
}
递增量后,触发你改变该行的notifyItemChanged
方法,这将触发该行,然后将代表你当前的数据集的UI更新。
您应该在getView
方法中添加onClick
侦听器,而不是i
使用position
来访问数据集中的项目。
编辑:
在你getView()
方法尝试这样的事:
final int rowPosition = position;
plusButton.setOnClickListener(new View.OnClickListener(View v) {
items.get(rowPosition).quantity++;
notifyDataSetChanged();
});
首先让我感谢你的反馈我的朋友。我按照你的建议做了,并在包含价格和名称的对象类中添加了数量实例变量。问题是当我试图修改适配器中的代码并将onClickListener添加到plusButton时,我无法写出你给我的语法。 – MotorByte
我已经在Java中添加了一个适合更多当前代码的示例,这可能会有所帮助。 – damian
我试过你写过的代码,但它不接受“.quantity ++;”的语法。我认为你有正确的想法,我在getView()中修改了上面的代码,并且还为我使用的ShoppingItem对象添加了代码。不幸的是,这些更改仍然无效。当我点击plusButton时,数量不会增加。你有什么想法,为什么它不会? – MotorByte
添加'holder.amountButton.setFocusable(假);'在getView适配器方法。 – grabarz121
@ grabarz121我试过了,不幸的是它没有工作。仍然只有最后一行显示正确的总数,所有行之前不做任何更改。我在代码的if(convertView == null)部分添加了一行代码,如果这有助于澄清任何事情。有什么我做错了吗?无论哪种方式,我感谢您的反馈我的朋友。 – MotorByte
您的'com.cepheuen.elegantnumberbutton.view.ElegantNumberButton'属性为'android:clickable =“false”',请删除此行,这应该起作用。我在我的实际项目中使用了类似的东西,这是有效的。 – grabarz121