当前位置: 首页 > 知识库问答 >
问题:

Android网格视图未更新

万嘉石
2023-03-14

我有一个以3x4矩阵排列的GridView,GridView中的每一项都是一个包含ImageView和Textview的FrameLayout。最初,文本视图被设置为显示字母“X”。点击后,字母变成“Y”。

它适用于除第一项之外的所有GridView项。如果我点击第一个(左上角),那么无论我等待多长时间,都不会发生任何事情。如果我点击Android模拟器屏幕上的任何其他地方(甚至在GridView本身之外),那么左上角的GridView项将变为“Y”。

我有一种直觉,这与以下事实有关:在GridView呈现之前,“ImageAdapter”中的“getView”被多次调用,并且“position=0 ”,顺序如下:

0 0 1 2 3 4 5 6 7 8 9 10 11 0

现在也许这就是Android的工作原理,我不知道,但这似乎很奇怪。如果有人能帮助我,我会非常感激。

更新:这个问题似乎与getView()中的“MyView=convertView”有关,如果我简单地删除它并总是创建一个新视图(就好像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> 

最后,网格视图中每个项目的框架布局,称为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>

共有1个答案

寿卜鹰
2023-03-14

我认为问题在于您的grid_click函数,它假设所单击的视图是整个单元格(FrameLayout>),而它可能只是图像或文本视图本身。

 类似资料:
  • 和 ListView 一样,GridView 也是一个 ViewGroup,它用来将各种不同的控件整合到一起,按照一个二维可以滚动的网格视图展示出来。同时也遵循 MVC 模式,依靠 Adapter 自动帮我们完成 UI 和数据的绑定。 1. GridView 的特性 GridView 在 Android App 中运用非常广泛,比如我们手机的系统相册将我们的照片及照片名称按照网格的样式排列起来,并

  • 网格视图是一个类似数据表的视图,将文档和字段显示为行和列。导航栏可让你快速地切换、插入或删除文档。 使用网格添加一个文档 点击现有的记录并在导航栏点击 或按 CTRL+N 来得到一个空白显示的文档。 输入所需的数据。 请看记录左侧的选择框。它会由指示当前记录的图形符号 变为指示你正在编辑该记录的图形符号 。 若要保存文档,只需简单地移动到另一个文档或在导航栏点击 。 【注意】如果你的集合是空的,会

  • 网格视图是一个类似数据表的视图,将文档和字段显示为行和列。导航栏可让你快速地切换、插入或删除文档。 使用网格添加一个文档 点击现有的记录并在导航栏点击 或按 COMMAND-+ 来得到一个空白显示的文档。 输入所需的数据。 请看记录左侧的选择框。它会由指示当前记录的图形符号 变为指示你正在编辑该记录的图形符号 。 若要保存文档,只需简单地移动到另一个文档或在导航栏点击 。 【注意】如果你的集合是空

  • 网格视图是一个类似数据表的视图,将文档和字段显示为行和列。导航栏可让你快速地切换、插入或删除文档。 使用网格添加一个文档 点击现有的记录并在导航栏点击 或按 CTRL+N 来得到一个空白显示的文档。 输入所需的数据。 请看记录左侧的选择框。它会由指示当前记录的图形符号 变为指示你正在编辑该记录的图形符号 。 若要保存文档,只需简单地移动到另一个文档或在导航栏点击 。 【注意】如果你的集合是空的,会

  • 我在Android编程领域相对来说是个新手,我遇到了一些麻烦。问题是我在MainActivity中定义了一个gridview,它由几个imageViews组成。这些ImageViews有一个onClicklistener,它用另一个gridView打开另一个活动。当在这个网格中选择一个元素(图像)时,我想更新我的MainActivity中的gridview来采用所选择的元素,但实际上我不知道如何实

  • 本文向大家介绍Android网格视图GridView的使用,包括了Android网格视图GridView的使用的使用技巧和注意事项,需要的朋友参考一下 GridView(网格视图)是按照行列的方式来显示内容的,一般用于显示图片,图片等内容,比如实现九宫格图,用GridView是首选,也是最简单的。主要用于设置Adapter。 网格视图GridView的排列方式与矩阵类似,当屏幕上有很多元素(文字、