Android 从xml更新listview时出现问题
我有一个由lazyadapter(BaseApter)从xml文件构建的listview 例如:urlxml-->解析器-->baseadapter-->listview 当我在服务器上修改xml文件时,我希望刷新listview并查看其中的行的变化。顺便说一下,我使用lib“pull to refresh” 当我拉着车去刷新时,我把新的一排排排成了旧的一排 我是否必须先删除listview内容并重复此操作: urlxml-->解析器-->baseadapter-->listview 怎么了 编辑一些代码 我的适配器Android 从xml更新listview时出现问题,android,listview,adapter,Android,Listview,Adapter,我有一个由lazyadapter(BaseApter)从xml文件构建的listview 例如:urlxml-->解析器-->baseadapter-->listview 当我在服务器上修改xml文件时,我希望刷新listview并查看其中的行的变化。顺便说一下,我使用lib“pull to refresh” 当我拉着车去刷新时,我把新的一排排排成了旧的一排 我是否必须先删除listview内容并重复此操作: urlxml-->解析器-->baseadapter-->listview 怎么了 编
public class LazyAdapter extends BaseAdapter {
private Activity activity;
ArrayList<ArrayList<String>> data = new ArrayList<ArrayList<String>> ();
private static LayoutInflater inflater=null;
public ImageLoader imageLoader;
public LazyAdapter(Activity a, ArrayList<ArrayList<String>> d) {
activity = a;
data=d;
inflater = (LayoutInflater)activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
imageLoader=new ImageLoader(activity.getApplicationContext());
}
public int getCount() {
return data.get(0).size();
}
public Object getItem(int position) {
return position;
}
public long getItemId(int position) {
return position;
}
public View getView(int position, View convertView, ViewGroup parent) {
View vi=convertView;
if(convertView==null)
vi = inflater.inflate(R.layout.elenco_articoli_items, null);
String Tt = data.get(0).get(position);
String URl = data.get(1).get(position);
TextView text=(TextView)vi.findViewById(R.id.title);;
ImageView image=(ImageView)vi.findViewById(R.id.image);
text.setText(Html.fromHtml(Tt));
imageLoader.DisplayImage(URl, image,1);
return vi;
}
}
公共类LazyAdapter扩展了BaseAdapter{
私人活动;
ArrayList数据=新的ArrayList();
专用静态充气机=空;
公共图像加载器;
公共LazyAdapter(活动a,ArrayList d){
活动=a;
数据=d;
充气器=(LayoutInflater)activity.getSystemService(Context.LAYOUT\u充气器\u SERVICE);
imageLoader=新的imageLoader(activity.getApplicationContext());
}
public int getCount(){
返回data.get(0.size();
}
公共对象getItem(int位置){
返回位置;
}
公共长getItemId(int位置){
返回位置;
}
公共视图getView(int位置、视图转换视图、视图组父视图){
视图vi=转换视图;
if(convertView==null)
vi=充气机充气(R.layout.elenco\u articoli\u项目,空);
字符串Tt=data.get(0).get(位置);
字符串URl=data.get(1.get(位置);
TextView text=(TextView)vi.findViewById(R.id.title);;
ImageView图像=(ImageView)vi.findViewById(R.id.image);
text.setText(Html.fromHtml(Tt));
显示图像(URl,图像,1);
返回vi;
}
}
我的主要活动
public class Lista_articoli_categoria extends Activity {
ArrayList<String> images = new ArrayList<String> ();
ArrayList<String> title = new ArrayList<String> ();
ArrayList<String> author = new ArrayList<String> ();
ArrayList<String> description = new ArrayList<String> ();
private LazyAdapter adapter;
private RefreshableListView mListView;
Parser task = new Parser();
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.elenco_articoli);
try {
task.execute();
final RefreshableListView list = (RefreshableListView) findViewById(R.id.refreshablelistview);
adapter= new LazyAdapter(this, fill_data(task.get()));
mListView = list;
list.setAdapter(adapter);
list.setOnUpdateTask(new OnUpdateTask() {
public void updateBackground() {
refresh_data();
try {
Thread.sleep(1500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public void updateUI() {
adapter.notifyDataSetChanged();
}
public void onUpdateStart() {
}
});
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
mListView.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
/*
TODO
*/
}
});
}
@Override
public void onDestroy()
{
mListView.setAdapter(null);
super.onDestroy();
}
public ArrayList<ArrayList<String>> fill_data(ArrayList<Struttura_rss> Datidaxml){
ArrayList<ArrayList<String>> rec = new ArrayList<ArrayList<String>> ();
for(int i=0;i<Datidaxml.size();i++){
Struttura_rss p = Datidaxml.get(i);
title.add(p.getTitle());
images.add(p.getImage());
description.add(p.getArticolo());
author.add(p.getAuthor());
}
rec.add (title);
rec.add (images);
rec.add (description);
rec.add (author);
return rec;
}
public void refresh_data(){
try {
Parser task = new Parser();
task.execute();
adapter= new LazyAdapter(this, fill_data(task.get()));
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
}
}
public class Lista\u articoli\u categoria扩展活动{
ArrayList images=新的ArrayList();
ArrayList title=新的ArrayList();
ArrayList author=新的ArrayList();
ArrayList description=新的ArrayList();
专用懒散适配器;
私有刷新列表视图mListView;
Parser task=newparser();
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.elenco_articoli);
试一试{
task.execute();
最终RefreshableListView列表=(RefreshableListView)findViewById(R.id.RefreshableListView);
adapter=newlazyadapter(这个,填充数据(task.get());
mListView=列表;
list.setAdapter(适配器);
list.setOnUpdate任务(新的OnUpdate任务(){
public void updateBackground(){
刷新_数据();
试一试{
睡眠(1500);
}捕捉(中断异常e){
e、 printStackTrace();
}
}
公共void updateUI(){
adapter.notifyDataSetChanged();
}
public void onUpdateStart(){
}
});
}捕捉(中断异常e){
e、 printStackTrace();
}捕获(执行例外){
e、 printStackTrace();
}
mListView.setOnItemClickListener(新的OnItemClickListener(){
public void onItemClick(AdapterView父对象、视图、int位置、长id){
/*
待办事项
*/
}
});
}
@凌驾
公共空间
{
mListView.setAdapter(空);
super.ondestory();
}
公共ArrayList填充数据(ArrayList DatidXML){
ArrayList rec=新的ArrayList();
对于(inti=0;i如果你看这个例子,你应该很容易理解
链接:
在refreshn上,您只需下载新项目(例如,向Web服务发送时间戳或id)
然后,仅解析新项目并将其添加到此处:
@Override
protected void onPostExecute(String[] result) {
mListItems.addFirst("Added after refresh...");
mAdapter.notifyDataSetChanged();
// Call onRefreshComplete when the list has been refreshed.
mPullRefreshListView.onRefreshComplete();
super.onPostExecute(result);
}
编辑:如果您无法仅下载所需的项目(RSS提要),请下载evrything并在onPostExecute中添加正确的项目
if(!isALreadyInTheList(currentItem))
mListItems.addFirst(currentItem);
else
doNothing();
乍一看,您似乎在添加内容,而不是替换内容,但向我们展示代码将有助于诊断问题。.使用notifyDataSetChanged()更新后刷新ListView不可能xml文件是一个提要RSW什么是不可能的?在onPostExecute中,只添加您需要的项,这似乎很简单,我不理解您的问题。嘿…如果您无法下载和解析xml,我不能只添加我需要的项,这是一个完全不同的问题!您是n现在问的是listview,而不是下载部分。Waza be我无法理解你我没有使用Chris banes pull刷新控件,所以?
if(!isALreadyInTheList(currentItem))
mListItems.addFirst(currentItem);
else
doNothing();