单击 GridView 中的项目时更改图像
我有一个包含 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 我显示原始图标。
提前致谢。
I have a GridView with 9 items. What I'm trying to do is when I click an item, its icon changes. The way I'm doing it returns
java.lang.ClassCastException: android.widget.LinearLayout
I have to classes:
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;
}
}
Here is my two xml files:
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>
Can anyone tell me what is wrong in my code? Or How to change the image of an item when pressing it? I think onTouchListener is more efficient, due to the fact that it has the event, so when event.getAction() == MotionEvent.ACTION_DOWN
I show the image and when event.getAction() == MotionEvent.ACTION_UP
I show the original icon.
Thanks in advance.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
我猜你在这里收到了ClassCastException:
发送的View实际上是ImageView所在的LinearLayout。你需要使用int位置获取项目,然后根据你的需要操作它,或者获取LinearLayout 内的 ImageView,这是您的网格项布局。
I guess you reveice the ClassCastException here:
The View sent is actually the LinearLayout in which the ImageView resides in. You need to get the item using the
int position
and then manipulate it to your needs, or get the ImageView inside the LinearLayout, which is your Grid Item Layout.如果您使用
ViewHolder
类,您不仅可以优化网格视图,还可以从OnItemClickListener
更轻松地访问图像视图。您在ImageAdapter
中需要类似的内容:然后将 getView 修改为如下所示:
现在在您的
OnItemClickListener
中,您可以像这样访问图像视图:这可以防止您经常调用
findViewById
,这将提高性能,因为这是一项昂贵的操作。If you use a
ViewHolder
class you can not only optimize your grid view, but would be able to access the imageview easier from yourOnItemClickListener
. You need something like this in yourImageAdapter
:Then modify your getView to be like this:
Now in your
OnItemClickListener
you can access your image view like this:This prevents you from having to call
findViewById
as often, and that will improve performance since it is an expensive operation.