首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Listview显示两次所有行

Listview显示两次所有行
EN

Stack Overflow用户
提问于 2013-11-28 11:07:21
回答 6查看 964关注 0票数 1

我对listview有问题。我有一个名为SecondActivity.java的主要活动,其中只有按钮,比如kierunkiButton。单击此按钮创建新活动后,KierunkiActivity.java如下所示:

代码语言:javascript
运行
复制
 kierunkiButton.setOnClickListener(new OnClickListener() {
            public void onClick(View arg0) {
                Intent intent = new Intent();
             intent.setClass(SecondActivity.this, KierunkiActivity.class);
             startActivity(intent);

                            }
       });

新的活动KierunkiActivity是一个ListActivity,如下所示:

代码语言:javascript
运行
复制
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按钮时,都会向listview (在我的KierunkiActivity中)添加行。

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

,你知道怎么做吗?,谢谢!

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2013-11-28 11:11:28

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

代码语言:javascript
运行
复制
private void openAndQueryDatabase() {
   results = new ArrayList<String>();
}
票数 3
EN

Stack Overflow用户

发布于 2013-11-28 11:15:23

每次单击按钮时都必须刷新ArrayList。否则,它将加载带有现有项的新项。

代码语言:javascript
运行
复制
results.clear();
if (c != null) {
            if (c.moveToFirst()) {
                do {
                    String kier = c.getString(c.getColumnIndex("Kierunek"));
                    results.add(kier);
                } while (c.moveToNext());
            }
        }

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

或者实例化openAndQueryDatabase()方法中的列表,如

代码语言:javascript
运行
复制
private void openAndQueryDatabase() {
    results = new ArrayList<String>();
    // Rest of your code
}

试试这个,我希望这个能帮到你。谢谢。

票数 1
EN

Stack Overflow用户

发布于 2013-11-28 11:18:26

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

代码语言:javascript
运行
复制
static ArrayList<String> results = new ArrayList<String>();

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20264447

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档