xamarin.android - 如何用 Assets 中的文件标题填充 listView?
问题描述
我开始在 Xamarin Android 中开发的应用程序中有一个歌词菜单选项。单击它时,它会启动一个名为 Lyrics 的新活动,其中有一个 listView 应该填充可单击的行,这些行具有 Assets 文件夹中 txt 文件的标题。
因此,如果 Assets 文件夹中有 3 个歌词X.txt 文件,则 listView 将如下所示:
[ lyrics1.txt ]
[ lyrics2.txt ]
[ lyrics3.txt ]
这些带有歌词标题的按钮应该是可点击的。
我试图将路径放入一个字符串文件,然后使用 Directory.EnumerateFiles .. 然后 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);
}
}
解决方案
当然,你去...这将向您展示如何从 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}");
}
}
}
此外,请确保 Assets 文件夹中的每个文件都设置为“构建操作”的“AndroidAsset”。
干杯!
推荐阅读
- python - TypeError:迭代 0-d 张量(python 社交距离检测 append())
- java - 正则表达式使用java拆分字符串
- javascript - 如何使用复杂的选择器将 Emotion/styled 组件转换为字符串语法
- python - 使用决策树模型传递单行字典进行预测
- python - AttributeError 模块 python pixellib
- amazon-web-services - 如何在 EC2 Connect AWS 中复制/粘贴
- azure-iot-hub - Azure IoT on Edge - IoTSDK - 从 ModuleClient 读取一批消息
- python-3.x - api 网关和 lambda 分页
- macos - VSCode - 缺少选项“附加 Visual Studio 代码”
- javascript - 计算特定 div 区域中的类名