Xamarin.android 如何用资产中文件的标题填充列表视图?

Xamarin.android 如何用资产中文件的标题填充列表视图?,xamarin.android,Xamarin.android,我在Xamarin Android上开始开发的一个应用程序中有一个歌词菜单选项。单击它时,它会启动一个名为“歌词”的新活动,其中有一个列表视图,该列表视图中应填充可单击的行,这些行在资产文件夹中具有txt文件的标题 因此,如果Assets文件夹中有3个lyricsX.txt文件,listView将如下所示: [ lyrics1.txt ] [ lyrics2.txt ] [ lyrics3.txt ] 这些带有歌词标题的按钮应该可以点击 我尝试将路径放入字符串文件,然后使用Directory.

我在Xamarin Android上开始开发的一个应用程序中有一个歌词菜单选项。单击它时,它会启动一个名为“歌词”的新活动,其中有一个列表视图,该列表视图中应填充可单击的行,这些行在资产文件夹中具有txt文件的标题

因此,如果Assets文件夹中有3个lyricsX.txt文件,listView将如下所示:

[ lyrics1.txt ]
[ lyrics2.txt ]
[ lyrics3.txt ]
这些带有歌词标题的按钮应该可以点击

我尝试将路径放入字符串文件,然后使用Directory.enumerate文件。。然后foreach完成该操作并将结果写入调试控制台,但不会记录任何内容。也许我的方法不对,我只是不知道我到底做错了什么

[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);
        }
    }
[活动(Label=“歌词”)]
公共课歌词:活动
{
创建时受保护的覆盖无效(Bundle savedInstanceState)
{
string assetsPath=Android.App.Application.Context.GetExternalFilesDir(null).AbsolutePath;
var assetcontents=Directory.EnumerateFiles(assetsPath);
TextView title=findviewbyd(Resource.Id.lyricsttitle);
foreach(AssetContent中的var文件名)
{
调试(“调试”,“名称:”+文件名);
}
base.OnCreate(savedInstanceState);
SetContentView(资源.布局.歌词);
}
}

当然可以,给你。。。这将向您展示如何从Assets文件夹访问文件,以及如何将文件加载到具有可单击结果的ListView中

主布局。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}");
        }

    }
}
使用System.Collections.Generic;
使用Android.App;
使用Android.OS;
使用Android.Support.V7.App;
使用Android.Widget;
名称空间ListViewExample{
[活动(Label=“ListView示例”,Theme=“@style/AppTheme.NoActionBar”,MainLauncher=true)]
公共类MainActivity:AppCompativeActivity{
私有ListView文件;
私有列表lstFiles=新列表();
创建时受保护的覆盖无效(Bundle savedInstanceState){
base.OnCreate(savedInstanceState);
SetContentView(Resource.Layout.main_布局);
//要获取资产根文件夹中的所有.txt文件。。。
var listAssets=资产。列表(“”);
foreach(listAssets中的var文件){
if(file.EndsWith(“.txt”))
lstFiles.Add(文件);
}
//要获取资产/歌词文件夹中的所有文件。。。
//listAssets=Assets.List(“歌词”);
//foreach(listAssets中的var文件)
//lstFiles.Add(文件);
var adapter=new ArrayAdapter(这个,Android.Resource.Layout.SimpleSpinnerItem,lstFiles.ToArray());
//或者,使用此选项在单击后保持项目高亮显示
//var adapter=new ArrayAdapter(这个,Android.Resource.Layout.SimpleListItemActivated1,lstFiles.ToArray());
lvFiles=findviewbyd(Resource.Id.lvAssetFiles);
lvFiles.Adapter=适配器;
lvFiles.ItemClick+=lvFiles\u ItemClick;
lvFiles.ChoiceMode=ChoiceMode.Single;
}
私有void lvFiles\u ItemClick(对象发送者,AdapterView.ItemClickEventArgs e){
var sItemSelected=lstFiles[e.Position];
Android.Util.Log.Info(“MyApp”,选定$”项:{sItemSelected});
}
}
}
此外,确保资产文件夹中的每个文件都设置为“AndroidAsset”以执行“构建操作”


干杯

谢谢你,我早上第一件事就是试试这个。布鲁斯,我真的很感谢你的帮助和努力。我已在已链接的上发送连接请求。我和Xamarin一起饱受煎熬已经很长一段时间了,如果你能在任何程度上帮助我,我会非常感激(我不是说免费的,尽管我的钱包有限制)。