2017-06-20 65 views
0

我試圖在工具欄中實現SearchView。當我嘗試搜索我的列表時,原始列表總是在嘗試執行搜索時返回而不是新列表。SearchView.OnQueryTextListner總是返回原始列表

當我調試它開始顯示新的列表與正確數量的項目裏面,但是當它完成它只是返回原始列表大小。

當調試進入publicResults但不更新適配器。不知道爲什麼它會得到新的列表,但不能替換舊的列表。

活動實現了搜索查看與篩選

public class LoadsActivity extends AppCompatActivity implements SearchView.OnQueryTextListener{ 

    @Inject 
    Lazy<IMyLoadsRetroService> retroService; 

    @Inject 
    IUser user; 

    public LoadsActivity() { 
     Injector.INSTANCE.getViewComponent(this).inject(this); 
    } 


    public static void startLoadsActivity(Context context) { 
     Intent loadsIntent = new Intent(context, LoadsActivity.class); 
     context.startActivity(loadsIntent); 
    } 

    @BindView(R.id.recyclerView) 
    RecyclerView recyclerView; 
    @BindView(R.id.loadProgressBar) 
    ProgressBar loadProgressBar; 
    @BindView(R.id.fab) 
    FloatingActionButton fab; 

    LoadAdapter loadAdapter; 
    private List<IMyLoadSummary> myLoadSummaryList = new ArrayList<>(); 

    protected void onCreate(@Nullable Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_loads); 
     Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
     setSupportActionBar(toolbar); 
     ButterKnife.bind(this); 

     recyclerView.setLayoutManager(new LinearLayoutManager(this)); 
     loadAdapter = new LoadAdapter(this, myLoadSummaryList); 
     recyclerView.setAdapter(loadAdapter); 

     loadProgressBar.setVisibility(View.VISIBLE); 

     fab.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       MainActivity.startLoadsActivity(LoadsActivity.this); 
      } 
     }); 


     retroService.get().getMyLoads().subscribeOn(Schedulers.io()).observeOn(rx.android.schedulers.AndroidSchedulers.mainThread()) 
       .subscribe(new Subscriber<List<MyLoadSummary>>() { 
        @Override 
        public void onCompleted() { 
         loadProgressBar.setVisibility(View.GONE); 
        } 

        @Override 
        public void onError(Throwable e) { 
         Toaster.s(LoadsActivity.this, e.getMessage()); 
        } 

        @Override 
        public void onNext(List<MyLoadSummary> myLoadSummaries) { 
         loadAdapter.setLoadData(myLoadSummaries); 
        } 
       }); 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.menu_main, menu); 

     SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE); 
     final MenuItem searchItem = menu.findItem(R.id.action_search); 
     final SearchView searchView = (SearchView) MenuItemCompat.getActionView(searchItem); 

     searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName())); 
     searchView.setOnQueryTextListener(this); 
     return true; 
    } 



    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     // Handle action bar item clicks here. The action bar will 
     // automatically handle clicks on the Home/Up button, so long 
     // as you specify a parent activity in AndroidManifest.xml. 
     int id = item.getItemId(); 

     //noinspection SimplifiableIfStatement 
     if (id == R.id.action_search) { 


      return true; 
     } 

     return super.onOptionsItemSelected(item); 
    } 

    @Override 
    public void onBackPressed() { 
     //leaving blank to disable back button 
    } 


    @Override 
    public boolean onQueryTextSubmit(String query) { 
     return false; 
    } 

    @Override 
    public boolean onQueryTextChange(String newText) { 
     loadAdapter.getFilter().filter(newText); 
     return true; 
    } 
} 

適配器

public class LoadAdapter extends RecyclerView.Adapter<LoadAdapter.ViewHolder> implements Filterable { 

    private Context mContext; 
    private List<? extends IMyLoadSummary> originalList; 
    private List<? extends IMyLoadSummary> filteredList; 

    public LoadAdapter(Context context, List<IMyLoadSummary> list) { 
     this.mContext = context; 
     this.originalList = list; 
     this.filteredList = list; 

     getFilter(); 
    } 

    public void setLoadData(List<? extends IMyLoadSummary> mLoadData) { 
     originalList = mLoadData; 
     notifyDataSetChanged(); 
    } 

    @Override 
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.recycler_row, parent, false); 
     return new ViewHolder(v); 
    } 

    @Override 
    public void onBindViewHolder(ViewHolder holder, int position) { 
     Gson gson = GsonFactory.getDefault(); 
     String jsonListString = gson.toJson(originalList.get(position)); 
     holder.loadsTextView.setText(jsonListString); 
    } 

    @Override 
    public int getItemCount() { 
     return originalList.size(); 
    } 

    @Override 
    public Filter getFilter() { 
     return new Filter() { 
      @Override 
      protected FilterResults performFiltering(CharSequence constraint) { 
       FilterResults filteredResults = new FilterResults(); 
       if (constraint != null && constraint.length() > 0) { 
        ArrayList<IMyLoadSummary> tempList = new ArrayList<>(); 

        //search content for any number...hopefully 
        for (IMyLoadSummary myLoadSummary : originalList) { 
         if (Integer.toString(myLoadSummary.getNumber()).contains(constraint.toString())) { 
          tempList.add(myLoadSummary); 
         } 
        } 
        filteredResults.count = tempList.size(); 
        filteredResults.values = tempList; 
       } else { 
        filteredResults.count = originalList.size(); 
        filteredResults.values = originalList; 
       } 

       return filteredResults; 
      } 

      @Override 
      protected void publishResults(CharSequence constraint, FilterResults results) { 
       filteredList = (List<? extends IMyLoadSummary>) results.values; 
       notifyDataSetChanged(); 
      } 
     }; 
    } 

    public class ViewHolder extends RecyclerView.ViewHolder { 

     public TextView loadsTextView; 

     public ViewHolder(View itemView) { 
      super(itemView); 

      loadsTextView = (TextView) itemView.findViewById(R.id.loadJSONText); 
     } 
    } 
} 

回答

0

什麼,我想建議的是隻保存數據到Android的源碼,然後運行SELECT * FROM table_name的地方名稱,比如'%string%'';查詢並在列表視圖中顯示它.hope它可以幫助你這是一個簡單的方法來做搜索和最快速的