2016-09-22 4 views
-1

두 상황에서 어댑터를 새로 고치고 싶지만 아무 일도 일어나지 않습니다.어댑터가 새로 고침되지 않습니다.

public class DatabaseAdapter extends ArrayAdapter<Exhibition> { 

    private Context context; 
    private List<Exhibition> records; 
    private List<Exhibition>filterRecords; 
    private Dao<Exhibition, Integer> exhibitionDAO; 
    private ViewHolder viewHolder; 
    private SearchFilter searchFilter; 

    public DatabaseAdapter(Context context, 
          int itemView, 
          List objects, 
          Dao<Exhibition, Integer> exhibitionDAO) { 
     super(context, itemView, objects); 
     this.context=context; 
     this.records = new ArrayList<>(objects); 
     this.filterRecords=new ArrayList<>(objects); 
     this.searchFilter=new SearchFilter(); 
     this.exhibitionDAO = exhibitionDAO; 

    } 

    @Override 
    public View getView(int position, View view, ViewGroup parent) { 

     final Exhibition exhibition= records.get(position); 

     if(view==null){ 
      LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      view= inflater.inflate(R.layout.museum_list_item_layout,parent,false); 
      viewHolder = new ViewHolder(); 
      view.setTag(viewHolder); 
     }else 
      viewHolder = (ViewHolder) view.getTag(); 
     viewHolder.eventName=(TextView)view.findViewById(R.id.list_item); 
      viewHolder.eventName.setText(exhibition.getName()); 

     return view; 
    } 

    @Override 
    public int getCount() { 
     return records.size(); 
    } 

    @Override 
    public Filter getFilter() { 
     if(searchFilter==null) 
      searchFilter=new SearchFilter(); 
     return searchFilter; 
    } 

    public class ViewHolder{ 
     TextView eventName; 
    } 

    private class SearchFilter extends Filter { 

     @Override 
     protected FilterResults performFiltering(CharSequence constraint) { 
      FilterResults results = new FilterResults(); 

      List<Exhibition> list; 
      if (constraint == null || constraint.length() == 0){ 
       list = new ArrayList<Exhibition>(records); 
       results.values = list; 
       results.count = list.size();} 
       else{ 
     try{ 

      list = exhibitionDAO.queryBuilder().where().like("name","%"+constraint+"%").query(); 
      synchronized (list){ 
      results.values=list; 
      results.count=list.size();} 
     } 
     catch (SQLException e){e.printStackTrace();}} 
      return results; 
     } 

     @SuppressWarnings("unchecked") 
     @Override 
     protected void publishResults(CharSequence constraint, FilterResults results) { 
      filterRecords = (ArrayList<Exhibition>)results.values; 
      notifyDataSetChanged(); 
      clear(); 
      int count = filterRecords.size(); 

      for(int i = 0; i<count; i++){ 
       add(filterRecords.get(i)); 
       notifyDataSetInvalidated(); 
      } 
     } 
    } 
    } 

UPDATE : 나는 두 가지 기능을 추가하여 내 문제를 해결 :

우선은

adapter.clear(); 
adapter.addAll(filteredList); //filtered list is a new list to show on adapter 
adapter.notifyDataSetChanged(); 

내가 notifyDataSetInvalidated();

내 어댑터 클래스에 의해 내 필터를 새로 고치려고 두 번째 전화 시도

public void addAllItems(List< Exhibition> exhibitions){ 
     records.clear(); 
     records.addAll(exhibitions); 
    } 
    public void addItems(List<Exhibition> exhibitions){ 
     records.addAll(exhibitions); 
    } 

하나는 모든 항목을 새로 고쳐서 두 번째 항목을 목록에 추가하는 것입니다. 나는 이것이 매우 효율적인 해결책이 아니라고 주장한다. 누군가가 나에게 그것을 향상 시키는데 도움이된다면 나는 감사 할 것이다.

+0

기본 클래스로 ArrayAdapter와 사용하는 이유는 무엇인가? 'ArrayAdapter.clear()'는 데이터 셋을 무효화합니다. 이전에'notifyDataSetChanged'의 포인트는 무엇입니까? ... 'ArrayAdapter.add()'와 같은 이야기 – Selvin

+0

나는 adapter.clear()에 의해 어댑터의 모든 항목을 지우고 새 항목을 추가하고 변경 사항을 통지해야한다고 생각했습니다. – Expiredmind

+0

'@Override public int getCount() { return records.size(); } public view getView (int position, View view, ViewGroup parent) { 최종 전시 전 = records.get (position);'당신은'AA.getCount' ...의 기본 구현을 사용하지 않고 있습니다. 'AA.getView()'구현 내에서'AA.getItem()'을 사용하지 않습니다 ... 그래서'AA.clear'와'AA.add'를 사용하면 감각이 없습니다 – Selvin

답변

-1

이 시도 :

filteredList.clear(); 

    adapter.notifyDataSetChanged(); 
+1

그는 또한 그의 머리에 서기 위해 노력할 수 있습니다. 요점은 무엇입니까? ... getCount와 getView는'filteredList'와 연결되어 있지 않은'records'를 사용하고 있습니다 ...'filteredList'를 지우고'notifyDataSetChanged'를 호출하면 전혀 감지하지 못합니다 ... – Selvin

관련 문제