列表视图在单击时提供错误数据

时间:2014-11-10 02:54:07

标签: android listview android-listview

我是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中的某个项目时,它会在我选择/点击的项目上方显示项目/信息。我错过了什么?

感谢您的帮助。

4 个答案:

答案 0 :(得分:0)

您可以在点击的位置

中获取ArrayAdaptor中的Object
Object 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);