Android 从xml更新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 怎么了 编

我有一个由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();