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

时间:2015-10-27 19:48:30

标签: android audio gridview

我正在创建我的第一个“真正的”Android应用程序。这是一个非常简单的音箱应用程序,只有一个活动 对于这个音箱,我有一个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;
    }
}

MainActivity:

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上的click侦听器事件不再起作用了。即使属性android:focusable="false" android:focusableInTouchMode="false" android:clickable="false"
    你知道如何解决这个问题吗?

提前谢谢。

1 个答案:

答案 0 :(得分:1)

在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!
}