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