2013-11-28 80 views
1

我有问题listview。我有我的主要活动叫SecondActivity.java其中我只有按钮kierunkiButton。创建这个按钮,新的活动点击后,KierunkiActivity.java你可以看到如下:Listview显示两次所有行

kierunkiButton.setOnClickListener(new OnClickListener() { 
      public void onClick(View arg0) { 
       Intent intent = new Intent(); 
      intent.setClass(SecondActivity.this, KierunkiActivity.class); 
      startActivity(intent); 

          } 
     }); 

新的活动,KierunkiActivity是一个ListActivity,你可以看到如下:

public class KierunkiActivity extends ListActivity { 

    SharedPreferences preferences; 
    SQLiteDatabase sqliteData; 
    static String kier; 
    static ArrayList<String> results = new ArrayList<String>(); 

    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.lista_activity2); 
     preferences = PreferenceManager.getDefaultSharedPreferences(this); 
     openAndQueryDatabase(); 
     displayResultList(); 
    } 

    protected void onListItemClick(ListView l, View v, int position, long id) { 
     super.onListItemClick(l, v, position, id); 
     //Object o = this.getListAdapter().getItem(position); 
     Object selectedItem = l.getItemAtPosition(position); 
     kier = selectedItem.toString(); 

     if (position == 0) { 
      Intent intent = new Intent(); 
      intent.setClass(KierunkiActivity.this, MatematykaActivity.class); 
      startActivity(intent); 
     } else if (position == 1) { 
      Intent intent = new Intent(); 
      intent.setClass(KierunkiActivity.this, MatematykaActivity.class); 
      startActivity(intent); 
     } 
    } 

    private void openAndQueryDatabase() { 
     try { 
      DBHelper dbHelper = new DBHelper(this.getApplicationContext()); 
      sqliteData = dbHelper.getReadableDatabase(); 

      Cursor c = sqliteData.rawQuery(
        "select Kierunek from Kierunki order by _id", null); 
      System.out.println("------cursor: " + c.getCount()); 

      if (c != null) { 
       if (c.moveToFirst()) { 
        do { 
         String kier = c.getString(c.getColumnIndex("Kierunek")); 
         results.add(kier); 
        } while (c.moveToNext()); 
       } 
      } 

      System.out.println("---------" + results.size() + "--------------"); 
     } catch (SQLiteException se) { 
      Log.e(getClass().getSimpleName(), 
        "Could not create or Open the database"); 
     } 

    } 

    private void displayResultList() { 

     setListAdapter(new ArrayAdapter<String>(this, 
       android.R.layout.simple_list_item_1, results)); 
     getListView().setTextFilterEnabled(true); 

    } 

我的问题是,要每次点击kierunkibutton时,都会添加列表视图(在我的KierunkiActivity中)行。


我的意思:我第一次点击kierunkibutton我有2行(正确的)。当我回到以前的活动,并再次点击kierunkibutton我有这些旧的2行和2行额外(当然是相同的)。而第三次我有六个,继续前进。 我认为我应该检查这个listview是否在点击kierunkibutton后每次都被填充,或者从这个listview中删除所有行。但我不知道该怎么做。

enter image description here

你有任何想法如何做到这一点? 在此先感谢!

+0

你必须先清除你的数组列表,然后再次点击它。 –

+0

嘿请发布您的KierunkiActivity的完整代码,所以我们可以帮助您 –

回答

3

只需从代码顶部删除new ArrayList<String>();并将其置于openAndQueryDatabase方法中即可。

private void openAndQueryDatabase() { 
    results = new ArrayList<String>(); 
} 
+0

你有什么我的问题 –

+0

所以我应该期待 –

+0

@PoojaDubey,我会说不要..因为工作量,我不能专注于你问题亲爱的..如果你有时间等待,我会帮助,但我在非常紧张的时间表。:( –

0

使用CursorLoaderLoaderManager.LoaderCallbacks<Cursor>来管理您的数据游标(如从数据库结果)。

这样你就不会挂起主线程。

1

您必须在每次单击按钮时刷新ArrayList。否则,它会使用现有项目加载新项目。

results.clear(); 
if (c != null) { 
      if (c.moveToFirst()) { 
       do { 
        String kier = c.getString(c.getColumnIndex("Kierunek")); 
        results.add(kier); 
       } while (c.moveToNext()); 
      } 
     } 

在将数据加载到列表之前,只需添加clear()语句即可。

或实例你列出你的openAndQueryDatabase内像这样的()方法,

private void openAndQueryDatabase() { 
    results = new ArrayList<String>(); 
    // Rest of your code 
} 

试试这个,我希望这可以帮助你。谢谢。

0

您有一个成员变量result,每次调用openAndQueryDatabase时都会追加结果。这意味着您每次都要添加到现有的项目列表中,因此您将获得重复项目。

让openAndQueryDatabase返回结果集合然后您可以将它传递给displayResultList可能会更好。

1

您的适配器的数据源是变量“结果”您已定义为静态:

static ArrayList<String> results = new ArrayList<String>(); 

删除static关键字和你的问题就会迎刃而解。静态变量在应用程序的整个生命周期中保持不变。所以当你离开活动并且实例被销毁时,静态变量仍然存在。当你回到活动并再次创建它时,静态变量就像以前一样,并且正在添加到以前的内容。删除static关键字,每次创建活动时都会重新创建变量。

0

感谢您的回答!

我所做的是为@Chintan Rathod说:

private void openAndQueryDatabase() { 
    results = new ArrayList<String>(); 
} 

,一切完美的作品。非常感谢!

+0

你应该接受回答我的朋友,而不是在这里发布相同..你可以接受只需勾选“真”就在下面的特定答案:) –

+0

这就是我做@Chintan。一个“嘀嗒”是从我:) – k4sia