1

我嘗試通過在工具欄上放置一個SearchView來過濾RecyclerView,我從它的25分鐘後跟隨了this教程,因爲它明確表示要查找什麼, 從教程實現後,他們使用「ArrayList newList = new ArrayList <>()「哪些工作正常,但我想要使用這種形式實現它 」ArrayList> newList = new ArrayList <>()「因爲是我通過了項目的格式。我試圖做到這一點如下:篩選器使用searchview的Recycler視圖

///活動

public class MainActivity extends AppCompatActivity implements SearchView.OnQueryTextListener { 
// DB Class to perform DB related operations 
DBController controller = new DBController(MainActivity.this); 
// Progress Dialog Object 
ArrayList<HashMap<String, String>> arrayList= new ArrayList<HashMap<String, String>>(); 
private RecyclerView recyclerView; 
private LinearLayoutManager layoutManager; 
private UsersAdapter adapter; 
@Override 
    protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
setContentView(R.layout.activity_main); 
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
setSupportActionBar(toolbar); 
// Get User records from SQLite DB 
    ArrayList<HashMap<String, String>> userList = controller.getAllUsers(); 
    // If users exists in SQLite DB 
    if (userList.size() != 0) { 
     recyclerView = (RecyclerView) findViewById(R.id.usersList); 
     recyclerView.setHasFixedSize(true); 
     layoutManager = new LinearLayoutManager(this); 
     recyclerView.setLayoutManager(layoutManager); 
     controller = new DBController(MainActivity.this); 
     ArrayList<HashMap<String, String>> users = controller.getAllUsers(); 
     adapter = new UsersAdapter(users,this); 
     recyclerView.setAdapter(adapter); 
     adapter.notifyDataSetChanged(); 
    } 
    } 
@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    MenuInflater inflater = getMenuInflater(); 
    inflater.inflate(R.menu.menu_main, menu); 
    final MenuItem searchItem = menu.findItem(R.id.action_search); 
    final SearchView searchView = (SearchView) MenuItemCompat.getActionView(searchItem); 
    searchView.setOnQueryTextListener(this); 
    return true; 

} 
@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    // Handle action bar item clicks here. 
    int id = item.getItemId(); 
    return super.onOptionsItemSelected(item); 
} 

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

    @Override 
     public boolean onQueryTextChange(String newText) { 
    newText = newText.toLowerCase(); 
    ArrayList<HashMap<String, String>> newList= new ArrayList<>(); 
    for( HashMap<String, String> entry : arrayList){ 
     String name= entry.put("userName",newText); 
     if(name.contains(newText)){ 
     newList.add(entry); 
    }} 
    adapter.setFilter(newList); 
    return true; 
    } 
    } 

///適配器類

public class UsersAdapter extends RecyclerView.Adapter<UsersAdapter.UserViewHolder> { 
ArrayList<HashMap<String, String>> mDataSet= new ArrayList<HashMap<String, String>>(); 
     Context ctx; 
     public UsersAdapter(ArrayList<HashMap<String, String>> mDataSet,Context ctx)  { 
     this.mDataSet = mDataSet; 
     this.ctx=ctx; 
     } 
     @Override 
     public UserViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.user_row, parent,  false); 
     UserViewHolder userViewHolder = new UserViewHolder(v,mDataSet,ctx); 
     return userViewHolder; 
     } 
     @Override 
    public void onBindViewHolder(UserViewHolder holder, int position) { 
    holder.name_entry.setText(mDataSet.get(position).get("userId")); 
    holder.email_entry.setText(mDataSet.get(position).get("userName")); 
    holder.icon_entry.setText(""+mDataSet.get(position).get("number")); 
      } 
     @Override 
     public int getItemCount() { 
       return mDataSet.size(); 
      } 

    public static class UserViewHolder extends RecyclerView.ViewHolder { 
    CardView cardView; 
    TextView name_entry, email_entry, icon_entry; 
    Context ctx; 
     ArrayList<HashMap<String, String>> mDataSet= new ArrayList<HashMap<String, String>>(); 
     public UserViewHolder(View itemView, ArrayList<HashMap<String, String>>  mDataSet,Context ctx) { 
      super(itemView); 
      this.mDataSet=mDataSet; 
     this.ctx= ctx; 
     cardView = (CardView) itemView.findViewById(R.id.user_layout); 
     name_entry = (TextView) itemView.findViewById(R.id.name_entry); 
     email_entry = (TextView) itemView.findViewById(R.id.email_entry); 
     icon_entry = (TextView) itemView.findViewById(R.id.icon_entry); 
       } 
       } 

     @Override 
     public void onAttachedToRecyclerView(RecyclerView recyclerView) { 
    super.onAttachedToRecyclerView(recyclerView); 
      } 

     public void setFilter(ArrayList<HashMap<String, String>> newList){ 
     //we have used hashmap, find how to use it here 
    mDataSet= new ArrayList<HashMap<String, String>>(); 
    mDataSet.addAll(newList); 
    notifyDataSetChanged(); 
     } 

     } 

但是當我點擊搜索圖標回收站視圖,所有數據消失,直到我恢復應用程序。在我看來,我的事情是增加空數據,雖然我不確定,因爲對Android有點新,任何想法,我在哪裏弄錯了,我怎麼能使它工作。我知道有this解決方案,但我沒有得到它。

+0

@pskink當我使用這個新類時,它意味着我必須將整個適配器類更改爲您提供的代碼,問題出在我的適配器類中,像項目點擊聽衆,我不明白我怎麼可以使用他們使用您的解決方案。真正是新的android爲什麼我堆積 –

回答

0

你在你的活動課上宣稱:

ArrayList<HashMap<String, String>> arrayList= new ArrayList<HashMap<String, String>>(); 

,但你沒有分配給它。它應該是

arrayList = controller.getAllUsers(); 

因爲您已按此字段進行過濾,並且總是有數據。而且最好將這個變量從arrayList重命名爲userList :)

+0

謝謝@ A.Shevchuk我已修改onQueryTextChange方法中的代碼,它的工作原理,但唯一剩下的是,當我點擊搜索圖標的關鍵值被搜索消失,當我鍵入它找到匹配值重新輸入,直到找到完成的單詞。我認爲是由於這裏的代碼「String name = entry.put(」userName「,newText);」該設置將其設置爲空並等待用戶輸入。我該如何解決這個問題? –

+0

我已將它更改爲String name = entry.get(「number」)。toLowerCase(),它工作正常,謝謝@@ A.Shevchuk –