【问题标题】:ListView is getting populated with same values for entire size of ListListView 正在填充 List 的整个大小的相同值
【发布时间】:2015-09-12 17:05:40
【问题描述】:
/*
this is the class which is called when a button is pressed in main activity. onResume is called along with onCreate first, and the list is getting populated with the last row input from the database multiple times.

目的是用数据库表中的数据填充列表视图。 什么时候调用 onResume? */

import java.util.ArrayList;
import java.util.List;

import android.app.Activity;
import android.content.Intent;
import android.database.Cursor;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.widget.ListView;
import android.widget.Toast;

public class Expenses extends Activity {
    ListView l;Databasehelper mydb;List<ListViewItem> items;
    MyAdapter adapter;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_expenses);
        l= (ListView)findViewById(R.id.lv1);
        mydb=new Databasehelper(this);
         items= new ArrayList<Expenses.ListViewItem>();


        //adapter= new MyAdapter(this, items);
        //l.setAdapter(adapter);
    }

    @Override
    protected void onResume() {
        // TODO Auto-generated method stub
        super.onResume();
        items.clear();
        ListViewItem a= new ListViewItem();
        Cursor cur=mydb.getData();
        if(cur.getCount()==0)
            Toast.makeText(this, "No expenses to display", Toast.LENGTH_LONG).show();

        cur.moveToFirst();
        do
        {
            a.category=cur.getString(0);
            a.status=cur.getString(1);
            a.amount=cur.getString(2);
            items.add(a);
        }while(cur.moveToNext());
        adapter= new MyAdapter(this, items);
        l.setAdapter(adapter);
        for(int i=0; i<items.size(); i++)
        {
            System.out.print(items.get(i).category+" "+items.get(i).status+" "+items.get(i).amount);
            System.out.println();
        }

    }
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.expenses, menu);
        return true;
    }

    public class ListViewItem{
        public String category, amount, status;
    }

    public void onAdd(View v){
        Intent in= new Intent(this, Input.class);
        startActivityForResult(in, 10);
    }

}

//请帮助填充表。我怀疑恢复方法有问题。当我//使用打印命令打印时,列表包含相同//行的多个副本。但是数据库中的表包含正确的元组.

【问题讨论】:

标签: android listview


【解决方案1】:

问题是你的 do while 循环。当您遍历游标时,您使用的是相同的 ListViewItem 对象来设置值。您应该在光标的每次迭代上创建一个新的 ListViewItem 对象。像这样的:

    do {
        ListViewItem a = new ListViewItem()
        a.category=cur.getString(0);
        a.status=cur.getString(1);
        a.amount=cur.getString(2);
        items.add(a);
    } while(cur.moveToNext());

【讨论】:

  • 非常感谢。那解决了它。但是,我不明白之前发生了什么。 'a' 不是在每次迭代中都被覆盖并添加到列表中吗?
  • 不,您在每次迭代时都将相同的对象添加到列表中。所以列表视图中的所有项目都引用了一个对象,因此显示的是相同的数据。
猜你喜欢
  • 2021-07-07
  • 2015-12-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-20
  • 1970-01-01
  • 2021-02-05
相关资源
最近更新 更多