我有一个包含9个项目的GridView。我要做的是当我点击一个项目时,它的图标会发生变化。我正在做的方式返回
java.lang.ClassCastException: android.widget.LinearLayout
我必须上课:
MainLayout.java
public class MainLayout extends Activity implements OnItemClickListener
{
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.mainlayout);
getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE, R.layout.window_title);
final ImageButton btn=(ImageButton)findViewById(R.id.logoimagebutton);
btn.setBackgroundColor(Color.TRANSPARENT);
btn.setOnTouchListener(new OnTouchListener() {
public boolean onTouch(View v, MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN ) {
btn.setImageResource(R.drawable.logoselected);
Toast.makeText(getApplicationContext(), "Clicked", Toast.LENGTH_SHORT).show();
//return true;
}else if (event.getAction() == MotionEvent.ACTION_UP) {
btn.setImageResource(R.drawable.logo);
}
return false;
}
});
final GridView gridview = (GridView) findViewById(R.id.gridview);
gridview.setAdapter(new ImageAdapter(this));
gridview.setOnItemClickListener(new OnItemClickListener()
{
public void onItemClick(AdapterView<?> parent, View v, int position, long id)
{
ImageView imageView = (ImageView) v;
imageView.setImageResource(ImageAdapter.mThumbSelected[position]);
}
});
}
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3)
{
// TODO Auto-generated method stub
}
}
ImageAdapter.java
public class ImageAdapter extends BaseAdapter
{
private Context mContext;
public static Integer[] mThumbIds =
{
//a collection of images
};
public static Integer[] mThumbSelected =
{
//a collection of images
};
private String[] mLabelsIds = {//a collection of strings};
public ImageAdapter(Context c)
{
// TODO Auto-generated constructor stub
mContext = c;
}
@Override
public int getCount()
{
// TODO Auto-generated method stub
return mThumbIds.length;
}
@Override
public Object getItem(int arg0)
{
// TODO Auto-generated method stub
return mThumbIds[arg0];
}
@Override
public long getItemId(int arg0)
{
// TODO Auto-generated method stub
return arg0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent)
{
View grid;
if (convertView == null)
{
grid = new View(mContext);
LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
grid = inflater.inflate(R.layout.menugrid, parent, false);
} else
{
grid = (View) convertView;
}
ImageView imageView = (ImageView) grid.findViewById(R.id.imageicon);
TextView textView = (TextView) grid.findViewById(R.id.imagelabel);
imageView.setImageResource(mThumbIds[position]);
textView.setText(mLabelsIds[position]);
return grid;
}
}
这是我的两个xml文件:
menugrid.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical">
<ImageView
android:id="@+id/imageicon"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
/>
<TextView
android:id="@+id/imagelabel"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:textColor="#000000"
android:textSize="16px"
android:gravity="center_horizontal"/>
</LinearLayout>
mainlayout.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/mainlayout"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
android:background="@drawable/background">
<LinearLayout
android:id="@+id/holdlogo"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:background="@drawable/title_background">
<ImageButton
android:id="@+id/logoimagebutton"
android:scaleType="center"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:src="@drawable/logo"
>
</ImageButton>
</LinearLayout>
<GridView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/gridview"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:numColumns="auto_fit"
android:layout_marginTop="10px"
android:verticalSpacing="10dp"
android:horizontalSpacing="10dp"
android:columnWidth="90dp"
android:stretchMode="columnWidth"
android:gravity="center"
/>
</LinearLayout>
有谁能告诉我我的代码有什么问题?或者如何在按下时更改项目的图像?我认为onTouchListener效率更高,因为它有事件,因此当我event.getAction() == MotionEvent.ACTION_DOWN
显示图像时,event.getAction() == MotionEvent.ACTION_UP
显示原始图标。
提前致谢。
答案 0 :(得分:4)
我猜你会在这里看到ClassCastException:
public void onItemClick(AdapterView<?> parent, View v, int position, long id)
{
ImageView imageView = (ImageView) v;
imageView.setImageResource(ImageAdapter.mThumbSelected[position]);
}
发送的视图实际上是ImageView所在的LinearLayout。您需要使用int position
获取项目然后根据需要进行操作,或者在LinearLayout内获取ImageView,这是您的网格项目布局。
答案 1 :(得分:4)
如果您使用的是ViewHolder
课程,则不仅可以优化网格视图,还可以更轻松地从OnItemClickListener
访问影像视图。您需要ImageAdapter
:
class ViewHolder {
ImageView img;
TextView lbl;
}
然后将你的getView修改为:
public View getView(int position, View convertView, ViewGroup parent)
{
ViewHolder holder;
if (convertView == null)
{
LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = inflater.inflate(R.layout.menugrid, parent, false);
holder = new ViewHolder();
holder.img = (ImageView) convertView.findViewById(R.id.imageicon);
holder.lbl = (TextView) convertView.findViewById(R.id.imagelaberl);
convertView.setTag(holder);
} else
{
holder = (ViewHolder) convertView.getTag();
}
ImageView imageView = holder.img;
TextView textView = holder.lbl;
imageView.setImageResource(mThumbIds[position]);
textView.setText(mLabelsIds[position]);
return convertView;
}
现在,在您的OnItemClickListener
中,您可以像这样访问您的图片视图:
public void onItemClick(AdapterView<?> parent, View v, int position, long id)
{
ImageView imageView = ((ViewHolder) v.getTag()).img;
imageView.setImageResource(ImageAdapter.mThumbSelected[position]);
}
这可以防止您经常调用findViewById
,这样可以提高性能,因为这是一项昂贵的操作。