android - 如何从GridView内的ImageView更改图像?

标签 android audio gridview

我目前正在创建我的第一个“真实” Android应用程序。这是一个非常简单的音箱应用程序,只有一个 Activity 。
对于此音箱,我有一个GridView,它显示与声音相对应的项目。这些项目由包含ImageView和TextView的LinearLayout组成。
基本上,我想做的是仅在关联声音播放期间,单击与ImageView关联的项目来更改ImageView的图像。
用我的代码会更好:

activity_main.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="#d6d6d6">

    <GridView
        android:id="@+id/list1"
        android:background="#ffffff"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:numColumns="auto_fit"
        android:gravity="center"
        android:columnWidth="100dp"
        android:stretchMode="columnWidth"
        android:verticalSpacing="5dp"
        android:horizontalSpacing="5dp"/>

</LinearLayout>

list_row.xml:

只有LinearLayout包含ImageView和TextView。

Sound.java类:

仅包含具有两个int的构造函数(一个用于声音ID,另一个用于图标ID)和一个用于描述的String。

SoundAdaptater.java类:
public class SoundAdaptateur extends ArrayAdapter<Sound>{

    private Sound[] items;
    private Context context = null;

    public SoundAdaptateur(Context context, int textViewResourceId, Sound[] items) {
        super(context, textViewResourceId, items);
        this.items = items;
        this.context = context;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View row = convertView;
        SoundHolder holder = null;

        if (row == null) {
            LayoutInflater vi = ((Activity)context).getLayoutInflater();
            row = vi.inflate(R.layout.list_row, null);

            holder = new SoundHolder();
            holder.imgIcon = (ImageView)row.findViewById(R.id.icon);
            holder.txtDescription = (TextView)row.findViewById(R.id.description);

            row.setTag(holder);
        }else {
            holder = (SoundHolder)convertView.getTag();
        }

        Sound sound = items[position];

        if(sound != null){
            holder.txtDescription.setText(sound.getDescription());
            holder.imgIcon.setImageResource(R.drawable.muscle1);
            //holder.imgIcon.setBackgroundResource(R.drawable.muscle1);
        }

        return row;
    }

    static class SoundHolder
    {
        ImageView imgIcon;
        TextView txtDescription;
    }
}

主要 Activity :
public class MainActivity extends AppCompatActivity {

    private Sound[] mSounds = null;
    private SoundAdaptateur mAdapter = null;
    private GridView mListView = null;
    private MediaPlayer mp = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mListView=(GridView)findViewById(R.id.list1);

        /*...*/

        mAdapter = new SoundAdaptateur(MainActivity.this, R.layout.list_row, mSounds);
        mListView.setAdapter(mAdapter);

        mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                if(mp != null)
                    mp.reset();
                mp = MediaPlayer.create(MainActivity.this, mSounds[position].getSoundResourceId());
                mp.start();
            }
        });
    }
}

使用此代码,该应用程序可以正常工作(声音很好),但是图像永远不会改变。

这是我尝试的:
  • 我尝试使用点击侦听器中的setImageResource()方法更改图像,但它不起作用
  • 我尝试使用ImageButton更改ImageView,但是此后,GridView上的单击侦听器事件不再起作用。即使具有android:focusable="false" android:focusableInTouchMode="false" android:clickable="false"属性。

    您是否知道如何解决此问题?

  • 先感谢您。

    最佳答案

    在SoundAdapter内部实现onClickListener,而不是在MainActivity内部实现onItemClickListener。
    在适配器中,您可以轻松修改imageView。

    但是,如果您坚持要在MainActivity中实现,则可以遍历子项并找到imageView,然后更改其图像。但不建议:

    for(int i=0;i<view.getChildCount;i++){
     View v = view.getChild(i);
     if(v instanceof ImageView)
      ((ImageView)v).DO WHAT YOU WANNA DO!
    }
    

    关于android - 如何从GridView内的ImageView更改图像?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33377181/

    相关文章:

    c# - GridView 模板列有条件地设置为只读

    asp.net - 显示多个新窗口

    java - android.text.Editable android.widget.EditText.getText() 在应用程序点击按钮

    java - Libgdx AssetsManager - 听起来已加载但 "Not Loaded Error"?

    java - 从服务器读取 JSON (Java)

    macos - 如何将 Docker 容器中的音频暴露给 Mac?

    c# - C# 中的音频流式传输到 icecast2(类似于 Edcast)

    c# - ASP.Net GridView RowUpdate 未触发且 RowUpdating 没有 NewValues

    android - Gradle找不到图书馆

    android - 如何在没有 viewPager 的情况下创建 TabLayout?