Listview显示所有行的两次

时间:2013-11-28 11:07:22

标签: java android listview android-listview

我对 listview 有疑问。我的主要活动名为SecondActivity.java,我只有按钮,例如 kierunkiButton 。点击此按钮后,会创建新活动KierunkiActivity.java,如下所示:

 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行(当然是相同的)。在第三次我有六个并继续下去。 我想我应该在每次点击 kierunkibutton 后检查是否填充了这个列表视图,或者从这个列表视图中删除所有行。但我不知道如何做到这一点。

enter image description here

你知道怎么做吗? 提前谢谢!

6 个答案:

答案 0 :(得分:3)

只需从代码顶部删除new ArrayList<String>();,然后将其放入openAndQueryDatabase方法。

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

答案 1 :(得分: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
}

试试这个,我希望这会对你有所帮助。谢谢。

答案 2 :(得分:1)

适配器的数据源是变量'results',您已将其定义为static:

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

删除static关键字,您的问题就会消失。静态变量在应用程序的生命周期内持续存在。因此,当您离开活动并且实例被销毁时,静态变量仍然存在。当您返回活动并再次创建它时,静态变量就像之前一样,并且您将添加到之前的内容中。删除static关键字,每次创建活动时都会重新创建变量。

答案 3 :(得分:0)

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

这样你就不会挂主线了。

答案 4 :(得分:0)

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

最好让openAndQueryDatabase返回结果集合,然后将其传递给displayResultList。

答案 5 :(得分:0)

感谢您的回答!

我做的是@Chintan Rathod说:

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

一切都很完美。非常感谢!