我正在开发一个货币兑换应用,我在从API中提取费率后更新我的ListView时遇到了一些问题。
忽略标志,我只是放了我测试解决方案的任何文件
在我的活动开始时,我正在定义:
final ArrayList<ItemData> list = new ArrayList<ItemData>();
final String[] web = {
"EUR", "JPY", "USD", "GBP"
};
final Integer[] imageId = {R.drawable.austria, R.drawable.bangladesh, R.drawable.benin, R.drawable.uk};
private static String _spinnerData;
public static String test;
public static synchronized String getCurrentSpinner(){
if (_spinnerData == null) {
String _spinnerData;
}
return _spinnerData;
}
onCreate()定义为:
... not important ...
Spinner spin = (Spinner) findViewById(R.id.spinner_complist);
final SpinnerAdapter adapter1 = new SpinnerAdapter(this,
R.layout.spinner_layout, R.id.txt, list);
spin.setAdapter(adapter1);
spin.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parentView, View selectedItemView, int position, long id) {
ItemData item = (ItemData) (parentView.getItemAtPosition(position));
Log.i("item_1", item.getText());
String spinnerData = getCurrentSpinner();
spinnerData = item.getText();
}
然后我有一个自定义适配器来放置标志+名称,其中名称是textview。
之后,我通过正在运行的函数getRate()从API获得转换率。 在自定义适配器上,我已经覆盖了getView方法:
@Override
public View getView(int position, View view, ViewGroup parent) {
LayoutInflater inflater = context.getLayoutInflater();
View rowView = inflater.inflate(R.layout.mylist, null, true);
TextView txtTitle = (TextView) rowView.findViewById(R.id.itemName);
ImageView imageView = (ImageView) rowView.findViewById(R.id.icon);
imageView.setImageResource(imageId[position]);
String currency;
txtTitle.setText(web[position]);
String spinnerData= getCurrentSpinner();
if (spinnerData!=null) {
currency=spinnerData;
getRate(currency, web[position], txtTitle);
}
return rowView;
}
因此,在getRate中,我从ListView的每一行获取一个String,并用另一个硬币中的值替换它。
我的问题是:如果我写了getRate(&#34; EUR&#34;,web [position],txtTitle),一切都按预期工作。
但是,如果我按原样放置代码,它就不会更新我的ListView。我设置了一个断点,货币是&#34; EUR&#34;,所以它应该等同于硬编码字符串所拥有的。
我认为可能ListView没有得到适当更新,或者该函数正在进行一些回调,即用原始值替换我的TextView。
有什么想法吗?
提前致谢,
答案 0 :(得分:3)
有两件事让我感到高兴。
首先,这个块:
public static synchronized String getCurrentSpinner(){
if (_spinnerData == null) {
String _spinnerData;
}
return _spinnerData;
}
这并没有多大意义。它读取&#34;如果静态范围_spinnerData
为null,则创建另一个本地范围的字符串,也称为_spinnerData
并且不对其执行任何操作,然后返回静态范围的实例。&#34;
第二,这个逻辑:
public void onItemSelected(AdapterView<?> parentView, View selectedItemView, int position, long id) {
ItemData item = (ItemData) (parentView.getItemAtPosition(position));
Log.i("item_1", item.getText());
String spinnerData = getCurrentSpinner();
spinnerData = item.getText();
}
这将读取&#34;创建一个名为spinnerData
的临时字符串,该字符串使用getCurrentSpinner()
的返回值进行初始化,然后立即将其替换为item.getText()
的值,然后抛出整个内容离开(因为此后从未使用过)&#34;。
在我看来,你对引用的工作方式存在误解。我认为您要做的是保存当前微调器选择并在getView()
中使用它。
如果是这样的话,你会做这样的事情:
private String _spinnerData; // Does not need to be static
// In onItemSelected
ItemData item = (ItemData) (parentView.getItemAtPosition(position));
Log.i("item_1", item.getText());
_spinnerData = item.getText(); // Save the last item selected
// In getView()
// Call this method with the last known spinner selection
getRate(_spinnerData, web[position], txtTitle);
我不得不假设您是Java的新手,并且不完全了解参考和范围的工作原理。这是一个公平的假设吗?如果是这样,我强烈建议你从Android退一步,继续前进,熟悉并熟悉Java。 Android非常复杂,无需像你一样去弄清楚语言。
希望有所帮助!
答案 1 :(得分:2)
我认为您的活动中的数据流存在一些问题。
listview中的getView应该返回一个视图,其中包含来自具有数据的数据源的填充数据。 我会建议改变,如:
选择了代码段位置 - &gt;调用Web API以获取您需要的任何数据 - &gt;返回时将其添加到列表视图中显示的数据列表 - &gt;然后调用listview的适配器notifyDataSetChanged()
我建议您阅读本文,了解有关使用listviews的更多信息:http://www.vogella.com/tutorials/AndroidListView/article.html