Android 更新ArrayList时adapter.notifyDataSetChanged()不工作

Android 更新ArrayList时adapter.notifyDataSetChanged()不工作,android,android-listview,Android,Android Listview,我看过很多关于这个案子的帖子,但我没有找到解决办法。我使用SwipeRefreshLayout.OnRefreshListener,这是我在onRefresh()方法中的代码。这不管用 new Handler().postDelayed(new Runnable() { @Override public void run() { Aviso aviso = new Aviso(); aviso.setTitle("MMMM

我看过很多关于这个案子的帖子,但我没有找到解决办法。我使用
SwipeRefreshLayout.OnRefreshListener
,这是我在
onRefresh()
方法中的代码。这不管用

    new Handler().postDelayed(new Runnable() {
        @Override public void run() {

            Aviso aviso = new Aviso();
            aviso.setTitle("MMMMMMMMMMMMMMMMMMMMMM");
            aviso.setDescription("Deskribapena");
            aviso.setPubDate("Wed, 19 Mar 2016 12:40:00 GMT");
            aviso.setDcDate("2016-03-19T12:40:00Z");

            avisosList.add(aviso);  

            swipeRefresh.setRefreshing(false);
            adapter.notifyDataSetChanged();
        }
        }, 2000);
但是如果我创建新的适配器并在ListView中设置,结果会很好

    new Handler().postDelayed(new Runnable() {
        @Override public void run() {

            Aviso aviso = new Aviso();
            aviso.setTitle("MMMMMMMMMMMMMMMMMMMMMM");
            aviso.setDescription("Deskribapena");
            aviso.setPubDate("Wed, 19 Mar 2016 12:40:00 GMT");
            aviso.setDcDate("2016-03-19T12:40:00Z");

            avisosList.add(aviso);


                   adapter = new AvisosEnListaAdapter(getActivity(), avisosList);
                   lv.setAdapter(adapter);

               swipeRefresh.setRefreshing(false);
        }
        }, 2000);
适配器代码:

public class AvisosEnListaAdapter extends BaseAdapter{

    protected Activity activity;
    protected ArrayList<Aviso> items;

    //Constructor
    public AvisosEnListaAdapter (Activity activity, ArrayList<Aviso> items){
        this.activity = activity;
        this.items = items;
    }

    public AvisosEnListaAdapter(ArrayList<Aviso> items) {
        this.items = items;     // TODO Auto-generated constructor stub
    }



    @Override
    public int getCount() {
        // TODO Auto-generated method stub
        return items.size();
    }

    @Override
    public Object getItem(int position) {
        // TODO Auto-generated method stub
        return items.get(position);
    }

    @Override
    public long getItemId(int position) {
        // TODO Auto-generated method stub
        return items.get(position).get_Id();
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        // TODO Auto-generated method stub
        View v = convertView;

        if(convertView == null){
            LayoutInflater inf = (LayoutInflater) activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            v = inf.inflate(R.layout.custom_avisosenlista, null);
        }

        //Create Aviso object
        Aviso aviso = items.get(position);

        //write title
        TextView title = (TextView) v.findViewById(R.id.custom_avisosenlista_tv_title_aviso);

        //Fuente
                Typeface fontTitulo = Typeface.createFromAsset(activity.getAssets(), "fonts/OpenSans-Regular.ttf");

                //Setter fuente
                title.setTypeface(fontTitulo);
        title.setText(aviso.getTitle());

        //write data
        TextView tvData = (TextView) v.findViewById(R.id.custom_avisosenlista_tv_data_aviso);
        Typeface fontData = Typeface.createFromAsset(activity.getAssets(), "fonts/OpenSans-LightItalic.ttf");

                //Setter fuente
                tvData.setTypeface(fontData);
            tvData.setText(aviso.getFechaParaPublicar());

        return v;
    }



}
公共类AvisosEnListaAdapter扩展BaseAdapter{
受保护的活动;
受保护的ArrayList项;
//建造师
公共AvisosEnListaAdapter(活动、阵列列表项){
这个。活动=活动;
这个项目=项目;
}
公共AvisosEnListaAdapter(阵列列表项){
this.items=items;//TODO自动生成的构造函数存根
}
@凌驾
public int getCount(){
//TODO自动生成的方法存根
返回items.size();
}
@凌驾
公共对象getItem(int位置){
//TODO自动生成的方法存根
返回项目。获取(位置);
}
@凌驾
公共长getItemId(int位置){
//TODO自动生成的方法存根
返回项目.get(position.get_Id();
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
//TODO自动生成的方法存根
视图v=转换视图;
if(convertView==null){
LayoutInflater inf=(LayoutInflater)activity.getSystemService(Context.LAYOUT\u INFLATER\u SERVICE);
v=inf.inflate(R.layout.custom_avisosenlista,null);
}
//创建Aviso对象
Aviso Aviso=items.get(位置);
//书名
TextView title=(TextView)v.findViewById(R.id.custom_avisosenlista_tv_title_aviso);
//富恩特
Typeface fontTitulo=Typeface.createFromAsset(activity.getAssets(),“font/OpenSans Regular.ttf”);
//塞特富恩特酒店
标题.设置字体(fontTitulo);
title.setText(aviso.getTitle());
//写入数据
TextView tvData=(TextView)v.findViewById(R.id.custom_avisosenlista_tv_data_aviso);
Typeface fontData=Typeface.createFromAsset(activity.getAssets(),“fonts/OpenSans LightItalic.ttf”);
//塞特富恩特酒店
设置字体(fontData);
setText(aviso.getFechaParaPublicar());
返回v;
}
}
问题在哪里


嗯,存在一个小问题,元素出现在最后一个位置,而我想出现在第一个位置。

将列表元素重新加载到适配器中

Eg:
adapter.setListItems(avisosList); 
adapter.notifyDataSetChanged(); 
我只有一个办法

适配器中创建刷新方法

 public void refresh(ArrayList<Aviso> itemsw) {
    this.items = itemsw;     
    notifyDataSetChanged();
}
编辑: 要在特定位置添加元素,请对arraylist使用不同的重载方法

而不是

avisosList.add(aviso);
使用


您需要实现在适配器中添加元素,而不是将元素添加到创建适配器的列表中

public class AvisosEnListaAdapter extends BaseAdapter{
   protected Activity activity;
   protected ArrayList<Aviso> items;
   ........
   public void addItem(Aviso item){
       items.add(item);
   }
}

在您的活动/片段中的任何时候,您是否执行任何avisosList=new ArrayList();或者类似的东西来重新添加新项目?如果是这样,您必须知道正在创建一个新对象,因此它不会链接到适配器列表对象,这就是它无法更新的原因


管理适配器时只能执行一次“new ArrayList()”,然后每次要更改适配器时都要更改列表的内容,当然,还要调用notifyDataSetChanged()

这是工作,但为什么新元素出现在最后一个位置?我需要滚动查看。@aldakur只需更改
返回items.get(items.size()-1-position)getItem(…)
中的
适配器中
(在第一个位置添加项目)很抱歉
返回items.get(items.size()-1-position)不起作用。
avisosList.add(index, aviso); //Indes is the position where you want your item to appear
public class AvisosEnListaAdapter extends BaseAdapter{
   protected Activity activity;
   protected ArrayList<Aviso> items;
   ........
   public void addItem(Aviso item){
       items.add(item);
   }
}
adapter.addItem(aviso);
adapter.notifyDataSetChanged();