我是Android编程的新手,我遇到了一个问题...
当我点击列表视图中的某个项目时,我收到了错误的项目。
以下是代码的一部分:
on the DBHelper:
//view all
public ArrayList getAll()
{
ArrayList array_list = new ArrayList();
SQLiteDatabase db = this.getReadableDatabase();
Cursor res = db.rawQuery( "SELECT * FROM member", null );
res.moveToFirst();
while(res.isAfterLast() == false){
array_list.add(res.getString(res.getColumnIndex(MEMBER_COLUMN_NAME)));
res.moveToNext();
}
return array_list;
} //view all
// view all where status is not equal to 1
public ArrayList getStat()
{
ArrayList al_stat = new ArrayList();
SQLiteDatabase db = this.getReadableDatabase();
Cursor cur = db.rawQuery( "SELECT * FROM member WHERE status <> 1", null );
cur.moveToFirst();
while(cur.isAfterLast() == false){
al_stat.add(cur.getString(cur.getColumnIndex(MEMBER_COLUMN_NAME)));
cur.moveToNext();
}
return al_stat;
} //view all where selected is not equal to 1
这是VIEWSTAT ACTIVITY的一部分:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_reset);
mydb = new DBHelper(this);
ArrayList al_stat = mydb.getStat();
ArrayAdapter arAdapter =
new ArrayAdapter(this,android.R.layout.simple_list_item_1, al_stat);
//adding it to the list view.
stat = (ListView)findViewById(R.id.lvStat);
stat.setAdapter(arAdapter);
stat.setOnItemClickListener(new OnItemClickListener(){
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int args2,
long arg3) {
// TODO Auto-generated method stub
int idStat = args2 + 1;
Bundle dtBundle = new Bundle();
dtBundle.putInt("id", idStat);
Intent intent = new Intent(getApplicationContext(),ViewMemberInfo.class);
intent.putExtras(dtBundle);
startActivity(intent);
}
});
}
我正在使用活动中的第一个类来查看所有成员及其完美工作。点击一个项目,给我合适的人选/位置。
第二个类,我在不同的活动中使用它来查看状态不等于1的成员。 sql正在运行,但当我点击listview中的项目时,它没有给出/显示正确的成员。
Example:
In the VIEWALL ACTIVITY, I have:
Member Name:
Juan Cruz
Anna Marcos
Luke Santos
Mark San Jose
In VIEWSTAT ACTIVITY, I have:
Member Name:
Anna Marcos
Luke Santos
Mark San Jose
例如,我点击了“Anna Marcos”,显示的成员信息是“Juan Cruz”,等等......
重申一个问题:当我点击VIEWSTAT ACTIVITY中的某个项目时,它会在我选择/点击的项目上方显示项目/信息。我错过了什么?
感谢您的帮助。
答案 0 :(得分:0)
您可以在点击的位置
中获取ArrayAdaptor中的ObjectObject o = arg0.getItemAtPosition(args2);
arg0
是适配器,args2
是位置索引
答案 1 :(得分:0)
正如您在评论中所说,int idStat = args2 + 1;
是错误的逻辑。
你需要做这样的事情:
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int args2,
long arg3) {
// TODO Auto-generated method stub
int idStat =arAdapter.getItem(args2).getId();
Bundle dtBundle = new Bundle();
dtBundle.putInt("id", idStat);
Intent intent = new Intent(getApplicationContext(),ViewMemberInfo.class);
intent.putExtras(dtBundle);
startActivity(intent);
}
});
关键是,您需要使用getter
(您的arAdapter
适配器)获取人员ID(使用他们的listview's
)。
因此,arAdapter.getItem(args2).getId();
表示根据点击的位置获取此人的ID。
答案 2 :(得分:0)
为什么你在args2中加1?这基本上是点击项目的位置。所以它将成为你的arraylist的索引或位置号。让我们假设 ArrayList al_stat = mydb.getStat();
假设从db获取值后的Al_stat是这样的: Al_stat = {&#34;约翰&#34;&#34;米勒&#34;&#34;穆罕默德&#34;}; 所以现在约翰在0号位, 米勒在位置1, 穆罕默德在第2位, 您将此arrayList提供给Listview,并且无论何时单击某个项目,它都会返回位置编号 所以如果arg2给你u 0,Al_stat.get(0)会给你约翰, 但是你在args 2中加1,所以如果点击john,你就是这么做的 Args 2 + 1 = 1;所以你会得到米勒而不是约翰
答案 3 :(得分:0)
您实际的问题是您可能想要传递数据库ID,但要做到这一点,您必须将其保存在数组适配器中。 如果您没有在onclick处理程序中添加一个,那么您的应用就可以正常工作。这很明显但是Dude你的代码有很多错误所以请注意,你可以得到这工作。
一旦开始编写方法,就立即删除它们。
// TODO Auto-generated method stub
有意义的名字
public void onItemClick(ListView l, View v, int position, long id)
不要从表格中选择*它在任何大小系统上都会浪费,并且在将来改变表格时会出现问题。
SELECT mycol, myIdcol FROM member
调用getColumnIndex
函数的每个循环在读取循环之外调用一次。我知道在函数中链接和嵌入函数是多么容易,但在循环中你只需要为该循环执行必要的代码。
如何更简单快速的循环,让您的应用程序摇滚?在数据库打开后调用它时,moveToNext()
将自动为您执行moveToFirst()
。
int colName = res.getColumnIndex(MEMBER_COLUMN_NAME);
while (res.moveToNext()){
al_stat.add(cur.getString(colName));
}
或者如果您必须有moveToFirst()
if (moveToFirst){
do {
al_stat.add(cur.getString(colName));
} while (moveNext());
}
在我的代码中,我回到适配器并获取项目并发送意图,因此我不必再次访问数据库。您的代码可能不同,只发送一个int,然后点击数据库。
myitem = adapter.getItem(position);
Bundle extras = new Bundle();
extras.putParcelable("myItem",myitem);
intent.putExtras(extras);
startActivity(intent);