我正在创建我的第一个“真正的”Android应用程序。这是一个非常简单的音箱应用程序,只有一个活动
对于这个音箱,我有一个GridView,显示与声音对应的项目。此项目由包含ImageView和TextView的LinearLayout组成
基本上我想要做的是仅在与相关声音播放时间点击与ImageView相关联的项目时更改ImageView的图像。
用我的代码会更好:
<?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>
只有一个LinearLayout包含ImageView和TextView。
只包含一个带有两个int的构造函数(一个用于声音id,另一个用于图标id)和一个String用于描述。
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;
}
}
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"
提前谢谢。
答案 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!
}