- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这个想法是我想在 ListView 中显示 SDCARD 中的 mp3 文件列表,每行还包含一个带有三个项目(共享、重命名和删除)的微调器,我为此使用了自定义 arrayadapter,但我不知道如何在自定义 arrayadapter 类上添加微调器
这是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"
android:theme="@style/AppTheme"
tools:context=".MainActivity"
>
<ListView
android:id="@+id/list"
android:layout_width="match_parent"
android:layout_height="416dp"
android:layout_alignParentStart="true"
android:layout_alignParentTop="true"
android:layout_marginStart="0dp"
android:layout_marginTop="0dp"
android:layout_alignParentLeft="true"
android:layout_marginLeft="0dp" />
<Button
android:id="@+id/stopBtn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="12dp"
android:layout_marginLeft="12dp"
android:layout_marginBottom="28dp"
android:text="Stop" />
</LinearLayout>
这是我创建微调器的地方
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
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"
android:orientation="horizontal"
android:paddingLeft="14dp"
>
<TextView
android:id="@+id/text1"
android:layout_width="0dp"
android:layout_height="33dp"
android:layout_weight="1"
android:gravity="center|start"
/>
<Spinner
android:id="@+id/spinner"
android:layout_width="31dp"
android:layout_height="33dp"
android:layout_gravity="right"
android:background="@drawable/download"
>
</Spinner>
</LinearLayout>
这里我创建数据类型
public class MyDataType {
// Name of the song
private String mSongName;
// Drawable Menu resource ID
private int mSpinner;
/** Audio resource ID for the word */
//private int mAudioResourceId;
//public MyDataType(String vName, int imageResourceId, int audioResourceId){
public MyDataType(String vName, int spinner){
mSongName = vName;
mSpinner = spinner;
//mAudioResourceId = audioResourceId;
}
public String getSongName() {
return mSongName;
}
public int getSpinner() {
return mSpinner;
}
}
这里我创建了自定义适配器
public class SongAdapter extends ArrayAdapter<MyDataType> {
public SongAdapter(Context context, ArrayList<MyDataType> words) {
super(context, 0, words);
}
Spinner mSpinner;
ArrayAdapter<CharSequence> mAdapter;
@Override
public View getView(int position, View convertView, ViewGroup parent) {
MyDataType currentSong = getItem(position);
View listItemView = convertView;
if (listItemView == null) {
listItemView = LayoutInflater.from(getContext()).inflate(R.layout.song_list, parent, false);
}
TextView songTextView = (TextView)
listItemView.findViewById(R.id.text1);
songTextView.setText(currentSong.getSongName());
mSpinner = (Spinner) listItemView.findViewById(R.id.spinner);
return listItemView;
}
}
这是主要 Activity
public class MainActivity extends AppCompatActivity {
private static final String SD_PATH = Environment.getExternalStorageDirectory().getAbsolutePath() + "/Xylophone/";
ArrayList<MyDataType> file_list = new ArrayList<MyDataType>();
private final ArrayList<String> songs = new ArrayList<String>();
private MediaPlayer mp = new MediaPlayer();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final MediaPlayer mp = new MediaPlayer();
//updatePlayList();
if (ActivityCompat.checkSelfPermission(this,
android.Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) {
fillList();
} else {
ActivityCompat.requestPermissions(this, new String[] {android.Manifest.permission.READ_EXTERNAL_STORAGE}, 100);
}
final SongAdapter adapter = new SongAdapter(this, file_list);
ListView listView = (ListView) findViewById(R.id.list);
listView.setAdapter(adapter);
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
try{
mp.reset();
mp.setDataSource(SD_PATH + songs.get(position));
mp.prepare();
mp.start();
}catch (IOException e){
Log.v(getString(R.string.app_name),e.getMessage() );
}
}
});
Button stopPlay = (Button) findViewById(R.id.stopBtn);
stopPlay.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
mp.stop();
}
});
}
private void fillList() {
File file = new File(SD_PATH );
File list[] = file.listFiles();
for (int i = 0; i < list.length; i++) {
//file_list.add(list[i].getName(),);
songs.add(list[i].getName());
MyDataType myList = new MyDataType(list[i].getName(), R.id.spinner);
file_list.add(myList);
}
}
}
包含菜单项的字符串值
<resources>
<string name="app_name">PlayMp3List</string>
<string-array name="spinner_data">
<item>Rename</item>
<item>Delete</item>
<item>Share</item>
</string-array>
</resources>
最佳答案
好的,看起来您几乎已经准备好了所需的所有东西。但是,在其发挥作用之前,您需要进行一些细微的更改。首先,在检查权限(如果授予权限)的代码中,调用 fillList()。但在 Else 条件下,您请求许可。在上面的代码中,您没有显示如何处理权限请求的结果。如果在请求之后授予权限,那么在这种情况下,您还必须在那里调用 fillList() 。并且,在调用 fillList() 后,您还需要重新创建 SongAdapter,并在 ListView 上重做 setAdapter。
在 fillList() 中,您将使用歌曲标题和微调器的 ID 来初始化 myList 项。你不应该这样做。您应该做的是用微调器的“值”填充 myList 项...默认值可能应该是 0。
在自定义适配器的 getView() 方法中,您将根据位置参数获取当前项目并将歌曲标题放入 textView 中。然后,您将获得对 Spinner 的引用,但您没有用它做任何事情。获得引用后,您应该执行类似 mSpinner.value = currentSong.getSpinner();
的操作您想要在 MyDataType 类中执行的操作是存储微调器的值,而不是对微调器本身的任何引用。您还需要某种单击事件,以便如果用户更改行中微调器的值,您可以使用新值更新 ArrayList。假设用户可以更改所选的微调器项目,如果不能,那么当您创建列表时,您必须弄清楚要设置每首歌曲的微调器值的值,而您没有这样做。
您的适配器代码应如下所示。请注意 getContext() 的删除。
public class SongAdapter extends ArrayAdapter<MyDataType> {
Context mContext = null;
public SongAdapter(Context context, ArrayList<MyDataType> words) {
super(context, 0, words);
mContext = context;
}
Spinner mSpinner;
ArrayAdapter<CharSequence> mAdapter;
@Override
public View getView(int position, View convertView, ViewGroup parent) {
MyDataType currentSong = getItem(position);
View listItemView = convertView;
if (listItemView == null) {
listItemView = LayoutInflater.from(mContext.inflate(R.layout.song_list, parent, false);
}
TextView songTextView = (TextView)
listItemView.findViewById(R.id.text1);
songTextView.setText(currentSong.getSongName());
mSpinner = (Spinner) listItemView.findViewById(R.id.spinner);
mSpinner.value = currentSong.getSpinner();
return listItemView;
}
}
在列表项单击方法中,您需要设置一个断点以查看在 mp.setDataSource 中传递的路径是否有效。您的 SD_PATH 可能需要在末尾添加“/”或其他内容。
在你的layout.xml 文件中,你可以像这样定义你的微调器:
<Spinner
android:id="@+id/spinner1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:entries="@array/country_arrays"
android:prompt="@string/country_prompt" />
条目 @array/country_arrays 指向您在 Strings.xml 中定义的列表
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">MyAndroidApp</string>
<string name="country_prompt">Choose a country</string>
<string-array name="country_arrays">
<item>Malaysia</item>
<item>United States</item>
<item>Indonesia</item>
<item>France</item>
<item>Italy</item>
<item>Singapore</item>
<item>New Zealand</item>
<item>India</item>
</string-array>
</resources>
您缺少 spinner xml 定义中的值:
<Spinner
android:id="@+id/spinner"
android:layout_width="31dp"
android:layout_height="33dp"
android:layout_gravity="right"
android:background="@drawable/download"
android:entries="@array/spinner_data"
>
</Spinner>
关于java - 我需要在自定义 ArrayAdapter 的每一行上显示一个微调器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56908329/
要更新 Listview 我们可以做以下两件事: 1) 创建一个新的ArrayAdapter,并在每次更新数据时将其绑定(bind)到ListView。 this.listView.setAdapte
基本上我所拥有的是一个显示 ListView 的 fragment 。它目前使用 ArrayAdapter。但是,我正在尝试扩展 ArrayAdapter 以制作我自己的自定义适配器。然后,当我更改代
这真的很奇怪。 当我为 ListView 使用标准 ArrayAdapter 时,调用 setItemChecked 工作正常 但是当使用定制的 ArrayAdapter 时它不会。 原因是什么?这是
我想在我的 android 应用程序中使用 AutoCompleteTextView。我知道如何将它与简单的字符串数组一起使用,但我希望 AutoCompleteTextView 使用对象列表来执行完
问题总结:adapter和spinner都在Spinner Activity中。一旦用户选择了一个名字,它就会将它们发送到主 Activity 。我想从另一个 Activity 中调用 ArrayAd
lang.NullPointerException android.widget.ArrayAdapter.init(ArrayAdapter.java)只是将 Arraylist 值添加到 cust
在开发 Android 应用程序时,我从类似于“Item 1”、“Item 2”、“Item 3”的网站上得到了一行响应我需要将这一行转换为一个列表,以便在 simplelistitem 的数组适配器
您好,我如何检查复选框是否已选中,以及是否已选中我怎样才能删除有问题的行?谢谢你 数组适配器: public class Todoadapter extends ArrayAdapter {
https://developer.android.com/guide/topics/ui/declaring-layout#FillingTheLayout 在这些文档中,我们有以下代码 fragm
我有一个填充数据“neededRepData”的列表,我正在尝试将此列表添加到我的适配器中,但遇到了问题。下面是我的 Reps 类和我的方法(来自另一个类)来迭代所需的 RepData。 public
拥有可以处理多种对象类型的数组适配器的最佳实践是什么? Adapter extends ArrayAdapter 我有 3 种类型的类(class) A.class , B.class , C.cla
我正在制作一个将 JSON 数据解析为 ListView 的应用程序。这对我不起作用;它没有给我任何数据。 这是我的代码: public class MainActivity extends AppC
我有一个 Activity 从另一个 Activity 加载sharedPreference,并从当我编译我的应用程序时,使用 arrayAdpter 将 sharePreferenece 放入 li
我尝试使用 arrayAdapter 自定义将图像和文本加载到 ListView,但加载图像失败 这是我的数组适配器 public class CustomAdapter extends ArrayA
我在使用我的应用程序时遇到问题。我刚刚开始开发该应用程序,到目前为止只花了大约 15 个小时。但我遇到了障碍。通常我可以用谷歌搜索障碍,我的大部分答案都来自这个论坛! 所以我希望我能找到解决方案。下面
我之前曾用其他适配器(如 SimpleAdapter)问过这个问题,但简单适配器的解决方案不适用于 ArrayAdapter。在 SimpleAdapter 中,我获得了屏幕宽度和高度,然后将其传递给
我有 3 个类(class),我希望使用自动完成文本框向用户显示来自 Web 服务(rest api)的某些数据(又名城市)。我已经在我自己的应用程序的各种功能上使用了这个实现,但是由于某种原因,te
我正在从 Google App Engine 获取字符串形式的数据,因此我必须在一个线程中执行此操作。接下来我想在 ListView 中显示它,我正在尝试执行类似以下代码的操作: public voi
我有一个带有自定义 ArrayAdapter 的 ListView ,它设置在一个 fragment 中。仅设置 ListView 中的第一行。 这可能是一般使用带有 fragment 的 ListV
我正在尝试修改 MyKong 中的代码,添加一些更改 TextView 字体的行,但是当我尝试运行时遇到强制关闭。 这里是 MobileArrayAdapter.java > package com.
我是一名优秀的程序员,十分优秀!