【问题标题】:Update Listview after updating CSV file in Android在 Android 中更新 CSV 文件后更新 Listview
【发布时间】:2020-02-24 15:29:44
【问题描述】:

我的 Android 应用程序当前正在从 CSV 文件中读取数据并将其显示在 ListView 中,但是,一旦我在 CSV 文件中添加了另一行,我希望应用程序在单击 a 时更新新添加的值刷新按钮。怎么做?任何帮助将不胜感激

下面是代码

MainActivity 类

```public class MainActivity extends AppCompatActivity {
    private ListView listView;
    private ItemArrayAdapter itemArrayAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //init();
        listView = (ListView) findViewById(R.id.list_View);
        itemArrayAdapter = new ItemArrayAdapter(getApplicationContext(), R.layout.activity_premier_rostatus);

        Parcelable state = listView.onSaveInstanceState();
        listView.setAdapter(itemArrayAdapter);
        listView.onRestoreInstanceState(state);

        InputStream inputStream = getResources().openRawResource(R.raw.stats);
        CSVFile csvFile = new CSVFile(inputStream);
        List<String[]> scoreList = csvFile.read();

        for (String[] scoreData : scoreList) {
            itemArrayAdapter.add(scoreData);
        }

    }
}```

ItemArrayAdapter 类

    private List<String[]> scoreList = new ArrayList<String[]>();

    static class ItemViewHolder {
        TextView name;
        TextView score;
    }

    public ItemArrayAdapter(Context context, int textViewResourceId) {
        super(context, textViewResourceId);
    }

    @Override
    public void add(String[] object) {
        scoreList.add(object);
        super.add(object);
    }

    @Override
    public int getCount() {
        return this.scoreList.size();
    }

    @Override
    public String[] getItem(int index) {
        return this.scoreList.get(index);
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View row = convertView;
        ItemViewHolder viewHolder;
        if (row == null) {
            LayoutInflater inflater = (LayoutInflater) this.getContext().
                    getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            row = inflater.inflate(R.layout.activity_premier_rostatus, parent,false);
            viewHolder = new ItemViewHolder();
            viewHolder.name =  row.findViewById(R.id.name);
            viewHolder.score = row.findViewById(R.id.score);
            row.setTag(viewHolder);
        } else {
            viewHolder = (ItemViewHolder)row.getTag();
        }
        String[] stat = getItem(position);
        viewHolder.name.setText(stat[0]);
        viewHolder.score.setText(stat[1]);
        return row;
    }
}```


**CSVFile Class**

```public class CSVFile {
    InputStream inputStream;

    public CSVFile(InputStream inputStream){
        this.inputStream = inputStream;
    }

    public List<String[]> read(){
        List<String[]> resultList = new ArrayList<String[]>();
        BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
        try {
            String csvLine;
            while ((csvLine = reader.readLine()) != null) {
                String[] row = csvLine.split(",");
                resultList.add(row);
            }
        }
        catch (IOException ex) {
            throw new RuntimeException("Error in reading CSV file: "+ex);
        }
        finally {
            try {
                inputStream.close();
            }
            catch (IOException e) {
                throw new RuntimeException("Error while closing input stream: "+e);
            }
        }
        return resultList;
    }
}```

**activity_main.xml**



 ```android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/list_View"
    android:layout_alignParentTop="true"
    android:layout_centerHorizontal="true"
    android:layout_marginTop="@dimen/margin_top"```



【问题讨论】:

  • 你需要在你的适配器中实现任何函数来接受新的List&lt;String&gt;和你修改的数据并调用notifyDataSetChanged适配器函数来重绘所有ListView
  • 你能举个例子吗? @SuperG280

标签: java android csv android-listview


【解决方案1】:

根据您的需要,如果您只想添加一个项目,可以使用现有的适配器函数add,或者您可以实现另一个适配器函数来一次设置所有列表。

当你需要的时候,你可以执行这个add或者新的函数,使用新的项目或者列表,然后,你需要调用notifyDataSetChanged

itemArrayAdapter.add( NewItem);
itemArrayAdapter.notifyDataSetChanged();

itemArrayAdapter.addAllItemsInATime( NewArray);
itemArrayAdapter.notifyDataSetChanged();

在最后一种情况下,您需要像这样实现新的addAllItemsInATime(或您想要的名称)函数:

public void addAllItemsInATime( List<String> newList) {
    this.scoreList = newList;
}

将 Adapter 类想象成一个保存数据并知道如何显示这些数据的对象。因此,任何更改的数据都必须保存在适配器中并重新绘制。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-04
    • 2016-07-12
    • 2015-07-10
    相关资源
    最近更新 更多