其他分享
首页 > 其他分享> > android – 在GridView中获取View的ID

android – 在GridView中获取View的ID

作者:互联网

我试过的

大家好,我首先创建了一个数据库,我已经填充了3个Collumns,RowID,imageID,text.之后我创建了一个GridView,如果填充在我的数据库中.现在我已经创建了一个onItemClickListner,我想在其中获取imageID.
发生这种情况后,我在此imageID之后搜索我的DB-Table,以获取文本.这个东西我需要保存在我的另一个表中.
问题是我认为,我没有得到imageID,并且喜欢这个serach for not not in the DB,如果你看一下Logcat,你会发现它是null,所以它可能没有得到imageID或者我在我的DBAdapter中搜索不像我应该的那样.

IMPORTRANT:
我终于得到了View thx的ID到FuzzialLogic,但是仍然存在问题,我无法将Row放在我的Cursor上.请看一下!

&LT ———————————————— – – -作品 – – – – – – – – – – – – – – – – – – – – – – ——————–&GT
我需要在我的代码中更改什么,我可以获取用户点击的图像的ID.之后我想用我的图像ID搜索我的数据库,以获取我用图像存储的文本.
之后这个东西进入我的另一个表.

在这里,您可以看到Code和LogCat-Log.
如果有人需要,我还添加了我的DatabaseAdapter.
感谢您提前帮助!

SFilterConfigActivity.class:

    package de.retowaelchli.filterit;

import java.util.ArrayList;

import android.app.Activity;
import android.content.Intent;
import android.database.Cursor;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.EditText;
import android.widget.GridView;
import android.widget.Toast;
import android.*;

import de.retowaelchli.filterit.database.SmileyDBAdapter;
import de.retowaelchli.filterit.database.SFilterDBAdapter;
import de.retowaelchli.filterit.stats.ImageAdapter;




public class SFilterConfigActivity extends Activity {

    //Variablen deklarieren
    private String name;
    private String keyword;
    private String smiley;
    private String text;

    private String source;
    private Integer[] info;

    private SmileyDBAdapter SmileyHelper;
    private SFilterDBAdapter mDbHelper;


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

      SmileyHelper = new SmileyDBAdapter(this);
      mDbHelper = new SFilterDBAdapter(this);

      getImages();
      grid();
    }


public void grid(){

    //Hier wird die GridView definiert und anschliesend über den ImageAdapter gefüllt
    final GridView gridview = (GridView) findViewById(R.id.SmileyGrind);
    gridview.setAdapter(new ImageAdapter(this, info));


    //Hier wird definiert was passiert wenn auf ein Bild in der GridView geklickt wird
    gridview.setOnItemClickListener(new OnItemClickListener(){

        public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
            Toast.makeText(SFilterConfigActivity.this, "" + position, Toast.LENGTH_SHORT).show();
           // gridview.setSelection(position);
           // Funktioniert noch nich Custom GridView Layout dafür erstellen siehe Stackoverflow
            if(position == gridview.getSelectedItemPosition()){
                v.setBackgroundColor(0xFF00FF00);

            }
            else{
                v.setBackgroundColor(0x0000000);
            }

            //Hier wird herrausgefunden welche ID das Bild hat und in den jeweiligen String gespeichert
            source = (new Long(id)).toString();

            SmileyHelper.open();
            Cursor c = SmileyHelper.getSmiley(source);
            startManagingCursor(c);

            if (c.moveToFirst()) { 
                do { 
                text = c.getString(c.getColumnIndex(SmileyDBAdapter.SOURCE)); 
                smiley = c.getString(c.getColumnIndex(SmileyDBAdapter.INFO)); 

                } while (c.moveToNext());
            SmileyHelper.close();


            }

        }

    });
}


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();


    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();

    mDbHelper.open();
    mDbHelper.createSFilter(name, keyword, smiley, text);
    mDbHelper.close();

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

ImageAdapter.class

    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 {

    // references to our images
    private Integer[] mThumbIds;
    private Context mContext;


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

    }



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

    public Object getItem(int position) {
        return mThumbIds[position];
    }

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

    // create a new ImageView for each item referenced by the Adapter
    public View getView(final 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.setId(mThumbIds[position]);

        imageView.setImageResource(mThumbIds[position]);




        return imageView;




    }

}

像这样我将带有一些文字的图片添加到DB:

   private void angry(){

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

        //String info = String.valueOf(drawableID);
        String info = String.valueOf(drawableID);

        mDbHelper.open();

        mDbHelper.createSmiley("You received a angry message", info);

        mDbHelper.close();
    }

登录猫

这是日志:

10-12 11:32:29.632: DEBUG/Database(25130): dbopen(): path = /data/data/de.retowaelchli.filterit/databases/filterit, flag = 6
10-12 11:32:29.632: DEBUG/Database(25130): dbopen(): path = /data/data/de.retowaelchli.filterit/databases/filterit, free size = 663
10-12 11:32:30.612: DEBUG/Database(25130): dbopen(): path = /data/data/de.retowaelchli.filterit/databases/filterit, flag = 6
10-12 11:32:30.612: DEBUG/Database(25130): dbopen(): path = /data/data/de.retowaelchli.filterit/databases/filterit, free size = 663
10-12 11:32:30.632: ERROR/Database(25130): Error inserting text=null smiley=null keyword=test name=test
10-12 11:32:30.632: ERROR/Database(25130): android.database.sqlite.SQLiteConstraintException: error code 19: constraint failed
10-12 11:32:30.632: ERROR/Database(25130):     at android.database.sqlite.SQLiteStatement.native_execute(Native Method)
10-12 11:32:30.632: ERROR/Database(25130):     at android.database.sqlite.SQLiteStatement.execute(SQLiteStatement.java:61)
10-12 11:32:30.632: ERROR/Database(25130):     at android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1671)
10-12 11:32:30.632: ERROR/Database(25130):     at android.database.sqlite.SQLiteDatabase.insert(SQLiteDatabase.java:1515)
10-12 11:32:30.632: ERROR/Database(25130):     at de.retowaelchli.filterit.database.SFilterDBAdapter.createSFilter(SFilterDBAdapter.java:89)
10-12 11:32:30.632: ERROR/Database(25130):     at de.retowaelchli.filterit.SFilterConfigActivity.onClickSConfigSave(SFilterConfigActivity.java:143)
10-12 11:32:30.632: ERROR/Database(25130):     at java.lang.reflect.Method.invokeNative(Native Method)
10-12 11:32:30.632: ERROR/Database(25130):     at java.lang.reflect.Method.invoke(Method.java:507)
10-12 11:32:30.632: ERROR/Database(25130):     at android.view.View$1.onClick(View.java:2186)
10-12 11:32:30.632: ERROR/Database(25130):     at android.view.View.performClick(View.java:2532)
10-12 11:32:30.632: ERROR/Database(25130):     at android.view.View$PerformClick.run(View.java:9277)
10-12 11:32:30.632: ERROR/Database(25130):     at android.os.Handler.handleCallback(Handler.java:587)
10-12 11:32:30.632: ERROR/Database(25130):     at android.os.Handler.dispatchMessage(Handler.java:92)
10-12 11:32:30.632: ERROR/Database(25130):     at android.os.Looper.loop(Looper.java:143)
10-12 11:32:30.632: ERROR/Database(25130):     at android.app.ActivityThread.main(ActivityThread.java:4196)
10-12 11:32:30.632: ERROR/Database(25130):     at java.lang.reflect.Method.invokeNative(Native Method)
10-12 11:32:30.632: ERROR/Database(25130):     at java.lang.reflect.Method.invoke(Method.java:507)
10-12 11:32:30.632: ERROR/Database(25130):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
10-12 11:32:30.632: ERROR/Database(25130):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
10-12 11:32:30.632: ERROR/Database(25130):     at dalvik.system.NativeStart.main(Native Method)

在这里,您可以找到我的SmileyDBAdapter代码.

SmileyDB

package de.retowaelchli.filterit.database;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

public class SmileyDBAdapter {

        public static final String ROW_ID = "_id";
        public static final String SOURCE = "source";
        public static final String INFO = "info";

        private static final String DATABASE_TABLE = "smiley";

        private DatabaseHelper mDbHelper;
        private SQLiteDatabase mDb;

        private final Context mCtx;

        private static class DatabaseHelper extends SQLiteOpenHelper {

            DatabaseHelper(Context context) {
                super(context, DBAdapter.DATABASE_NAME, null, DBAdapter.DATABASE_VERSION);
            }

            @Override
            public void onCreate(SQLiteDatabase db) {
            }

            @Override
            public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
            }
        }

        /**
         * Constructor - takes the context to allow the database to be
         * opened/created
         * 
         * @param ctx
         *            the Context within which to work
         */
        public SmileyDBAdapter(Context ctx) {
            this.mCtx = ctx;
        }


        public SmileyDBAdapter open() throws SQLException {
            this.mDbHelper = new DatabaseHelper(this.mCtx);
            this.mDb = this.mDbHelper.getWritableDatabase();
            return this;
        }

        /**
         * close return type: void
         */
        public void close() {
            this.mDbHelper.close();
        }


        public long createSmiley(String source, String info ){
            ContentValues initialValues = new ContentValues();
            initialValues.put(SOURCE, source);
            initialValues.put(INFO, info);
            return this.mDb.insert(DATABASE_TABLE, null, initialValues);
        }


        public boolean deleteSmiley(long rowId) {

            return this.mDb.delete(DATABASE_TABLE, ROW_ID + "=" + rowId, null) > 0;
        }

        public Cursor getAllSmileys() {

            return this.mDb.query(DATABASE_TABLE, new String[] { ROW_ID,
                    SOURCE, INFO }, null, null, null, null, null);
        }




        //Es wird nach der ID des smiley gesucht.
        public Cursor getSmiley(String info) throws SQLException {

            Cursor mCursor =

            this.mDb.query(true, DATABASE_TABLE, new String[] { ROW_ID, SOURCE,
                    INFO }, INFO + "=" + info, null, null, null, null, null);
            if (mCursor != null) {
                mCursor.moveToFirst();
            }
            return mCursor;
        }


        public boolean updateSmiley(long rowId, String source, String info,
                String cache){
            ContentValues args = new ContentValues();
            args.put(SOURCE, source);
            args.put(INFO, info);

            return this.mDb.update(DATABASE_TABLE, args, ROW_ID + "=" + rowId, null) >0; 
        }

    }

将对DBAdapter

package de.retowaelchli.filterit.database;

import android.content.Context;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

public class DBAdapter {

    public static final String DATABASE_NAME = "filterit";

    public static final int DATABASE_VERSION = 1;

    public static final String CREATE_TABLE_ADFILTER = "create table adfilter (_id integer primary key autoincrement, "
    + ADFilterDBAdapter.NAME+" not null ,"
    + ADFilterDBAdapter.KEYWORD+" not null ,"
    + ADFilterDBAdapter.CACHE + " not null );";

    private static final String CREATE_TABLE_SFILTER = "create table sfilter (_id integer primary key autoincrement, "
    +SFilterDBAdapter.NAME+" not null ,"
    +SFilterDBAdapter.KEYWORD+" not null ,"
    +SFilterDBAdapter.SMILEY+ " not null ,"
    +SFilterDBAdapter.TEXT+ " not null );";

    private static final String CREATE_TABLE_ADMESSAGES = "create table admessages (_id integer primary key autoincrement, "
    +MessagesDBAdapter.PHONENUMBER+" not null ,"
    +MessagesDBAdapter.MESSAGE+ " not null );";


    private static final String CREATE_TABLE_SMILEY = " create table smiley (_id integer primary key autoincrement, "
    +SmileyDBAdapter.SOURCE+" not null ,"
    +SmileyDBAdapter.INFO+ " not null );";


    private final Context context; 
    private DatabaseHelper DBHelper;
    private SQLiteDatabase db;

    /**
     * Constructor
     * @param ctx
     */
    public DBAdapter(Context ctx)
    {
        this.context = ctx;

    }

    private static class DatabaseHelper extends SQLiteOpenHelper 
    {
        DatabaseHelper(Context context) 
        {
            super(context, DATABASE_NAME, null, DATABASE_VERSION);
        }

        @Override
        public void onCreate(SQLiteDatabase db) 
        {
            db.execSQL(CREATE_TABLE_ADFILTER);
            db.execSQL(CREATE_TABLE_SFILTER);
            db.execSQL(CREATE_TABLE_ADMESSAGES);
            db.execSQL(CREATE_TABLE_SMILEY);
        }

        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, 
        int newVersion) 
        {               
            // Adding any table mods to this guy here
        }
    } 

   /**
     * open the db
     * @return this
     * @throws SQLException
     * return type: DBAdapter
     */
    public DBAdapter open() throws SQLException 
    {
        this.DBHelper = new DatabaseHelper(this.context);
        this.db = this.DBHelper.getWritableDatabase();
        return this;
    }

    /**
     * close the db 
     * return type: void
     */
    public void close() 
    {
        this.DBHelper.close();
    }

}

解决方法:

苹果浏览器,

在查看您的代码并分析可能导致错误的原因后,我注意到了一些事情.问题是您的代码正在尝试交换rowID和viewID,但这实际上并不是所需的行为.

在OnItemClick()中,id参数引用rowID.你实际上没有一个rowID(由代码保证)是唯一的,所以它失败了.虽然您可以通过getItemId()“强制解决问题”,但该函数仅提供指向对象(Integer)的指针.忽略getItemId(),因为这只会让你感到痛苦.相反,抓住视图本身,直接从它获取viewId,如下所示:

EDIT source = v.getId().toString();
原因:由于您的TABLE没有声明Type,因此很可能以String形式出现.我们知道ImageID现在正在返回,我们知道数据就在那里……因此,就我所知,这就留下了类型转换.

父和视图经常引起混淆,特别是对于像GridViews和ListViews这样复杂的嵌套布局.但是,您的GridView非常简单,v应该引用存储在那里的ImageView.如果ImageView存储在LinearLayout或其他类似的父级中,则可能存在问题,但对您来说并非如此.

这将绕过你担心getItemId(int位置)的需要,同样,这指的是rowId,只有在你可以向Adapter保证某些东西时才有效,特别是每个项目的唯一rowId.

其次,viewId设置为Integer的指针而不是值本身. int是原语,因此赋值按预期发生.整数是一个对象,因此赋值发生在对象的地址上,而不是对象本身.我建议改变imageView.setId(mThumbIds [position]); (在你的getView()中):

   imageView.setId(mThumbIds[position].intValue());

这将获得原始int值,而不是对内存中Integer对象的引用.除非您的代码中出现其他错误(并且我没有立即看到任何内容),否则这应解决您的问题. setId意味着如果为其分配了不适当的id,则会安静地失败,因此它可能无法正常工作而根本不会告诉您.

最后,我无法看到代码中“SOURCE”的字段类型.它不显示实际的表创建.因此,进一步猜测您的特定数据库是不可能的.希望这可以帮助!

关于你的数据库
关于数据库的主要特点是Simleys表的CREATE TABLE语句.在SQLite中,如果没有显式分配Type,SQLite将在每次进行查询时确定Type,并根据它在字段中的内容返回类型.这意味着数字可以被解释为String,反之亦然.一般来说,它可能非常可靠,但是,它可能会导致陷阱.

代码中最大的问题之一是假设代码正在执行您想要的操作.事实上,如果你准确告诉它该做什么,你只能保证这一点.

其次,我注意到当你为ImageAdapter获取构建数组的图像时,你正在对INFO字段进行查询,而不是SOURCE.当您告诉onItemClick您获得SOURCE时,这在您的代码中会产生误导.考虑更改此变量名称.

接下来,通过getSmiley(字符串信息)查询INFO字段时出现功能障碍.根据您的参数,它期望一个String而不是一个Integer.将String添加到ContentValues对象与添加Integer不同.一个字符串被添加”围绕它,将’1’与1分开.这意味着你的所有整数都被INSERTED作为字符串,当你查询时,你不包括必要的”.因此建议进行一些更改.

>首先,调整您的CREATE TABLE语句.

private static final String CREATE_TABLE_SMILEY =“create table smiley(_id integer primary key autoincrement,”
 SmileyDBAdapter.SOURCE“not null,”
 SmileyDBAdapter.INFO“integer not null);”;

以这种方式更改语句将确保您获得整数而不是字符串.

>接下来,按以下方式更改getImages():String infoItem = c.getString(ColumnIndex); to int infoItem = c.getInt(ColumnIndex);
>接下来,将createSmiley(String source,String info)更改为createSmiley(String source,int info).这应该正确调整所有插入.您的ContentValues对象(名为initialValues)将知道该怎么做.
>接下来,将getSmiley(String info)更改为getSmiley(int info).这也应该正确调整您的查询.如果没有,请更改…“=”info … to …“=”info.toString()….这将强制您解决问题.
>接下来,通过更改此行source = v.getId().toString();使您的onItemClick()匹配; back to source = v.getId();
>最后,您必须更改对createSmiley()的任何调用以发送int值,而不是转换为String的值.

这是很多变化(不是真的).因此,请在进行这些更改之前备份源文件.然后它只是卸载包(包括从模拟器,如果它被模拟)并重新安装它的问题,所以它不保留原始数据(使用字符串而不是整数).

FuzzicalLogic

标签:android,cursor,gridview,onitemclicklistener
来源: https://codeday.me/bug/20190521/1147455.html