Обновление списка после обновления файла CSV в Android - PullRequest
1 голос
/ 24 февраля 2020

My Android Приложение в настоящее время считывает данные из файла CSV и отображает их в ListView, однако, как только я добавлю еще одну строку в свой файл CSV, я хочу, чтобы приложение обновляло вновь добавленные значения по щелчку мыши. кнопки refre sh. Как это сделать? Буду признателен за любую помощь

Ниже приведен код

Класс 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 Class

    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"```



1 Ответ

0 голосов
/ 25 февраля 2020

В зависимости от ваших потребностей, вы можете использовать существующую функцию адаптера add, если вы хотите добавить только один элемент, или вы можете реализовать другую функцию адаптера для установки всего списка за раз.

Когда вам нужно, вы можете выполнить эту add или новую функцию с новым элементом или списком, а затем вам нужно вызвать notifyDataSetChanged.

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

или

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

В этом последнем случае вам нужно реализовать новые addAllItemsInATime (или нужное вам имя) функции, подобные следующим:

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

Представьте себе класс Adapter как объект, который сохраняет данные и знает, как эти данные будут показаны. Поэтому любые измененные данные необходимо сохранить в адаптере и перекрасить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...