我创建了一个 ListView ,如图所示。链接:
问题:如果用户点击按钮 +
,我希望或 -
当前显示的 TextView 0
相应地增加或减少。但是,如果我单击第一个项目的按钮,则 TextView 会在其他行中更新。我不知道如何实现这个。
代码如下:
public class HomePage extends Fragment {
String[] listitems;
int[] images = { R.drawable.cadburysilk, R.drawable.cadburys_dairymilk,
R.drawable.perk, R.drawable.kitkat,
R.drawable.nestlemunchchocolate, R.drawable.cadbury_bournville_bar,
R.drawable.snickers };
ListView list;
DBAdapter dbadapter;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// TODO Auto-generated method stub
View rootview = inflater.inflate(R.layout.activity_home_page,
container, false);
View view = View.inflate(getActivity(), R.layout.headerview, null);
Resources res = getResources();
listitems = res.getStringArray(R.array.items);
list = (ListView) rootview.findViewById(R.id.itemslist);
list.addHeaderView(view);
AdapterClass adapterClass = new AdapterClass(this.getActivity(),
listitems, images);
list.setAdapter(adapterClass);
return rootview;
}
}
class AdapterClass extends ArrayAdapter<String> {
Context context;
int[] images;
String[] names;
Button add, sub;
TextView number;
Integer count=0;
static class ViewHolder {
public TextView textView;
public ImageView imageView;
}
public AdapterClass(Context c, String[] items, int imgs[]) {
// TODO Auto-generated constructor stub
super(c, R.layout.rowlayout, R.id.quantity, items);
this.context = c;
this.images = imgs;
this.names = items;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
View row = convertView;
// reuse views
if (row == null) {
LayoutInflater inflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
row = inflater.inflate(R.layout.rowlayout, parent, false);
ViewHolder viewHolder = new ViewHolder();
viewHolder.imageView = (ImageView) row.findViewById(R.id.img);
viewHolder.textView = (TextView) row.findViewById(R.id.textView1);
add = (Button) row.findViewById(R.id.button1);
add.setTag(position);
sub = (Button) row.findViewById(R.id.button2);
sub.setTag(position);
number = (TextView)row.findViewById(R.id.quantity);
row.setTag(viewHolder);
}
ViewHolder holder = (ViewHolder) row.getTag();
holder.imageView.setImageResource(images[position]);
holder.textView.setText(names[position]);
add.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
count=count+1;
number.setText(count.toString());
}
});
sub.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
count=count-1;
number.setText(count.toString());
}
});
return row;
}
}
请帮忙。我还需要帮助,了解如何在下一个 Activity 或 fragment 中显示其 TextView 包含正数的项目。
最佳答案
我写了一篇短文 demo for my answer which you can see here .
例子:
准备就绪后,您可以使用数据源(不是适配器,也不是 ListView )来查找数量 > 0 的产品。
public List<Product> getBasket() {
List<Product> basket = new ArrayList<>();
for (Product product : productList) {
if (product.quantity > 0) {
basket.add(product);
}
}
return basket;
}
您的适配器只有一项工作:创建 View /将 View 绑定(bind)到数据,它不需要做更多的事情。
没有演示的初始答案:
如果您直接更新项目 View ,您将无法在以后获取所有具有正数的项目,因为这些更新的值仅存储在 View 中,而不是在您可以迭代的某些数据结构中结束。
这就是为什么您不应该直接更新项目 View ,而是在单击加号/减号按钮时使用回调、修改基础数据集并调用 adapter.notifyDatasetChanged( )
再次更新 ListView/RecyclerView。
将回调传递给您的适配器:
public interface ItemInteraction {
void onPlusButtonClick(long id);
void onMinusButtonClick(long id);
}
您可以通过将其设置为相关 View 上点击监听器的回调来使用它。 ID 可以是任何内容,只要它可以唯一标识 ListView 行所表示的数据项即可。
final long id = item.getId();
plusButtonView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick() {
callback.onPlusButtonClick(id);
}
});
在这个类似的问题中给出了一个例子,其中 OP 想要显示或隐藏歌曲列表的星号(表示最喜欢的)here .
Another explanation适配器类 View 的设计用途。
关于android - 单击按钮在列表项的 TextView 中设置文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31299911/