单击GridView中的项目时更改图像

时间:2011-08-07 21:13:50

标签: android android-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显示原始图标。

提前致谢。

2 个答案:

答案 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,这样可以提高性能,因为这是一项昂贵的操作。