saf*_*ari 5 android gridview cursor onitemclicklistener
我试过的
大家好,我首先创建了一个数据库,我已经填充了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上.请看一下!
<------------------------------------------------- - - 作品 - - - - - - - - - - - - - - - - - - - - - - - ------------------->我需要在我的代码中更改,我可以获取用户点击的图像的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);
}
}
Run Code Online (Sandbox Code Playgroud)
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;
}
}
Run Code Online (Sandbox Code Playgroud)
像这样我将带有一些文字的图片添加到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();
}
Run Code Online (Sandbox Code Playgroud)
登录猫
这是日志:
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)
Run Code Online (Sandbox Code Playgroud)
在这里,您可以找到我的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;
}
}
Run Code Online (Sandbox Code Playgroud)
将对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();
}
}
Run Code Online (Sandbox Code Playgroud)
苹果浏览器,
在检查了您的代码并分析了可能导致错误的原因之后,我注意到了一些事情。问题是您的代码正在尝试交换 rowID 和 viewID,但这实际上并不是所需的行为。
在 中OnItemClick(),id参数指的是rowID。您实际上并没有rowID(通过代码)保证 是唯一的,所以它失败了。虽然您可以通过“强制解决问题” getItemId(),但该函数仅提供指向对象(整数)的指针。忽略getItemId(),因为这只会给您带来痛苦。相反,获取视图本身,并viewId直接从中获取,如下所示:
编辑 source = v.getId().toString();
原因:由于您的表没有声明类型,因此它很可能作为字符串输入。我们知道 ImageID 现在正在返回,并且我们知道数据在那里......所以据我所知,剩下类型转换。
parent并且经常引起混乱,特别是对于像和view这样复杂的嵌套布局。但是,您的内容非常简单,应该引用存储在那里的内容。如果该文件存储在父级或其他类似父级中,则可能会出现问题,但您的情况并非如此。GridViewsListViewsGridViewvImageViewImageViewLinearLayout
这将绕过您担心的需要getItemId(int position),同样,这指的是rowId并且仅当您可以保证Adapter某些事情时才有效,特别是每个项目都是唯一的rowId。
其次,您的viewId值被设置为一个指针Integer,而不是值本身。Anint是原语,因此分配按预期发生。AnInteger是一个Object,因此赋值发生在对象的地址上,而不是对象本身。我建议将imageView.setId(mThumbIds[position]);(在你的getView())更改为:
imageView.setId(mThumbIds[position].intValue());
Run Code Online (Sandbox Code Playgroud)
这将获取原始值而不是对内存中对象的int引用。Integer除非您的代码中发生了其他错误(并且我没有立即看到任何内容),否则这应该可以解决您的问题。如果分配了setId不适当的值,它就会悄悄地失败,因此它可能无法工作并且只是不告诉您。id
最后,我看不到代码中“SOURCE”是什么类型的字段。它不显示实际的表创建。因此,进一步猜测您的特定数据库是不可能的。希望这可以帮助!
关于您的数据库 关于您的数据库,最突出的一点是您的 Simleys 表的 CREATE TABLE 语句。在 SQLite 中,如果您没有显式分配 Type,SQLite 将在您每次进行查询时确定 Type,并根据它认为字段中的类型返回类型。这意味着数字可以被解释为字符串,反之亦然。一般来说,它是相当可靠的,但是,它可能会导致陷阱。
代码中最大的问题之一是假设代码正在执行您想要的操作。事实上,只有你准确地告诉它要做什么,你才能保证这一点。
Array其次,我注意到,当您获取要为您构建的图像时ImageAdapter,您是在字段上进行查询INFO,而不是在SOURCE. 当您告诉onItemClick您正在获取SOURCE. 考虑更改此变量名称。
INFO其次,通过查询字段时出现功能障碍getSmiley(String info)。根据您的参数,它需要一个字符串而不是整数。String向对象添加 aContentValues与添加 Integer 不同。AString周围添加了 '',将 '1' 与 1 分开。这意味着您的所有内容都Integers被插入,String并且当您查询时,您没有包含必要的 ''。因此,建议进行一些更改。
首先,调整您的 CREATE TABLE 语句。
private static Final String CREATE_TABLE_SMILEY = "创建表smiley(_id整型主键自增," +SmileyDBAdapter.SOURCE+" not null ," +SmileyDBAdapter.INFO+ "整型not null );";
以这种方式更改语句将确保您获得的是整数而不是字符串。
接下来,按以下方式更改您的getImages():String infoItem = c.getString( ColumnIndex );int infoItem = c.getInt( ColumnIndex );
接下来,将您的更改createSmiley(String source, String info)为createSmiley(String source, int info). 这应该正确调整所有插入件。你的ContentValues对象(名为initialValues)将知道要做什么。
接下来,将您的更改getSmiley(String info)为getSmiley(int info). 这也应该正确调整您的查询。如果没有,请更改... + "=" + info + ...为... + "=" + info.toString() + ...。这将迫使您解决这个问题。
接下来,onItemClick()将此行更改source = v.getId().toString();回以进行匹配source = v.getId();
最后,您必须更改任何调用以createSmiley()发送 int 值,而不是转换为 String 的值。
这是需要做出很多改变(不是真正的改变)。因此,请在进行这些更改之前备份您的源文件。然后,只需卸载软件包(包括从模拟器中卸载,如果是模拟的)并重新安装它,因此它不会保留原始数据(包含字符串而不是整数)。
模糊逻辑
| 归档时间: |
|
| 查看次数: |
5596 次 |
| 最近记录: |