使用原始文件在列表视图中添加图像视图

Posted

技术标签:

【中文标题】使用原始文件在列表视图中添加图像视图【英文标题】:Add imageview in listview with a raw file 【发布时间】:2016-04-18 20:15:58 【问题描述】:

我想做一个音板。为此,我制作了一个 listview 和一个 xml 文件(用于名称和声音)。

首先,我制作了一个带有声音标题的列表视图。当我们点击它时,就会播放声音。

主活动:

 mSoundPlayer = new SoundPlayer(this);
        Sound[] soundArray = SoundStore.getSounds(this);

        ListView listView = (ListView) findViewById(R.id.listView);

        final ArrayAdapter<Sound> adapter =
                new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, soundArray);

        listView.setAdapter(adapter);
        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() 
            @Override
            public void onItemClick(AdapterView parent, View view, int position, long id) 
                Sound sound = (Sound) parent.getItemAtPosition(position);
                mSoundPlayer.playSound(sound);
            
        );

我使用xml 文件来索引声音的名称和声音。

文件:arrays.xml:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string-array name="labels">
        <item>First sound</item>
        <item>Second soung</item>
    </string-array>

    <integer-array name="ids">
        <item>@raw/a1</item>
        <item>@raw/a2</item>
    </integer-array>
</resources>

最后,我的布局:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_
    android:layout_
    android:paddingLeft="0dp"
    android:paddingRight="0dp"
    android:paddingTop="0dp"
    android:paddingBottom="0dp"
    tools:context="com.clemb.sardboard.MainActivity">

    <ListView xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/listView"
        android:numColumns="auto_fit"
        android:gravity="center"
        android:columnWidth="100dp"
        android:verticalSpacing="5dp"
        android:stretchMode="columnWidth"
        android:layout_
        android:layout_/>
</RelativeLayout>

我只想知道如何在声音名称前添加图片。我可以在我的 array.xml 中做吗?

谢谢。

【问题讨论】:

【参考方案1】:

您可以将图像添加到您的array.xml,看看这里Storing R.drawable IDs in XML array

要在名称之前设置图像,您需要创建自己的ArrayAdapter 以与您的ListView 一起使用

SoundItemAdapter adapter =
        new SoundItemAdapter(this, android.R.layout.sound_item, soundArray);

listView.setAdapter(adapter); 

...数组适配器

public class SoundItemAdapter extends ArrayAdapter<Sound> 
    private ArrayList<Sound> sounds;
    private int soundItemLayoutId;
    private Context context;

    public SoundItemAdapter(Context context, int soundItemLayoutId, ArrayList<Sound> sounds) 
        super(context, soundItemLayoutId, sounds);
        this.context=context;
        this.soundItemLayoutId = soundItemLayoutId;
        this.sounds = sounds;

    

    @Override
    public View getView(int position, View convertView, ViewGroup parent) 

        ViewHolderItem viewHolder;
        if(convertView==null)
            convertView = LayoutInflater.from(context).inflate(soundItemLayoutId, parent, false);
            //set up a ViewHolder to avoid calling findViewById() on every call to getView == smoother scroll
            viewHolder = new ViewHolderItem();
            viewHolder.name = (TextView) convertView.findViewById(R.id.name);
            viewHolder.image = (ImageView) convertView.findViewById(R.id.image);
            // store the holder with the view.
            convertView.setTag(viewHolder);
         else 
             // return the viewHolder
            viewHolder = (ViewHolderItem) convertView.getTag();
        

        Sound sound = sounds.get(position);
        if (sound != null) 
            viewHolder.name.setText(sound.name);
            viewHolder.image.setImageDrawable(ContextCompat.getDrawable(context,sound.image));
        
        return convertView;
        


    class ViewHolderItem 
        TextView name;
        ImageView image;
    

sound_item.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:orientation="horizontal"
    android:layout_
    android:layout_>


    <ImageView
        android:layout_
        android:layout_
        tools:src="@android:drawable/ic_media_play"
        android:id="@+id/image" />

    <TextView
        android:layout_
        android:layout_
        android:gravity="start|center"
        android:textAppearance="?android:attr/textAppearanceMedium"
        tools:text="Sound Name"
        android:id="@+id/name"
        android:layout_weight="1" />
</LinearLayout>

【讨论】:

【参考方案2】:

您需要创建一个自定义数组适配器。 Custom Array adapter 和 Codepath - Custom ArrayAdapter 是一些例子。

我可以在我的数组中做吗?

不在 xml 中。为此目的有ArrayList。

【讨论】:

【参考方案3】:

我觉得这个问题可以在这个帖子里回答:How to add an icon to a listview in a fragment

在您的场景中,您只需要进行适当的更改以在活动中使用,而不是在片段中使用。从概念上讲,它应该是相同的。您正在为每个列表项自定义布局以包含一个图像视图。

【讨论】:

以上是关于使用原始文件在列表视图中添加图像视图的主要内容,如果未能解决你的问题,请参考以下文章

在 Picasso 图像加载器中加载位图图像会减慢列表视图中的滚动速度

如何在相对布局中添加固定标题和滚动视图表行?

在另一个模板中显示来自 Django 视图的 HTML 表

在列表视图项中动态设置图像视图很慢

在 UIView 外部(而不是内部)添加边框

SQL 如何查询指定架构中所有表(或视图)的名称