1

我有一個GridView排列成3x4矩陣,GridView中的每個項目都是一個包含ImageView和Textview的FrameLayout。最初將TextView設置爲顯示字母「X」。點擊時,該字母變爲「Y」。Android GridView不更新

它適用於除第一個以外的所有GridView項目。如果我點擊第一個(左上角),則無論等待多久,都不會發生任何事情。如果我然後單擊Android模擬器屏幕上的任何其他地方(即使在GridView本身之外),那麼左上角的GridView項目將更改爲「Y」。

我有一種感覺:這是什麼做的事實,「getView」,在「ImageAdapter」被稱爲幾次「位置= 0」的GridView控件呈現之前,順序如下:

現在也許這就是Android的工作原理,我不知道,但它似乎很奇怪。如果有人能幫助我,我會非常感激。

更新:它看起來問題與getView()中的「MyView = convertView」有關,如果我只是簡單地刪除它並總是創建一個新的View(就好像convertView總是爲null),那麼問題就不存在了。現在我不認爲這個解決方案會成爲一個問題,因爲我不使用滾動,創建的視圖數量應該是12(即3x4 GridView),但如果任何人都可以解釋問題的正確解決方案,它將有助於很多,謝謝。

我的主要活動(也是唯一的活動):

package com.xxxxxx.test; 

import android.app.Activity; 
import android.content.Context; 
import android.os.Bundle; 
import android.view.LayoutInflater; 
import android.view.Menu; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.AdapterView; 
import android.widget.AdapterView.OnItemClickListener; 
import android.widget.BaseAdapter; 
import android.widget.GridView; 
import android.widget.ImageView; 
import android.widget.TextView; 

public class MainActivity extends Activity 
{ 
    @Override 
    public void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.game); 

     init_gridview(); 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     getMenuInflater().inflate(R.menu.activity_main, menu); 
     return true; 
    } 

    private void init_gridview() 
    { 
      setContentView(R.layout.game); 
      GridView gridview = (GridView) findViewById(R.id.gridview); 
      gridview.setNumColumns(3); 
      gridview.setColumnWidth(32); 
      gridview.setAdapter(new ImageAdapter(this)); 

      gridview.setOnItemClickListener(new OnItemClickListener() 
      { 
       public void onItemClick(AdapterView<?> parent, View v, int position, long id) 
       { 
        grid_click(position,v); 
       } 
      }); 
    } 

    public class ImageAdapter extends BaseAdapter 
    { 
      private Context mContext; 

      public ImageAdapter(Context c) 
      { 
       mContext = c; 
      } 

      public int getCount() 
      { 
       return(3*4); 
      } 

      public Object getItem(int position) 
      { 
       return null; 
      } 

      public long getItemId(int position) 
      { 
       return 0; 
      } 

      public View getView(int position, View convertView, ViewGroup parent) 
      { 
       View MyView = convertView; 

       if (convertView == null) 
       { 
        LayoutInflater li = getLayoutInflater(); 
        MyView = li.inflate(R.layout.grid_item, null); 
       } 
       else 
       { 
        MyView=convertView; 
       } 

       TextView tv = (TextView)MyView.findViewById(R.id.grid_item_text); 
       tv.setText("X"); 

       ImageView iv = (ImageView)MyView.findViewById(R.id.grid_item_image); 
       iv.setImageResource(R.drawable.tile); 

       MyView.setLayoutParams(new GridView.LayoutParams(32,32)); 
       return(MyView); 
     } 
    } 

    private void grid_click(int position, View v) 
    { 
     View clicked_view=v; 

     TextView tv2 = (TextView)clicked_view.findViewById(R.id.grid_item_text); 
     tv2.setText("Y"); 
    } 
} 

主要佈局,稱爲game.xml:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/Layout1" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:layout_gravity="center" 
    android:orientation="vertical" 
    android:gravity="center" 
    android:background="@android:color/white"> 

<GridView 
     android:id="@+id/gridview" 
     android:background="@android:color/white" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:columnWidth="106dp" 
     android:numColumns="auto_fit" 
     android:verticalSpacing="0dp" 
     android:horizontalSpacing="0dp" 
     android:stretchMode="none" 
     android:gravity="center" 
     android:listSelector="@android:color/transparent" 
    /> 
</LinearLayout> 

最後的FrameLayout在GridView的每一個項目,叫grid_item.xml :

<?xml version="1.0" encoding="utf-8"?> 
<FrameLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:orientation="vertical" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent"> 

    <ImageView 
     android:id="@+id/grid_item_image" 
     android:src="@drawable/tile" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     tools:ignore="contentDescription" 
    /> 

    <TextView 
     android:id="@+id/grid_item_text" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:gravity="center" 
     android:textStyle="bold" 
     android:textSize="17sp" 
     android:shadowColor="#555555" 
     android:shadowDx="1.0" 
     android:shadowDy="1.0" 
     android:shadowRadius="1.5" 
    /> 

</FrameLayout> 

回答

0

我想問題在於你的grid_click函數它假設s被點擊的視圖是整個單元格(FrameLayout),當它可能只是圖像或文本視圖本身。

+0

我修改了grid_click()函數以使用getChildAt(position)獲取正確的視圖,但它仍然無法在第一個GridView項目上工作...... – Rick