自定义ListView没有得到更新

时间:2017-11-04 22:42:38

标签: android listview adapter

我正在开发一个货币兑换应用,我在从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),一切都按预期工作。

enter image description here

但是,如果我按原样放置代码,它就不会更新我的ListView。我设置了一个断点,货币是&#34; EUR&#34;,所以它应该等同于硬编码字符串所拥有的。

我认为可能ListView没有得到适当更新,或者该函数正在进行一些回调,即用原始值替换我的TextView。

有什么想法吗?

提前致谢,

2 个答案:

答案 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