1 Вопрос: Как я могу заполнить listView с названиями файлов в Assets?

вопрос создан в Thu, May 2, 2019 12:00 AM

У меня есть пункт меню Lyrics в приложении, которое я начал разрабатывать в Xamarin Android. При нажатии запускается новое действие под названием Lyrics, в котором есть listView, который должен быть заполнен активируемыми щелчком строками с заголовками текстовых файлов в папке Assets.

Таким образом, если бы в папке Assets было 3 файла lyricsX.txt, listView выглядел бы примерно так:

[ lyrics1.txt ]
[ lyrics2.txt ]
[ lyrics3.txt ]

И эти кнопки с названиями песен должны быть кликабельными.

Я попытался поместить путь в строковый файл и затем использовать Directory.EnumerateFiles .. затем выполнить поиск через него и записать результат в консоль отладки, но ничего не регистрируется. Возможно, у меня неправильный подход, я просто не знаю точно, что я делаю неправильно.

[Activity(Label = "Lyrics")]
    public class Lyrics : Activity
    {
        protected override void OnCreate(Bundle savedInstanceState)
        {
            string assetsPath = Android.App.Application.Context.GetExternalFilesDir(null).AbsolutePath;
            var assetsContents = Directory.EnumerateFiles(assetsPath);
            TextView title = FindViewById<TextView>(Resource.Id.lyricsTitle);

            foreach(var fileName in assetsContents)
            {
                Log.Debug("debug", "NAME:" + fileName);
            }

            base.OnCreate(savedInstanceState);
            SetContentView(Resource.Layout.lyrics);
        }
    }
    
1
1 ответ                              1                         

Конечно, поехали ... это покажет вам, как получить доступ к файлам из папки Assets, а также как загрузить их в ListView с интерактивными результатами.

main_layout.axml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
                xmlns:app="http://schemas.android.com/apk/res-auto"
                xmlns:tools="http://schemas.android.com/tools"
                android:layout_width="match_parent"
                android:layout_height="match_parent">
  <ListView
    android:id="@+id/lvAssetFiles"
    android:layout_width="300dp"
    android:layout_height="300dp"
    android:layout_centerInParent="true"
    android:layout_weight="1"
    android:background="@android:color/transparent" />
</RelativeLayout>

MainActivity.cs

using System.Collections.Generic;
using Android.App;
using Android.OS;
using Android.Support.V7.App;
using Android.Widget;

namespace ListViewExample {

    [Activity(Label = "ListView Example", Theme = "@style/AppTheme.NoActionBar", MainLauncher = true)]
    public class MainActivity : AppCompatActivity {

        private ListView lvFiles;
        private List<string> lstFiles = new List<string>();

        protected override void OnCreate(Bundle savedInstanceState) {
            base.OnCreate(savedInstanceState);

            SetContentView(Resource.Layout.main_layout);

            // To get all .txt files in the Assets root folder...
            var listAssets = Assets.List("");
            foreach (var file in listAssets) {
                if (file.EndsWith(".txt"))
                    lstFiles.Add(file);
            }

            // To get all files in the Assets/Lyrics folder...
            //listAssets = Assets.List("Lyrics");
            //foreach (var file in listAssets)
            //    lstFiles.Add(file);

            var adapter = new ArrayAdapter(this, Android.Resource.Layout.SimpleSpinnerItem, lstFiles.ToArray());
            // Or, use this to keep the item highlighted after clicking
            //var adapter = new ArrayAdapter<string>(this, Android.Resource.Layout.SimpleListItemActivated1, lstFiles.ToArray());
            lvFiles = FindViewById<ListView>(Resource.Id.lvAssetFiles);
            lvFiles.Adapter = adapter;
            lvFiles.ItemClick += lvFiles_ItemClick;
            lvFiles.ChoiceMode = ChoiceMode.Single;
        }

        private void lvFiles_ItemClick(object sender, AdapterView.ItemClickEventArgs e) {
            var sItemSelected = lstFiles[e.Position];
            Android.Util.Log.Info("MyApp", $"Item Selected: {sItemSelected}");
        }

    }
}

Кроме того, убедитесь, что для каждого из ваших файлов в папке «Ресурсы» установлено «AndroidAsset» для «Действия сборки».

Ура!

    
1
2019-05-02 18: 08: 51Z
  1. Спасибо, я попробую это первым делом утром.
    2019-05-03 20: 25: 06Z
  2. Брюс, я действительно ценю помощь и усилия. Я отправил запрос на подключение в Linked-in. Я очень сильно страдал от ксамарина в течение очень долгого времени, и я был бы очень признателен, если бы вы могли мне помочь в любой степени (я не имею в виду бесплатно, хотя мой кошелек имеет ограничения).
    2019-05-04 10: 53: 06Z
источник размещен Вот