我目前正在创建我的第一个“真实” 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()
方法更改图像,但它不起作用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/