Android 选择选项卡后刷新片段
构建片段时,我根据本地数据库中的信息构建视图。其他选项卡可以修改此信息,当用户选择该选项卡时,我希望新信息得到反映Android 选择选项卡后刷新片段,android,android-fragments,Android,Android Fragments,构建片段时,我根据本地数据库中的信息构建视图。其他选项卡可以修改此信息,当用户选择该选项卡时,我希望新信息得到反映 public class RunningTotal extends SherlockFragment { public static final String TAG = "Running Total"; private LinearLayout lv; public View onCreateView(LayoutInflater li, ViewGro
public class RunningTotal extends SherlockFragment {
public static final String TAG = "Running Total";
private LinearLayout lv;
public View onCreateView(LayoutInflater li, ViewGroup vg,
Bundle savedInstanceState) {
SalesDataSource sds = BarcodeSaleTracker.SDS;
ArrayList<Item> items = sds.getAllItems();
String[] totals = sds.getPersonValues();
int totalsPosition = 0;
Log.v(TAG, "Items Length: " + items.size());
lv = new LinearLayout(this.getActivity());
String lastPerson = "";
if (items.size() > 0) {
for (Item i : items) {
if (lastPerson.equalsIgnoreCase(i.getPerson()) == false) {
lastPerson = i.getPerson();
TextView tv = (TextView) li.inflate(R.layout.list_title,
lv, false);
tv.setText(totals[totalsPosition]);
totalsPosition++;
lv.addView(tv);
}
TextView listItem = (TextView) li.inflate(R.layout.list_item,
lv, false);
listItem.setText(i.toString());
lv.addView(listItem);
}
} else {
TextView noItems = (TextView) li.inflate(R.layout.list_title, lv,
false);
noItems.setText(R.string.no_items);
lv.addView(noItems);
}
return lv;
}
}
我只是不知道如何与RunningTotal沟通,它需要自我更新
编辑添加了我从数据库请求的所有数据的来源
public class SalesDataSource {
private SQLiteDatabase database;
private DatabaseHelper dbHelper;
private String[] allColumns = { DatabaseHelper.COLUMN_ID,
DatabaseHelper.COLUMN_PERSON, DatabaseHelper.COLUMN_COST,
DatabaseHelper.COLUMN_ITEM };
public SalesDataSource(Context context) {
dbHelper = new DatabaseHelper(context);
}
public void open() throws SQLException {
database = dbHelper.getWritableDatabase();
}
public void close() {
dbHelper.close();
}
/**
* Creates an entry in the Database. Both a person and a cost are required.
* Item is not required. If one is not needed, simply pass null.
*
* @param person
* Who this sale belongs to.
* @param cost
* The amount (in pennies) that the sale was.
* @param item
* An optional description of the sold item
* @return The newly created Item.
*/
public Item addItem(String person, int cost, String item) {
ContentValues values = new ContentValues();
values.put(DatabaseHelper.COLUMN_PERSON, person);
values.put(DatabaseHelper.COLUMN_COST, cost);
values.put(DatabaseHelper.COLUMN_ITEM, item);
long insertId = database.insert(DatabaseHelper.TABLE_SALES, null,
values);
Cursor cursor = database.query(DatabaseHelper.TABLE_SALES, allColumns,
DatabaseHelper.COLUMN_ID + " = " + insertId, null, null, null,
null);
cursor.moveToFirst();
Item rv = cursorToItem(cursor);
cursor.close();
return rv;
}
public void addItems(List<Item> items) {
for (Item i : items) {
ContentValues values = new ContentValues();
values.put(DatabaseHelper.COLUMN_PERSON, i.getPerson());
values.put(DatabaseHelper.COLUMN_COST, i.getAmount());
values.put(DatabaseHelper.COLUMN_ITEM, i.getItem());
database.insert(DatabaseHelper.TABLE_SALES, null, values);
}
}
public ArrayList<Item> getAllItems() {
ArrayList<Item> items = new ArrayList<Item>();
Cursor cursor = database.query(DatabaseHelper.TABLE_SALES, allColumns,
null, null, null, null, DatabaseHelper.COLUMN_PERSON);
cursor.moveToFirst();
while (!cursor.isAfterLast()) {
Item item = cursorToItem(cursor);
items.add(item);
cursor.moveToNext();
}
cursor.close();
return items;
}
public String[] getPersonValues() {
Cursor cursor = database.query(DatabaseHelper.TABLE_SALES,
new String[] { "SUM(" + DatabaseHelper.COLUMN_COST + ") AS " + DatabaseHelper.PERSON_SUM,
DatabaseHelper.COLUMN_PERSON }, null, null,
DatabaseHelper.COLUMN_PERSON, null, null);
String[] rv = new String[cursor.getCount()];
cursor.moveToFirst();
int pos = 0;
while (!cursor.isAfterLast()) {
String person = cursor.getString(1);
String money = Item.format(cursor.getInt(0));
rv[pos++] = person + ": " + money;
cursor.moveToNext();
}
cursor.close();
return rv;
}
public Item getMaxSale() {
Cursor cursor = database.query(DatabaseHelper.TABLE_SALES,
new String[] { "MAX(" + DatabaseHelper.COLUMN_COST + ") AS " + DatabaseHelper.MAX_SALE,
DatabaseHelper.COLUMN_PERSON }, null, null, null, null,
null);
cursor.moveToFirst();
Item rv = cursorToItem(cursor);
cursor.close();
return rv;
}
public Item getMinSale() {
Cursor cursor = database.query(DatabaseHelper.TABLE_SALES,
new String[] { "MIN(" + DatabaseHelper.COLUMN_COST + ") AS " + DatabaseHelper.MIN_SALE,
DatabaseHelper.COLUMN_PERSON }, null, null, null, null,
null);
cursor.moveToFirst();
Item rv = cursorToItem(cursor);
cursor.close();
return rv;
}
private Item cursorToItem(Cursor cursor) {
Item item = new Item();
item.setId(cursor.getLong(0));
item.setPerson(cursor.getString(1));
item.setAmount(cursor.getInt(2));
item.setItem(cursor.getString(3));
return item;
}
}
公共类SalesDataSource{
专用数据库;
私有数据库助手dbHelper;
私有字符串[]allColumns={DatabaseHelper.COLUMN\u ID,
DatabaseHelper.COLUMN\u人员,DatabaseHelper.COLUMN\u成本,
DatabaseHelper.COLUMN_ITEM};
公共SalesDataSource(上下文){
dbHelper=新数据库助手(上下文);
}
public void open()引发SQLException{
database=dbHelper.getWritableDatabase();
}
公众假期结束(){
dbHelper.close();
}
/**
*在数据库中创建条目。需要人员和成本。
*不需要项。如果不需要项,只需传递null即可。
*
*@param-person
*这是谁的买卖。
*@param成本
*出售的金额(以便士计)。
*@param项目
*已售出商品的可选描述
*@返回新创建的项目。
*/
公共项目附加项(字符串个人、整数成本、字符串项目){
ContentValues=新的ContentValues();
value.put(DatabaseHelper.COLUMN\u PERSON,PERSON);
value.put(DatabaseHelper.COLUMN_COST,COST);
value.put(DatabaseHelper.COLUMN_ITEM,ITEM);
long insertId=database.insert(DatabaseHelper.TABLE_,null,
价值观);
Cursor Cursor=database.query(DatabaseHelper.TABLE_SALES,allColumns,
DatabaseHelper.COLUMN_ID+“=”+插入ID,null,null,null,
无效);
cursor.moveToFirst();
项目rv=光标项目(光标);
cursor.close();
返回rv;
}
公共无效附加项(列表项){
用于(项目i:项目){
ContentValues=新的ContentValues();
value.put(DatabaseHelper.COLUMN_PERSON,i.getPerson());
value.put(DatabaseHelper.COLUMN_COST,i.getAmount());
value.put(DatabaseHelper.COLUMN_ITEM,i.getItem());
insert(DatabaseHelper.TABLE_SALES,null,value);
}
}
公共数组列表getAllItems(){
ArrayList items=新建ArrayList();
Cursor Cursor=database.query(DatabaseHelper.TABLE_SALES,allColumns,
null,null,null,null,DatabaseHelper.COLUMN\u PERSON);
cursor.moveToFirst();
而(!cursor.isAfterLast()){
项目=游标项目(游标);
项目。添加(项目);
cursor.moveToNext();
}
cursor.close();
退货项目;
}
公共字符串[]getPersonValues(){
游标=database.query(DatabaseHelper.TABLE_SALES,
新字符串[]{“SUM(“+DatabaseHelper.COLUMN_COST+”)为“+DatabaseHelper.PERSON_SUM,
DatabaseHelper.COLUMN_PERSON},null,null,
DatabaseHelper.COLUMN_PERSON,null,null);
String[]rv=新字符串[cursor.getCount()];
cursor.moveToFirst();
int pos=0;
而(!cursor.isAfterLast()){
字符串person=cursor.getString(1);
字符串money=Item.format(cursor.getInt(0));
rv[pos++]=人+“:”+钱;
cursor.moveToNext();
}
cursor.close();
返回rv;
}
公共项目getMaxSale(){
游标=database.query(DatabaseHelper.TABLE_SALES,
新字符串[]{“MAX(“+DatabaseHelper.COLUMN_COST+”)为“+DatabaseHelper.MAX_SALE,
DatabaseHelper.COLUMN_PERSON},null,null,null,null,
无效);
cursor.moveToFirst();
项目rv=光标项目(光标);
cursor.close();
返回rv;
}
公共项目getMinSale(){
游标=database.query(DatabaseHelper.TABLE_SALES,
新字符串[]{“MIN(“+DatabaseHelper.COLUMN_COST+”)为“+DatabaseHelper.MIN_SALE,
DatabaseHelper.COLUMN_PERSON},null,null,null,null,
无效);
cursor.moveToFirst();
项目rv=光标项目(光标);
cursor.close();
返回rv;
}
专用项游标项目(游标){
项目=新项目();
item.setId(cursor.getLong(0));
item.setPerson(cursor.getString(1));
item.setAmount(cursor.getInt(2));
item.setItem(cursor.getString(3));
退货项目;
}
}
为什么不使用listfragment和loadermanager来管理游标对象,以便在基础数据更改时自动更新列表?问题在于它不仅仅是一个简单的Curosr对象。我正在使用多个游标对象,并转换一些数据。我已经用我的SalesDataSource更新了我的原始帖子。然后你可以使用ContentObserver
public class SalesDataSource {
private SQLiteDatabase database;
private DatabaseHelper dbHelper;
private String[] allColumns = { DatabaseHelper.COLUMN_ID,
DatabaseHelper.COLUMN_PERSON, DatabaseHelper.COLUMN_COST,
DatabaseHelper.COLUMN_ITEM };
public SalesDataSource(Context context) {
dbHelper = new DatabaseHelper(context);
}
public void open() throws SQLException {
database = dbHelper.getWritableDatabase();
}
public void close() {
dbHelper.close();
}
/**
* Creates an entry in the Database. Both a person and a cost are required.
* Item is not required. If one is not needed, simply pass null.
*
* @param person
* Who this sale belongs to.
* @param cost
* The amount (in pennies) that the sale was.
* @param item
* An optional description of the sold item
* @return The newly created Item.
*/
public Item addItem(String person, int cost, String item) {
ContentValues values = new ContentValues();
values.put(DatabaseHelper.COLUMN_PERSON, person);
values.put(DatabaseHelper.COLUMN_COST, cost);
values.put(DatabaseHelper.COLUMN_ITEM, item);
long insertId = database.insert(DatabaseHelper.TABLE_SALES, null,
values);
Cursor cursor = database.query(DatabaseHelper.TABLE_SALES, allColumns,
DatabaseHelper.COLUMN_ID + " = " + insertId, null, null, null,
null);
cursor.moveToFirst();
Item rv = cursorToItem(cursor);
cursor.close();
return rv;
}
public void addItems(List<Item> items) {
for (Item i : items) {
ContentValues values = new ContentValues();
values.put(DatabaseHelper.COLUMN_PERSON, i.getPerson());
values.put(DatabaseHelper.COLUMN_COST, i.getAmount());
values.put(DatabaseHelper.COLUMN_ITEM, i.getItem());
database.insert(DatabaseHelper.TABLE_SALES, null, values);
}
}
public ArrayList<Item> getAllItems() {
ArrayList<Item> items = new ArrayList<Item>();
Cursor cursor = database.query(DatabaseHelper.TABLE_SALES, allColumns,
null, null, null, null, DatabaseHelper.COLUMN_PERSON);
cursor.moveToFirst();
while (!cursor.isAfterLast()) {
Item item = cursorToItem(cursor);
items.add(item);
cursor.moveToNext();
}
cursor.close();
return items;
}
public String[] getPersonValues() {
Cursor cursor = database.query(DatabaseHelper.TABLE_SALES,
new String[] { "SUM(" + DatabaseHelper.COLUMN_COST + ") AS " + DatabaseHelper.PERSON_SUM,
DatabaseHelper.COLUMN_PERSON }, null, null,
DatabaseHelper.COLUMN_PERSON, null, null);
String[] rv = new String[cursor.getCount()];
cursor.moveToFirst();
int pos = 0;
while (!cursor.isAfterLast()) {
String person = cursor.getString(1);
String money = Item.format(cursor.getInt(0));
rv[pos++] = person + ": " + money;
cursor.moveToNext();
}
cursor.close();
return rv;
}
public Item getMaxSale() {
Cursor cursor = database.query(DatabaseHelper.TABLE_SALES,
new String[] { "MAX(" + DatabaseHelper.COLUMN_COST + ") AS " + DatabaseHelper.MAX_SALE,
DatabaseHelper.COLUMN_PERSON }, null, null, null, null,
null);
cursor.moveToFirst();
Item rv = cursorToItem(cursor);
cursor.close();
return rv;
}
public Item getMinSale() {
Cursor cursor = database.query(DatabaseHelper.TABLE_SALES,
new String[] { "MIN(" + DatabaseHelper.COLUMN_COST + ") AS " + DatabaseHelper.MIN_SALE,
DatabaseHelper.COLUMN_PERSON }, null, null, null, null,
null);
cursor.moveToFirst();
Item rv = cursorToItem(cursor);
cursor.close();
return rv;
}
private Item cursorToItem(Cursor cursor) {
Item item = new Item();
item.setId(cursor.getLong(0));
item.setPerson(cursor.getString(1));
item.setAmount(cursor.getInt(2));
item.setItem(cursor.getString(3));
return item;
}
}