Я подготовил пример деятельности для вашей справки.
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();
}
}
Пояснение
- Я создал 3 стати c
String
с ввод, как вы указали. - Я создал
ArrayList
, добавив все эти 3 образца данных. Мы предполагаем, что это ArrayList
как данные. - Создает
Adapter
, такой же, как вы пытались реализовать, и затем добавляете его к ListView
для отображения. - Создан
Button
Экспорт CSV для экспорта CSV во внешний каталог Папка загрузок. - Другие полезные методы для проверки разрешений и конвертеры.
Когда пользователь щелкает Export CSV , запускается следующий процесс:
- Первая задача - проверить, дали ли пользователь разрешения на экспорт CSV или нет. Если Нет , запросите разрешение, в противном случае переходите к методу
exportDataToCSV()
. - В этой функции L oop через все строки (строки) в
ArrayList
, которые вы создан для заполнения списка (путем установки в адаптере) и получения currentLine
. - Разделить содержимое, используя
;
в качестве разделителя, и создать локальную строку Array
. - Передайте этот массив методу
toCSV
, который объединяет данные с ,
, поскольку он будет использоваться для создания CSV (значений, разделенных запятыми). Добавьте пустую строку \n
в конце каждой строки для создания строк. - Наконец, когда у вас есть все данные в строке
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>