2011-08-07 17 views
0

GridViewには9個のアイテムがあります。私がしようとしているのは、アイテムをクリックするとアイコンが変わるということです。GridViewのアイテムをクリックすると画像が切り替わります

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; 
    } 
} 

がある

MainLayout.java:私はそれをやっている方法は、私がクラスに持って

java.lang.ClassCastException: android.widget.LinearLayout 

を返します。私の2つの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私は元のアイコンを表示します。

ありがとうございます。

答えて

4

私はあなたがここにClassCastExceptionがreveice推測:

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を置くことができます。

4

ViewHolderクラスを使用すると、グリッドビューを最適化できるだけでなく、OnItemClickListenerから簡単に画像ビューにアクセスできるようになります。このようになり

class ViewHolder { 
    ImageView img; 
    TextView lbl; 
} 

は、その後、あなたのgetViewメソッドを変更します:あなたは、あなたのImageAdapterでこのようなものが必要で今

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を頻繁に呼び出す必要がなくなり、高価な操作であるためパフォーマンスが向上します。

+0

この場合、ClassCastExceptionが発生しますか? – ABI

+0

ClassCastExceptionをどのようにして取得していますか?私はこれに問題がなかった。 – Sleepybear

+0

ImageViewとしてキャストする必要があります。 'ImageView imageView =(ImageView)((ViewHolder)v.getTag())。img;' –

関連する問題