对于我本科学位的最后一年项目,我已经在客户端/服务器应用程序上工作了几个月,我目前正在开发一个 ListView,它应该显示产品列表并允许用户输入代表的值该商品的库存数量。我设法让 View 和 Adapter 看起来正确,但 EditText 给我带来了问题,我花了几个小时在谷歌上搜索答案并搜索 StackOverflow 寻找类似的问题,但我发现要么没有应用,要么没有解决问题。
我几乎可以肯定它是一个回收器问题,但问题的根源似乎暗示了我,输入到 EditText 中的值似乎被插入到我的哈希图中的几个位置,而不仅仅是一个,并且快速滚动列表会导致大多数 -如果不是所有视图都显示相同的值!这是我的适配器类的完整内容,我很乐意提供任何其他有帮助的代码,提前谢谢你。
public class StockAdapter extends ArrayAdapter<Stock> {
private LayoutInflater mLayoutInflater;
Context context;
int layoutResourceId;
Stock data[] = null;
Map<Integer, String> stockHashMap = new HashMap<Integer, String>();
public StockAdapter(Context context, int layoutResourceId, Stock[] data)
{
super(context, layoutResourceId, data);
mLayoutInflater = LayoutInflater.from(context);
this.context = context;
this.layoutResourceId = layoutResourceId;
this.data = data;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent)
{
StockHolder holder = null;
if (convertView == null)
{
convertView = mLayoutInflater.inflate(layoutResourceId, null);
// Instantiate StockHolder object.
holder = new StockHolder();
// Get views
holder.txtName = (TextView) convertView.findViewById(R.id.stockName);
holder.etValue = (EditText) convertView.findViewById(R.id.etValue);
convertView.setTag(holder);
}
else
{
holder = (StockHolder)convertView.getTag();
}
// Get stock object from data set.
Stock stock = data[position];
holder.txtName.setText(stock.Name);
// Put stock id in a variable - used for referencing the right stock item.
final int id = stock.Id;
String oldText = stockHashMap.get(id);
// Check if the value of oldText is null.
holder.etValue.setText(oldText == null ? "" : oldText);
// Create addTextChangedListener for this EditText
holder.etValue.addTextChangedListener(
new TextWatcher(){
public void afterTextChanged(Editable editable) {
stockHashMap.put(id, editable.toString());
}
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
// TODO Auto-generated method stub
}
public void onTextChanged(CharSequence s, int start, int before,
int count) {
// TODO Auto-generated method stub
}
});
return convertView;
}
static class StockHolder
{
int id;
TextView txtName;
EditText etValue;
}
}
回复:马特 C 的回答:添加了以下内容,但没有更好。
@Override
public int getCount()
{
if (data == null) return 0;
return data.length;
}
@Override
public Stock getItem(int position)
{
return data[position];
}