java - 我需要在自定义 ArrayAdapter 的每一行上显示一个微调器

标签 java android

这个想法是我想在 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/

相关文章:

java - 创建与外部主机的连接时如何获取 NAT 的外部端口以及如何在 Java 中实现 STUN

java - 文件输入到 arrayList 中。用于创建新对象的相同 arrayList

android - 如何检查 Intent 是显式还是隐式?

android - Android 中单个屏幕/Activity 上的多个 Web View

Android应用内购买如何获取订阅的到期日期

javascript - 将配置文件文件夹移动到 sdcard firefox mobile 14.0

android - 如何增加 Android 2.3 (Gingerbread) 上的堆大小?

java - 如何使用属性名称搜索java对象列表

java - 错误/AndroidRuntime(219) : java. lang.RuntimeException : Unable to start activity ComponentInfo{elf. app/elf.app.RoomInfoActivity} : java. lang.NullP

java - HashMap实现邻接表