【问题标题】:Android ArrayList Updating ValuesAndroid ArrayList 更新值
【发布时间】:2016-01-29 15:01:58
【问题描述】:

我正在尝试根据搜索栏的值更改列表视图中显示的值。目前列表视图由光标填充(我认为我不能在列表中更改一次的值)。我正在尝试将光标添加到 ArrayList 中,然后再添加到列表中。

我的想法是我可以更改数组列表元素,进而更新列表视图。我在创建数组列表然后更改它以更新列表视图时遇到问题。

示例 列表视图包含 2 列(名称和值),这些是返回给光标并添加到 arrayList 中的内容。当 seekbar 处于值(例如 2)时,arrayList 中的所有值都将乘以 2。它们只在列表中更新,而不在数据库中更新。

任何人都可以帮助我朝着正确的方向前进以修复我的 arrayList 并应用搜索栏更改

光标和数组列表

        final Cursor ings = adapter.getIngs(Code);
    ingredients.moveToFirst();
    ArrayList<String> IngsList = new ArrayList<String>();
    while(!ings.isAfterLast())
    {
        Ings.add(ings.getString(ings.getColumnIndex("name")));
        Ings.add(ings.getInt(ings.getColumnIndex("measurement")));
        Ings.add(ings.getString(ings.getColumnIndex("unit")));
    }
    ings.close();


    String[] columns = new String[] {adapter.KEY_NAME, adapter.KEY_MEASUREMENT, adapter.KEY_UNIT};
    int[] to = new int[] {R.id.Name, R.id.Measurement, R.id.Unit};
    final SimpleCursorAdapter Adpater = new SimpleCursorAdapter(this,R.layout.row5, ingredients, ingredient_columns, to, 0);
    ListView Required = (ListView) findViewById(R.id.Required);
    Required.setAdapter(Adpater);

SeekBar

        seekBar = (SeekBar) findViewById(R.id.servingSeek);
    textView = (TextView) findViewById(R.id.actualServing);
    // Initialize the textview with '0'
    textView.setText("Serving Size:" + seekBar.getProgress());
    seekBar.setOnSeekBarChangeListener(
            new SeekBar.OnSeekBarChangeListener() {
                int progress = 0;

                @Override
                public void onProgressChanged(SeekBar seekBar,
                                              int progresValue, boolean fromUser) {
                    progress = progresValue;
                    textView.setText("Serving Size:" + progress);
                    //alter cursor values

                    //update cursor

                }

【问题讨论】:

  • 您可以创建和使用自定义适配器而不是 SimpleCursorAdapter
  • 那会有什么不同?
  • 您可以制作一个适用于ArrayList 而不是Cursor 的适配器,这样您就可以在ListView 中添加/删除项目。
  • 我可以编辑列表中的项目吗?我不想添加或删除任何东西
  • 是的,您可以使用自定义适配器来做到这一点。

标签: java android xml listview arraylist


【解决方案1】:

@JJSmith,如果你想在 ArrayList 中携带东西,最好创建一个类来表示数据库中的一行,其中包含你想要的实例变量,

class Item{
    private String name;
    private float measurment;
    private float unit;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public float getMeasurment() {
        return measurment;
    }

    public void setMeasurment(float measurment) {
        this.measurment = measurment;
    }

    public float getUnit() {
        return unit;
    }

    public void setUnit(float unit) {
        this.unit = unit;
    }
}

当你从光标读取数据时..你需要实现类似这样的东西

    ArrayList<Item> items = new ArrayList<>();
    Cursor cursor = //make a call to database
    if (cursor.moveToFirst()) {
        Item item;
        for (int i = 0; i < cursor.getCount(); i++) {
            item = new Item();
            item.setName("read data from cursor and add it here"); 
            item.setMeasurment("read data from cursor and add it here"); 
            item.setUnit("read data from cursor and add it here"); 
            myModels.add(item);
            if (!cursor.moveToNext()) {
                break;
            }
        }
    }

更新 既然您拥有Item's 类型的ArrayList,您可以将其提供给您要制作的自定义适配器,这里有一个示例,您可以查看Github 中的代码

ListView listView = (ListView)findViewById(R.id."listview id from the layout");

制作一个自定义Adapter 并提供您的列表,并将适配器设置为listview

listView.setAdapter(adapter)

现在你感兴趣的东西,当你改变seekbar的位置时,你可以从arraylist中获取Item并改变你想要的值

一旦您更改了数组列表中的数据,请在适配器上调用notifyDataSetChanged()

adapter.notifyDataSetChanged();

你就完成了

【讨论】:

  • 很有趣,所以如果我想改变测量值,我会在setMeasurement 函数中这样做?另外,我如何将 arrayList 的所有值传递到新类中?抱歉所有问题,只是想确保我做对了
  • @JJSmith,我已经更新了答案,希望对你有帮助
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-10-04
  • 1970-01-01
  • 2020-02-24
  • 1970-01-01
  • 1970-01-01
  • 2012-01-10
  • 2015-03-28
相关资源
最近更新 更多