当前位置: 编程技术>移动开发
本页文章导读:
▪Iterator 循环 List remove元素报错的解决方法 Iterator 循环 List remove元素报错的解决办法
List<Integer> list = new ArrayList<Integer>();
list.add(1);
list.add(2);
list.add(3);
list.add(4);
list.add(5);
list.add(6);
for (Iterator<Integer> iter = list.i.........
▪ 哪位大神帮小弟我看看ListView下的数据不能实时更新 哪位大神帮我看看ListView上的数据不能实时更新package org.lhm.laofengxiang;
import java.util.*;
import cn.yljd.service.MyXMLParser;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import andr.........
▪ Core Data浅谈系列之一 : 基础构造 Core Data浅谈系列之一 : 基础结构Core Data是苹果官方提供的一套框架,用来解决与对象生命周期管理、对象关系图管理和持久化等方面相关的问题。大多数情况下,我们引入Core
Data作为持久.........
[1]Iterator 循环 List remove元素报错的解决方法
来源: 互联网 发布时间: 2014-02-18
Iterator 循环 List remove元素报错的解决办法
2.每移除一个元素以后再把i移回来
3.使用iterator.remove()方法删除
List<Integer> list = new ArrayList<Integer>(); list.add(1); list.add(2); list.add(3); list.add(4); list.add(5); list.add(6); for (Iterator<Integer> iter = list.iterator(); iter.hasNext();) { int i = iter.next(); if (i == 3) { list.remove(i); } }
运行上边的代码就会报错:
原因:
Iterator 是工作在一个独立的线程中,并且拥有一个 mutex 锁。 Iterator 被创建之后会建立一个指向原来对象的单链索引表,当原来的对象数量发生变化时,这个索引表的内容不会同步改变,所以当索引指针往后移动的时候就找不到要迭代的对象,所以按照 fail-fast 原则 Iterator 会马上抛出 java.util.ConcurrentModificationException 异常。
所以 Iterator 在工作的时候是不允许被迭代的对象被改变的。但你可以使用 Iterator 本身的方法 remove() 来删除对象, Iterator.remove() 方法会在删除当前迭代对象的同时维护索引的一致性。
网上找的解决方法:
1.倒过来遍历listfor (int i = list.size()-1; i >=0; i--) { int item = list.get(i); if (item == 3) { list.remove(item); } }
2.每移除一个元素以后再把i移回来
for (int i = 0; i < list.size(); i++) { int item = list.get(i); if (item == 3) { list.remove(item); i=i-1; } }
3.使用iterator.remove()方法删除
for (Iterator<Integer> iter = list.iterator(); iter.hasNext();) { int item = iter.next(); if (item == 3) { list.remove(item); } }
[2] 哪位大神帮小弟我看看ListView下的数据不能实时更新
来源: 互联网 发布时间: 2014-02-18
哪位大神帮我看看ListView上的数据不能实时更新
package org.lhm.laofengxiang;
import java.util.*;
import cn.yljd.service.MyXMLParser;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.Context;
import android.content.DialogInterface;
import android.os.Bundle;
import android.text.Html;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.View.OnClickListener;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.*;
public class Jjtz extends Activity {
MyXMLParser parser=new MyXMLParser();
static int size = 14;
private ListView list;
private MyAdapter myAda;
ArrayList<HashMap<String,Object>> arrayList=new ArrayList<HashMap<String,Object>>();
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.jjtzsummary);
list=(ListView)findViewById(R.id.jjtzlist);
list.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView<?> arg0, View arg1,
int arg2, long arg3) {
myAda.Login(arg2);
}
});
List<String[]> list1=parser.xml2list("http://203.86.16.92:8000/ProduceManager.asmx/selectJjtz", "diffgr:diffgram/NewDataSet/Table", "dm,mc,lsj,dhj");
for(String[] str:list1){
HashMap<String, Object> map = new HashMap<String, Object>();
map.put("dm", str[0]);
map.put("mc", str[1]);
map.put("lsj", str[2].substring(0, str[2].length()-2));
map.put("dhj", str[3].substring(0, str[3].length()-2));
arrayList.add(map);
myAda = new MyAdapter(this, arrayList, size);
list.setAdapter(myAda);
myAda.notifyDataSetChanged();
}
ZoomControls zoomControls = (ZoomControls) findViewById(R.id.zoomcontrols);
zoomControls.setOnZoomInClickListener(new OnClickListener() {
public void onClick(View v) {
size = size + 2;
myAda = new MyAdapter(Jjtz.this, arrayList, size);
list.setAdapter(myAda);
myAda.notifyDataSetChanged();
}
});
zoomControls.setOnZoomOutClickListener(new OnClickListener() {
public void onClick(View v) {
size = size - 2;
myAda = new MyAdapter(Jjtz.this, arrayList, size);
list.setAdapter(myAda);
myAda.notifyDataSetChanged();
}
});
}
private class MyAdapter extends BaseAdapter {
ArrayList<HashMap<String, Object>> data;
Context context;
int size;
public MyAdapter(Context context,
ArrayList<HashMap<String, Object>> data, int size) {
this.context = context;
this.data = data;
this.size = size;
}
public int getCount() {
return data.size();
}
public Object getItem(int position) {
return data.get(position);
}
public long getItemId(int position) {
return position;
}
public View getView(int position, View convertView, ViewGroup parent) {
LayoutInflater inflater = LayoutInflater.from(context);
convertView = inflater.inflate(R.layout.jjtzsummaryresult, null);
TextView dm = (TextView) convertView.findViewById(R.id.dm);
TextView mc = (TextView) convertView.findViewById(R.id.mc);
TextView lsj = (TextView) convertView.findViewById(R.id.lsj);
TextView dhj = (TextView) convertView.findViewById(R.id.dhj);
dm.setTextSize(size);
mc.setTextSize(size);
lsj.setTextSize(size);
dhj.setTextSize(size);
dm.setText(data.get(position).get("dm").toString());
mc.setText(data.get(position).get("mc").toString());
lsj.setText(data.get(position).get("lsj").toString());
dhj.setText(data.get(position).get("dhj").toString());
return convertView;
}
public void Login(final int arg2) {
LayoutInflater factory=LayoutInflater.from(Jjtz.this);
final View v1=factory.inflate(R.layout.jjtzdialog,null);
AlertDialog.Builder dialog=new AlertDialog.Builder(Jjtz.this);
dialog.setTitle("修改金价");
dialog.setView(v1);
dialog.setPositiveButton("确定修改", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
//修改金价
try{
EditText lsj=(EditText) v1.findViewById(R.id.lsj);
EditText dhj=(EditText) v1.findViewById(R.id.dhj);
String lsjStr = lsj.getText().toString().trim();
String dhjStr = dhj.getText().toString().trim();
String dm=data.get(arg2).get("dm").toString();
List<String[]> list=parser.xml2list("http://203.86.16.92:8000/ProduceManager.asmx/updateJjtz?lsj="+lsjStr+"&dhj="+dhjStr+"&dm="+dm+"", "diffgr:diffgram", "");
}catch(Exception e){
e.printStackTrace();
}
}
});
dialog.setNegativeButton("取消修改",new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
}
});
dialog.show();
}
}
}
package org.lhm.laofengxiang;
import java.util.*;
import cn.yljd.service.MyXMLParser;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.Context;
import android.content.DialogInterface;
import android.os.Bundle;
import android.text.Html;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.View.OnClickListener;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.*;
public class Jjtz extends Activity {
MyXMLParser parser=new MyXMLParser();
static int size = 14;
private ListView list;
private MyAdapter myAda;
ArrayList<HashMap<String,Object>> arrayList=new ArrayList<HashMap<String,Object>>();
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.jjtzsummary);
list=(ListView)findViewById(R.id.jjtzlist);
list.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView<?> arg0, View arg1,
int arg2, long arg3) {
myAda.Login(arg2);
}
});
List<String[]> list1=parser.xml2list("http://203.86.16.92:8000/ProduceManager.asmx/selectJjtz", "diffgr:diffgram/NewDataSet/Table", "dm,mc,lsj,dhj");
for(String[] str:list1){
HashMap<String, Object> map = new HashMap<String, Object>();
map.put("dm", str[0]);
map.put("mc", str[1]);
map.put("lsj", str[2].substring(0, str[2].length()-2));
map.put("dhj", str[3].substring(0, str[3].length()-2));
arrayList.add(map);
myAda = new MyAdapter(this, arrayList, size);
list.setAdapter(myAda);
myAda.notifyDataSetChanged();
}
ZoomControls zoomControls = (ZoomControls) findViewById(R.id.zoomcontrols);
zoomControls.setOnZoomInClickListener(new OnClickListener() {
public void onClick(View v) {
size = size + 2;
myAda = new MyAdapter(Jjtz.this, arrayList, size);
list.setAdapter(myAda);
myAda.notifyDataSetChanged();
}
});
zoomControls.setOnZoomOutClickListener(new OnClickListener() {
public void onClick(View v) {
size = size - 2;
myAda = new MyAdapter(Jjtz.this, arrayList, size);
list.setAdapter(myAda);
myAda.notifyDataSetChanged();
}
});
}
private class MyAdapter extends BaseAdapter {
ArrayList<HashMap<String, Object>> data;
Context context;
int size;
public MyAdapter(Context context,
ArrayList<HashMap<String, Object>> data, int size) {
this.context = context;
this.data = data;
this.size = size;
}
public int getCount() {
return data.size();
}
public Object getItem(int position) {
return data.get(position);
}
public long getItemId(int position) {
return position;
}
public View getView(int position, View convertView, ViewGroup parent) {
LayoutInflater inflater = LayoutInflater.from(context);
convertView = inflater.inflate(R.layout.jjtzsummaryresult, null);
TextView dm = (TextView) convertView.findViewById(R.id.dm);
TextView mc = (TextView) convertView.findViewById(R.id.mc);
TextView lsj = (TextView) convertView.findViewById(R.id.lsj);
TextView dhj = (TextView) convertView.findViewById(R.id.dhj);
dm.setTextSize(size);
mc.setTextSize(size);
lsj.setTextSize(size);
dhj.setTextSize(size);
dm.setText(data.get(position).get("dm").toString());
mc.setText(data.get(position).get("mc").toString());
lsj.setText(data.get(position).get("lsj").toString());
dhj.setText(data.get(position).get("dhj").toString());
return convertView;
}
public void Login(final int arg2) {
LayoutInflater factory=LayoutInflater.from(Jjtz.this);
final View v1=factory.inflate(R.layout.jjtzdialog,null);
AlertDialog.Builder dialog=new AlertDialog.Builder(Jjtz.this);
dialog.setTitle("修改金价");
dialog.setView(v1);
dialog.setPositiveButton("确定修改", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
//修改金价
try{
EditText lsj=(EditText) v1.findViewById(R.id.lsj);
EditText dhj=(EditText) v1.findViewById(R.id.dhj);
String lsjStr = lsj.getText().toString().trim();
String dhjStr = dhj.getText().toString().trim();
String dm=data.get(arg2).get("dm").toString();
List<String[]> list=parser.xml2list("http://203.86.16.92:8000/ProduceManager.asmx/updateJjtz?lsj="+lsjStr+"&dhj="+dhjStr+"&dm="+dm+"", "diffgr:diffgram", "");
}catch(Exception e){
e.printStackTrace();
}
}
});
dialog.setNegativeButton("取消修改",new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
}
});
dialog.show();
}
}
}
[3] Core Data浅谈系列之一 : 基础构造
来源: 互联网 发布时间: 2014-02-18
Core Data浅谈系列之一 : 基础结构
Core Data是苹果官方提供的一套框架,用来解决与对象生命周期管理、对象关系图管理和持久化等方面相关的问题。大多数情况下,我们引入Core Data作为持久化数据的,并利用它将持久化数据映射为内存对象。
Jason Lee @ Hangzhou
Core Data是苹果官方提供的一套框架,用来解决与对象生命周期管理、对象关系图管理和持久化等方面相关的问题。大多数情况下,我们引入Core Data作为持久化数据的,并利用它将持久化数据映射为内存对象。
为什么要使用Core Data呢?以下几点可供参考:
- 有丰富且良好的文档,方便新手入门、老手埋坑。这些文档多半来源于Apple官方,以及Stackoverflow。
- 有着经过很多开发者检验的代码,除了省去我们编码的精力,还有着比我们自己编码更好的代码质量。
- 苹果出品使得它与OS X或iOS开发工具链密切结合,我们可以在Xcode上进行表的设计,或者在Instruments上进行性能检测,并且在编码过程中能够很自然地维持着Cocoa开发风格。
- 本身所具有的特性,比如支持多类型外部存储、撤销/重做、KVC、复杂查询和对象映射、自动验证、并发/合并策略、数据迁移、内存策略。除此之外,还与UI展现良好结合。
需要说明的是,Core Data并不是一款关系数据库,它拥有但不限于关系数据库的功能,比如它还具有模型设计器、数据访问层的功能。
针对上面提到的Core Data所具有的功能,来了解一下它的基本结构。
当我们使用Core Data作为持久化时,自上而下可以分为如下几层(称为Core Data Stack):
Managed Object Context
|
Persistent Store Coordinator —— Managed Object Model
|
Persistent Object Store
在将用户数据存储到外部文件前,我们需要考虑以什么样的格式进行存储,所以需要先进行数据表的设计 —— 设计好的数据模型会以Managed Object Model的形式存在于内存中。采用面向对象的思想进行表的设计时,每一张表描述着一种实体(NSEntityDescription),一份NSManagedObjectModel则包含着多种NSEntityDescription。
比如,我们可以创建一份新的工程,叫cdNBA,用来记录NBA球员信息。在实际工作之前,我们需要先设计数据模型。新建一份Data Model,如下图:
将这份Data Model命名为cdNBA,与工程同名,这份数据模型在后面会以NSManagedObjectModel实例的形式存在于内存中。然后再新建Player和Team两种实体,如下图:
从上图可以看出,一份NSManagedObjectModel,如cdNBA.xcdatamodel,可以包含多份NSEntityDescription,如Player、Team,而每一份NSEntityDescription有三种属性,分别是Attributes、Relationships和Fetched Properties。
完成了逻辑上的设计之后,我们可以根据NSEntityDescription在内存中创建对象,或者将相应的内存数据存储到外部文件中(严格地讲,这里不一定是外部存储文件)。
根据NSEntityDescription创建出来的对象比较特殊,我们称之为NSManagedObject。由于它的特殊性,当我们要创建一个NSManagedObject对象时,比如Player实例,我们需要为其提供一个生存环境,称之为NSManagedObjectContext。采用龙书的译法,我将其称为NSManagedObject的上下文。我个人觉得这种说法挺合适的,因为NSManagedObjectContext记录着存在于其中的NSManagedObject的生命周期、变化状态等。
一份NSManagedObjectContext实例作为NSManagedObject在内存中的缓存地带,我们可以从外部存储文件中读取或者临时创建一批NSManagedObject对象到其中,然后在context中做CURD操作。不论是从本地读取数据,或者是将数据存储到本地文件中,都需要经过context的把关。
当我们要将内存中的数据根据NSManagedObjectModel进行持久化时,我们需要一个新的角色来做中间层:NSPersistentStoreCoordinator类。它位于context和存储文件之间,与NSManagedObjectModel结合,来为context服务,负责将context中的对象信息存储下来,或者将存储文件中的数据读取到context中。
最后就是存储文件NSPersistentStore了,可以是SQLite、二进制或者XML文件格式等。
Brief Talk About Core Data Series, Part 1 : Basic Structure
Blog : http://blog.csdn.net/jasonblog
Weibo : http://weibo.com/jasonmblog
最新技术文章: