Android网格视图教程问题(错误:无法从View转换为GridView)

时间:2011-09-18 07:04:20

标签: android gridview

我一直在尝试按照Android教程进行操作,并坚持使用Grid View Tutorial

我从本教程复制了main.xml,onCreate方法和ImageAdapter类的代码。但是,我遇到了几个错误,第一个是“无法从View转换为GridView”。

我在网上搜索了一个解决方案,大多数遇到类似错误的人通过正确的导入解决了这个问题。我使用Eclipse并使用其“CTRL + SHIFT + O”进行自动导入。

所以这是我的GridView.java

package com.example.hellogridview;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.Toast;

public class GridView extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        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) {
                Toast.makeText(HelloGridView.this, "" + position, Toast.LENGTH_SHORT).show();
            }
        });
    }
}

这是我的ImageAdapter.java

package com.example.hellogridview;

import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;

public class ImageAdapter extends BaseAdapter {
    private Context mContext;

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

    public int getCount() {
        return mThumbIds.length;
    }

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

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

    // create a new ImageView for each item referenced by the Adapter
    public View getView(int position, View convertView, ViewGroup parent) {
        ImageView imageView;
        if (convertView == null) {  // if it's not recycled, initialize some attributes
            imageView = new ImageView(mContext);
            imageView.setLayoutParams(new GridView.LayoutParams(85, 85));
            imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
            imageView.setPadding(8, 8, 8, 8);
        } else {
            imageView = (ImageView) convertView;
        }

        imageView.setImageResource(mThumbIds[position]);
        return imageView;
    }

    // references to our images
    private Integer[] mThumbIds = {
            R.drawable.sample_2, R.drawable.sample_3,
            R.drawable.sample_4, R.drawable.sample_5,
            R.drawable.sample_6, R.drawable.sample_7,
            R.drawable.sample_0, R.drawable.sample_1,
            R.drawable.sample_2, R.drawable.sample_3,
            R.drawable.sample_4, R.drawable.sample_5,
            R.drawable.sample_6, R.drawable.sample_7,
            R.drawable.sample_0, R.drawable.sample_1,
            R.drawable.sample_2, R.drawable.sample_3,
            R.drawable.sample_4, R.drawable.sample_5,
            R.drawable.sample_6, R.drawable.sample_7
    };
}

最后,main.xml

<?xml version="1.0" encoding="utf-8"?>
<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:columnWidth="90dp"
    android:numColumns="auto_fit"
    android:verticalSpacing="10dp"
    android:horizontalSpacing="10dp"
    android:stretchMode="columnWidth"
    android:gravity="center"
/>

谁能告诉我我做错了什么?感谢。

2 个答案:

答案 0 :(得分:3)

输入冲突。

你的Activity不能有名称GridView,因为它与android.widget.GridView冲突。编译器认为你想要转换为GridView扩展Activity,而不是widget类。

解决方案:

  1. 重命名GridView
  2. 在此处使用完全限定类型: android.widget.GridView gridview = (android.widget.GridView) findViewById(R.id.gridview);

答案 1 :(得分:0)

由于我找到了一些方法来使这个教程发挥作用(感谢老鼠的回答),我想给出我自己的详细答案,以防其他刚开始使用Android教程的人遇到同样的问题。< / p>

总之两个主要问题是将Activity命名为“HelloGridVIew”并删除“import.android.R;”在这两个课程中。以下是我所做的更详细的描述。

1

创建Android应用程序时,如何正确命名活动以避免名称冲突和其他问题非常重要。即,在Eclipse中执行File-&gt; New-&gt; Android Project。然后按照教程中的建议输入项目名称“HelloGridVIew”。我选择的项目名称是

com.example.hellogridview

然后,Eclipse会自动使用“HelloGridVIewActivity”填充“创建活动”字段。但重要的是将其更改为“HelloGridVIew”,因为本教程中的代码隐式假设此活动,即在onCreate()方法的这一行中

Toast.makeText(HelloGridView.this, "" + position, Toast.LENGTH_SHORT).show();

2

从HelloGridView.java中的教程中复制粘贴onCreate()方法。

3

创建一个名为ImageAdapter的新类(File-&gt; New-&gt; Class),并从教程中复制粘贴相应的代码。

4

在HelloGridView.java和ImageAdapter.java中按CTRL + SHIFT + O.这将使Eclipse导入必要的东西。但是,在这两个类的这一步中,Eclipse都会导入以下内容

import android.R;

这是不正确的。从这两个类中删除此行。在询问此问题之前,我在stackoverflow上找到了这一步。

这使我的例子工作。希望这也可以帮助其他人。