как сохранить элементы ListView в CSV-файл - PullRequest
0 голосов
/ 04 февраля 2020

Каждая строка ListView содержит 5 строк, разделенных точкой с запятой следующим образом:

str1; str2; str3; str4; str5   

Длина записи списка может варьироваться, которая иногда может достигать 400

Как сохранить список в файл CSV (во внутреннем хранилище устройства, путь к папке приложения)

Использование ArrayAdapter:

private static MainActivity inst;
    ArrayList<String> inList = new ArrayList<String>();
    ListView myList;
    ArrayAdapter arrayAdapter;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        myList = (ListView) findViewById(R.id.dataList);

        arrayAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, inList);
        myList.setAdapter(arrayAdapter);

    }

Пример данных в ListView:

Shop1; оранжевый; 10; 200; 2000 Shop2; апельсин; 8; 150; 1200 Shop3; лимон; 20; 100; 2000

1 Ответ

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

Я подготовил пример деятельности для вашей справки.

public class MainActivity extends Activity {


    ArrayList<String> listDataArray;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);


        String line1 = "Shop1; orange; 10; 200;2000";
        String line2 = "Shop2;orange;8;150;1200";
        String line3 = "Shop3;lemon;20;100;2000";

        listDataArray = new ArrayList<>();

        listDataArray.add(line1);
        listDataArray.add(line2);
        listDataArray.add(line3);


        ArrayAdapter arrayAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, listDataArray);
        ((ListView) findViewById(R.id.listviewData)).setAdapter(arrayAdapter);


    }


    public void processCSV(View view) {

        try {

            boolean writePermissionStatus = checkStoragePermission(false);
            //Check for permission
            if (!writePermissionStatus) {
                ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1);
                return;
            } else {
                boolean writePermissionStatusAgain = checkStoragePermission(true);
                if (!writePermissionStatusAgain) {
                    Toast.makeText(this, "Permission not granted", Toast.LENGTH_LONG).show();
                    return;
                } else {
                    //Permission Granted. Export
                    exportDataToCSV();

                }
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static String toCSV(String[] array) {
        String result = "";
        if (array.length > 0) {
            StringBuilder sb = new StringBuilder();
            for (String s : array) {
                sb.append(s.trim()).append(",");
            }
            result = sb.deleteCharAt(sb.length() - 1).toString();
        }
        return result;
    }


    private void exportDataToCSV() throws IOException {


        String csvData = "";

        for (int i = 0; i < listDataArray.size(); i++) {

            String currentLIne = listDataArray.get(i);
            String[] cells = currentLIne.split(";");

            csvData += toCSV(cells) + "\n";

        }


        File directory = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS);
        String uniqueFileName = "FileName.csv";
        File file = new File(directory, uniqueFileName);
        FileWriter fileWriter = new FileWriter(file);
        fileWriter.write(csvData);
        fileWriter.flush();
        fileWriter.close();
        Toast.makeText(MainActivity.this, "File Exported Successfully", Toast.LENGTH_SHORT).show();

    }


    private boolean checkStoragePermission(boolean showNotification) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            if (checkSelfPermission(android.Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) {
                return true;
            } else {
                if (showNotification) showNotificationAlertToAllowPermission();
                return false;
            }
        } else {
            return true;
        }
    }


    private void showNotificationAlertToAllowPermission() {
        new AlertDialog.Builder(this).setMessage("Please allow Storage Read/Write permission for this app to function properly.").setPositiveButton("Open Settings", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface paramDialogInterface, int paramInt) {
                Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
                Uri uri = Uri.fromParts("package", getPackageName(), null);
                intent.setData(uri);
                startActivity(intent);
            }
        }).setNegativeButton("Cancel", null).show();

    }

}

Пояснение

  1. Я создал 3 стати c String с ввод, как вы указали.
  2. Я создал ArrayList, добавив все эти 3 образца данных. Мы предполагаем, что это ArrayList как данные.
  3. Создает Adapter, такой же, как вы пытались реализовать, и затем добавляете его к ListView для отображения.
  4. Создан Button Экспорт CSV для экспорта CSV во внешний каталог Папка загрузок.
  5. Другие полезные методы для проверки разрешений и конвертеры.

Когда пользователь щелкает Export CSV , запускается следующий процесс:

  1. Первая задача - проверить, дали ли пользователь разрешения на экспорт CSV или нет. Если Нет , запросите разрешение, в противном случае переходите к методу exportDataToCSV().
  2. В этой функции L oop через все строки (строки) в ArrayList, которые вы создан для заполнения списка (путем установки в адаптере) и получения currentLine.
  3. Разделить содержимое, используя ; в качестве разделителя, и создать локальную строку Array.
  4. Передайте этот массив методу toCSV, который объединяет данные с ,, поскольку он будет использоваться для создания CSV (значений, разделенных запятыми). Добавьте пустую строку \n в конце каждой строки для создания строк.
  5. Наконец, когда у вас есть все данные в строке csvData, запишите выходные данные в файл.

Очевидно, что могут быть более эффективные способы сделать это, но я разделил каждую функцию настолько, насколько это возможно, чтобы ее было легче понять.

Другой способ генерировать CSV из currentLine, можно заменить ; на , напрямую. Попробуйте сами.

activity_main. xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity">

    <ListView
        android:id="@+id/listviewData"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1" />

    <Button
        android:id="@+id/button"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="bottom"
        android:onClick="processCSV"
        android:text="Export CSV" />

</LinearLayout>

AndroidManifest. xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.android.myapplication">

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

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