【问题标题】:Fill ImageAdapter with Int[]用 Int[] 填充 ImageAdapter
【发布时间】:2011-11-29 17:27:44
【问题描述】:

我做了什么


我在布局中创建了一个 GridView。这个 GridView 我想填充我创建的 Google 文档的 ImageAdapter:Hello GridView

我的图片的图片路径,我是否已保存到我的数据库中,我想将其填满。因为在我的数据库中,一切都是字符串,我在 Activity 中编写了一个将 String[] 更改为 Int[] 的短函数,但我无法通过 ImageAdapter 访问它。之后我应用了尼基塔夫人告诉我的更改。我也改为 lil 将 String[] 更改为 int[] (现在正在工作)。

问题


我需要更改什么才能让 Int[] 到我的 ImageAdapter,它可以导入我的图片并显示在 GrindView 中。 现在我有一个 Nullpointer 异常:

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

守则:


这是我的 SmileyConfigActivity.java 的代码:

package de.retowaelchli.filterit;

import de.retowaelchli.filterit.database.SmileyDBAdapter;
import de.retowaelchli.filterit.stats.ImageAdapter;
import android.app.Activity;
import android.content.Intent;
import android.database.Cursor;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.GridView;


public class SFilterConfigActivity extends Activity {

    //Variablen deklarieren
    private String name;
    private String keyword;
    private Integer[] info;
    private SmileyDBAdapter SmileyHelper;


@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.sfilter_config);

      SmileyHelper = new SmileyDBAdapter(this);

      getImages();

    }


public Integer[] getImages(){



    SmileyHelper.open();

    Cursor c = SmileyHelper.getAllSmileys();
    startManagingCursor(c);

    String[] picture = new String[] { SmileyDBAdapter.INFO };

    int i;
    for (i=0;i< picture.length-1;i++) {
        info[i]=Integer.parseInt(picture[i+1]);

    }

    SmileyHelper.close();

    //Hier wird die Grindview gefüllt
    GridView gridview = (GridView) findViewById(R.id.SmileyGrind);
    gridview.setAdapter(new ImageAdapter(this, info));

    return info;

}



public void onClickSConfigSave(View v){

    EditText edtTextName = (EditText)findViewById(R.id.SFConfigName);
    EditText edtTextKeyword = (EditText)findViewById(R.id.SFConfigKeyword);

    name = edtTextName.getText().toString();
    keyword = edtTextKeyword.getText().toString();

    final Intent i = new Intent(this, SmileyActivity.class);
    startActivity(i);
    }
}

这是我的 ImageAdapter.java 的代码:

    package de.retowaelchli.filterit.stats;

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


import de.retowaelchli.filterit.SFilterConfigActivity;

public class ImageAdapter extends BaseAdapter {

    private Context mContext;

    public ImageAdapter(Context c, Integer[] imageIds) {
        mContext = c;
        mThumbIds = imageIds;
    }

    //This Guy down here is giving me the NullpointerExcpetion now
    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;
}

这就是我将图片存储到数据库的方式(我只保存到它们所在的位置):

    int drawableID = context.getResources().getIdentifier("angel", "drawable", getPackageName());
    iv.setImageResource(drawableID);

    String info = String.valueOf(drawableID);

    mDbHelper.open();

    mDbHelper.createSmiley("You have received a heavenly message", info);
    mDbHelper.close();

这是我得到的错误日志:

10-04 13:26:25.776: ERROR/AndroidRuntime(10099): FATAL EXCEPTION: main
10-04 13:26:25.776: ERROR/AndroidRuntime(10099): java.lang.RuntimeException: Unable to start activity ComponentInfo{de.retowaelchli.filterit/de.retowaelchli.filterit.SFilterConfigActivity}: java.lang.NullPointerException
10-04 13:26:25.776: ERROR/AndroidRuntime(10099):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1816)
10-04 13:26:25.776: ERROR/AndroidRuntime(10099):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1837)
10-04 13:26:25.776: ERROR/AndroidRuntime(10099):     at android.app.ActivityThread.access$1500(ActivityThread.java:132)
10-04 13:26:25.776: ERROR/AndroidRuntime(10099):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1033)
10-04 13:26:25.776: ERROR/AndroidRuntime(10099):     at android.os.Handler.dispatchMessage(Handler.java:99)
10-04 13:26:25.776: ERROR/AndroidRuntime(10099):     at android.os.Looper.loop(Looper.java:143)
10-04 13:26:25.776: ERROR/AndroidRuntime(10099):     at android.app.ActivityThread.main(ActivityThread.java:4196)
10-04 13:26:25.776: ERROR/AndroidRuntime(10099):     at java.lang.reflect.Method.invokeNative(Native Method)
10-04 13:26:25.776: ERROR/AndroidRuntime(10099):     at java.lang.reflect.Method.invoke(Method.java:507)
10-04 13:26:25.776: ERROR/AndroidRuntime(10099):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
10-04 13:26:25.776: ERROR/AndroidRuntime(10099):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
10-04 13:26:25.776: ERROR/AndroidRuntime(10099):     at dalvik.system.NativeStart.main(Native Method)
10-04 13:26:25.776: ERROR/AndroidRuntime(10099): Caused by: java.lang.NullPointerException
10-04 13:26:25.776: ERROR/AndroidRuntime(10099):     at de.retowaelchli.filterit.stats.ImageAdapter.getCount(ImageAdapter.java:25)
10-04 13:26:25.776: ERROR/AndroidRuntime(10099):     at android.widget.GridView.setAdapter(GridView.java:131)
10-04 13:26:25.776: ERROR/AndroidRuntime(10099):     at de.retowaelchli.filterit.SFilterConfigActivity.getImages(SFilterConfigActivity.java:54)
10-04 13:26:25.776: ERROR/AndroidRuntime(10099):     at de.retowaelchli.filterit.SFilterConfigActivity.onCreate(SFilterConfigActivity.java:30)
10-04 13:26:25.776: ERROR/AndroidRuntime(10099):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1093)
10-04 13:26:25.776: ERROR/AndroidRuntime(10099):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1780)
10-04 13:26:25.776: ERROR/AndroidRuntime(10099):     ... 11 more

感谢您的帮助!

【问题讨论】:

  • 我不太明白。在getImages 方法中,您从数据库中获取所有图像并转换为整数。为什么不能使用这个数组并将其作为构造函数参数传递给ImageAdapter
  • 我试过这个,但它不起作用。我像这样导入了我的活动import de.retowaelchli.filterit.SFilterConfigActivity;afterwards 我像这样扩展了private Integer[] mThumbIds = { SFilterConfigActivity.getImages(); }; 但我没有工作我只是变成了这个错误:_Change getImages to static Intger[] getImages,如果我这样做它不起作用..
  • 所以请错过 Beloglazov,我做错了什么:(

标签: android database image integer


【解决方案1】:

这里似乎缺少很多相关信息,但如果您填写空白,我会更新答案。第一个问题是您在 getAllSmileys 函数中检索什么?

您需要了解的是,游标就像是结果的记忆表。因此,您需要通过使用移动命令告诉游标从哪个记录中获取,否则它是未初始化的。因此,假设您的笑脸存储在 SmileyDBAdapter.INFO 列中,那么您可以像这样检索它们:

SmileyHelper.open();

Cursor c = SmileyHelper.getAllSmileys();

if(c!=null)
{
   int i=0;
   info = new int[c.getCount()]();

   //get the column index
   int infoIndex = c.getColumnIndex(SmileyDBAdapter.INFO);

   while(c.moveToNext()){
       String infoItem = c.getString(infoIndex );
       int infoItemInteger = Integer.parseInt(infoItem);
       info[i++] =infoItemInteger;
   }
}

c.close();

SmileyHelper.close();

您将图像 ID 作为字符串存储在数据库中,这使事情变得更加复杂。无需解析和取值可绘制资源 ID 进出数据库中的文本列。只需将列类型更改为整数,并始终为您的图像使用整数。

您可以简单地使用 Cursor.getInt() 来检索值。

【讨论】:

  • 那些inttype 在这里被标记为错误,我收到此消息: int 上的语法错误,此标记后的维度除外。 -.-
  • 很抱歉,... int 是一种简单的数据类型。坚持简单的数组可能更好
  • 顺便说一下,Integer 是一个围绕 int 的包装类,因此您可以使用它。我已经调整了答案以使用简单的 int
【解决方案2】:

尝试在 ImageAdapter 中创建构造函数

public ImageAdapter(Context c, Integer[] imageIds) {
    mContext = c;
    mThumbIds = imageIds;
}

并在getImagesMethod 中替换

gridview.setAdapter(new ImageAdapter(this));

gridview.setAdapter(new ImageAdapter(this, info));

【讨论】:

  • 对于Contect c你说Context c对吗?对于mContexx = c;,你换了mContect = c;,对吗?我改变了它,但它仍然不起作用我仍然做错了什么,对不起,我对 Android 和 Java 很陌生
  • 您好,Beloglazov 小姐,我更新了代码,并试图让它工作几个小时,但我仍然不明白我做错了什么。我仍然无法编译它......我也尝试设置private Integer[] mThumbIds也没有工作...... :(
  • @safari 在getImages 方法中创建数组picture 数组,其中包含字符串"Info",然后您尝试将其解析为数字。这就是它抛出异常的原因。
【解决方案3】:

我正在尝试这个并找到了这个解决方案。唯一有效的。

public Integer[] getImages(){

        SmileyHelper.open();

        Cursor c = SmileyHelper.getAllSmileys();    

        ArrayList<Integer> infoList = new ArrayList<Integer>();

        c.getColumnIndex(SmileyDBAdapter.INFO);
        int ColumnIndex = c.getColumnIndex(SmileyDBAdapter.INFO);

        if(c!=null)
        {

           while(c.moveToNext()){
               String infoItem = c.getString( ColumnIndex );
               infoList.add(Integer.parseInt(infoItem));
           }
        }

        info = infoList.toArray(new Integer[]{});

        c.close();


        SmileyHelper.close();

        //Hier wird die Grindview gefüllt
        GridView gridview = (GridView) findViewById(R.id.SmileyGrind);
        gridview.setAdapter(new ImageAdapter(this, info));

        return info;

    }

【讨论】:

  • 在这种情况下,列表可能有点矫枉过正。性能方面,您可能希望设置 List 的初始大小,以确保内存管理不会立即尝试为您调整大小。
猜你喜欢
  • 2011-06-09
  • 2014-01-24
  • 2016-07-22
  • 1970-01-01
  • 1970-01-01
  • 2011-10-09
  • 2018-10-27
  • 1970-01-01
  • 2012-12-23
相关资源
最近更新 更多