2015-06-22 39 views
-2

我看過很多關於這種情況的文章,但是我沒有找到適合我的解決方案。我使用SwipeRefreshLayout.OnRefreshListener,這是我在onRefresh()方法中的代碼。這不起作用。當我更新ArrayList時,adapter.notifyDataSetChanged()不起作用

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; 
    } 



} 

問題出在哪裏?

那麼,存在一個小問題,該元素出現在最後的位置,我想出現在第一個位置。

+1

顯示適配器代碼 –

+0

我編輯了我的帖子 – aldakur

回答

1

我有一個辦法

Adapter

public void refresh(ArrayList<Aviso> itemsw) { 
    this.items = itemsw;  
    notifyDataSetChanged(); 
} 

現在你只從調用此方法創建刷新方法您Activity

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.refresh(avisosList); 

編輯: 添加在特定位置的元素,使用di對於數組列表

,而不是

avisosList.add(aviso); 

使用fferent重載方法

avisosList.add(index, aviso); //Indes is the position where you want your item to appear 
+0

這是工作,但爲什麼新元素出現在最後的位置?我需要滾動才能看到它。 – aldakur

+0

@aldakur只需在'Adapter'中添加'return item.get(items.size() - 1 - position);'in'getItem(...)'(在第一個位置添加項目) –

+0

對不起,但是'return items.get(items.size() - 1 - position);'不起作用。 – aldakur

0

將列表元素重新加載到適配器中。

Eg: 
adapter.setListItems(avisosList); 
adapter.notifyDataSetChanged(); 
0

您需要執行另外在適配器的元素而不是添加元素的列表,從中適配器被創建

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(); 
1

任何時候在你的Activity/Fragment中你是否執行了任何avisosList = new ArrayList();或類似的東西重新添加新項目?如果是這樣,您必須知道正在創建一個新對象,所以它不會鏈接到適配器列表對象,所以這就是爲什麼它無法更新。

在管理適配器時,只能執行一次「new ArrayList()」,然後在每次更改適配器時更改List的內容,然後調用notifyDataSetChanged( );

相關問題