gpt4 book ai didi

android - 在 ListView 中更新 View 值时适配器未更新

转载 作者:行者123 更新时间:2023-11-29 15:53:34 24 4
gpt4 key购买 nike

我正在使用 ListView 来显示一些我需要计数的元素的列表。我的 ListView 看起来像这样

enter image description here

当我点击加号和减号按钮或重置按钮时,值“3”得到更新。这就是我在 CustomListViewAdapter 中实现此目的的方式

holder.plusButton.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View v) {
ViewGroup parent = (ViewGroup) v.getParent();
TextView tv = (TextView) parent.findViewById(R.id.count);

int count = Integer.parseInt((String) tv.getText());
count++;
tv.setText(String.valueOf(count));
int currentVal = Integer.parseInt(totalCount.getText().toString());
totalCount.setText(String.valueOf(currentVal + 1));
}
});

我在哪里使用 ViewHolder 模式。

现在的问题是,在我更新该值之后,它没有在适配器中更新。即当我尝试循环适配器时,我仍然得到我最初设置的值 3 而不是更新值。我的做法是正确的还是有更好的方法。我如何确保适配器具有更新的值。

第二个问题:由于适配器没有得到更新,当我试图从列表中检索值以将其发送到某个地方时,我在执行此操作时得到空指针

view = listView.getChildAt(i).findViewById(R.id.count);

用于列表中在屏幕上不可见的 View 。即如果我有 10 个这样的行,屏幕上只会显示 5 个,当我尝试访问第 6 个时,我得到上面代码块的空指针。那么我应该如何访问 ListView 值?

编辑:我的 getView 方法源代码是

public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder = null;
Counter rowItem = getItem(position);

LayoutInflater mInflater = (LayoutInflater) context
.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);

if (convertView == null) {
convertView = mInflater.inflate(R.layout.counter_list, null);
holder = new ViewHolder();

convertView.findViewById(R.id.parentLayoutRow).setBackgroundColor(Color.parseColor(rowItem.getPrimaryColor()));

holder.resetButton = (Button) convertView.findViewById(R.id.buttonReset);
holder.counterName = (TextView) convertView.findViewById(R.id.counterName);
holder.counterDesc = (TextView) convertView.findViewById(R.id.counterDesc);
holder.count = (TextView) convertView.findViewById(R.id.count);
holder.minusButton = (Button) convertView.findViewById(R.id.buttonMinus);
holder.plusButton = (Button) convertView.findViewById(R.id.buttonPlus);

convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}

holder.resetButton.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View v) {
ViewGroup parent = (ViewGroup) v.getParent();
TextView tv = (TextView) parent.findViewById(R.id.count);

int currentVal = Integer.parseInt(totalCount.getText().toString());
totalCount.setText(String.valueOf(currentVal - Integer.parseInt(tv.getText().toString())));

tv.setText(String.valueOf(0));
}
});
holder.counterName.setText(rowItem.getName());
holder.counterDesc.setText(rowItem.getDesc());
holder.count.setText(String.valueOf(rowItem.getCount()));
holder.resetButton.setBackgroundColor(Color.parseColor(rowItem.getButtonColor()));
holder.minusButton.setBackgroundColor(Color.parseColor(rowItem.getButtonColor()));
holder.minusButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
ViewGroup parent = (ViewGroup) v.getParent();
TextView tv = (TextView) parent.findViewById(R.id.count);

int count = Integer.parseInt((String) tv.getText());

if (count > 0) {
count--;
tv.setText(String.valueOf(count));
int currentVal = Integer.parseInt(totalCount.getText().toString());
totalCount.setText(String.valueOf(currentVal - 1));
}
}
});
holder.plusButton.setBackgroundColor(Color.parseColor(rowItem.getButtonColor()));
holder.plusButton.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View v) {
ViewGroup parent = (ViewGroup) v.getParent();
TextView tv = (TextView) parent.findViewById(R.id.count);

int count = Integer.parseInt((String) tv.getText());
count++;
tv.setText(String.valueOf(count));
int currentVal = Integer.parseInt(totalCount.getText().toString());
totalCount.setText(String.valueOf(currentVal + 1));
}
});

return convertView;
}

现在如何更新此函数中的适配器值 holder.minusButton.setOnClickListener(new OnClickListener()

最佳答案

ListView 中的 View 不保留它们的状态。正如 ViewHolder 向您展示的那样,它们在离开屏幕时会被丢弃并稍后重建:它们始终由 Adapter 中的值驱动。

因此,您要做的是在支持列表的适配器中找到条目并更新它,然后让 ListView 重绘自身。查看 ListView.getAdapter(),然后查看 Adapter.getItem()。您会注意到没有 Adapter.setItem(),并且您不能更改现有 String 或 Integer 的值(它们是不可变的),因此您的列表项需要是一个包装该值的对象。或者您可以使用具有增量方法的 AtomicInteger。然后您需要调用 ListView.notifyDataSetChanged(),因为它不会检查包装对象内部。

关于android - 在 ListView 中更新 View 值时适配器未更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29183411/

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