2016-11-10 248 views
-2

所以基本上我正在創建一個Activity,它顯示RecyclerView中的海灘列表。假設發生的事情是,當用戶開始在他們正在尋找的海灘上打字時,在上面的搜索菜單中,海灘清單最終縮小到他們正在尋找的海灘。因此,我從字面上對我的代碼最後一行的這是全功能的,但我不斷收到這條線需要setFilter幫助

adapter.setFilter(newlist); 

下面的setFilter部分的錯誤是我的代碼,請指教。

BeachActivity.java

public class BeachActivity extends AppCompatActivity implements SearchView.OnQueryTextListener { 
    Toolbar toolbarbeach; 
    RecyclerView recyclerView; 
    RecyclerView.Adapter adapter; 
    RecyclerView.LayoutManager layoutManager; 
    ArrayList<beachesalbum> arrayList = new ArrayList<>(); 
    String [] b_name = {"South Beach","North Beach","Another Beach","Beachman"}; 
    int [] b_pic = {R.drawable.b1,R.drawable.b2,R.drawable.b3,R.drawable.b4,}; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_beach); 
     toolbarbeach=(Toolbar)findViewById(R.id.toolbar_beaches); 
     setSupportActionBar(toolbarbeach); 
     getSupportActionBar().setTitle("Beaches"); 
     recyclerView = (RecyclerView)findViewById(R.id.recyclerview); 
     layoutManager = new GridLayoutManager(this,2); 
     recyclerView.setLayoutManager(layoutManager); 
     recyclerView.setHasFixedSize(true); 

     int count = 0; 

     for (String Name :b_name) 
     { 
      arrayList.add(new beachesalbum(Name,b_pic[count])); 
      count++; 
     } 
     adapter = new RecyclerAdapterBeaches(arrayList); 
     recyclerView.setAdapter(adapter); 

    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     getMenuInflater().inflate(R.menu.menu_items,menu); 
     MenuItem menuItem = menu.findItem(R.id.beachsearch); 
     SearchView searchView = (SearchView)MenuItemCompat.getActionView(menuItem); 
     searchView.setOnQueryTextListener(this); 
     return true; 
    } 

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

    @Override 
    public boolean onQueryTextChange(String newText) { 
     newText = newText.toLowerCase(); 
     ArrayList<beachesalbum> newlist = new ArrayList <>(); 

     for(beachesalbum beachesalbum : arrayList) 
     { 
      String name = beachesalbum.getName().toLowerCase(); 
      if (name.contains(newText)); 
      newlist.add(beachesalbum); 
     } 
     adapter.setFilter(newlist); 

     return true; 
    } 
} 

正如你可以看到我的錯誤是在adapter.setFilter(newlist);以上

beachesalbum.java

public class beachesalbum { 
    private int img_id; 
    private String name; 
    public beachesalbum(String name,int img_id) 
    { 
     this.setName(name); 
     this.setImg_id(img_id); 
    } 

    public int getBeach_id() { 
     return beach_id; 
    } 

    public void setBeach_id(int beach_id) { 
     this.beach_id = beach_id; 
    } 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    private int beach_id; 

    beachesalbum(int img_id) 
    { 
     setImg_id(img_id); 
    } 



    public int getImg_id() { 
     return img_id; 
    } 

    public void setImg_id(int img_id) { 
     this.img_id = img_id; 
    } 
} 

最後 RecyclerAdapterBeaches.ja va

public class RecyclerAdapterBeaches extends  RecyclerView.Adapter<RecyclerAdapterBeaches.BeachesViewHolder>{ 
    ArrayList<beachesalbum> arrayList = new ArrayList<>(); 
    RecyclerAdapterBeaches(ArrayList<beachesalbum>arrayList) 
    { 
     this.arrayList = arrayList; 
    } 
    @Override 
    public BeachesViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.row_layout,parent,false); 

     return new BeachesViewHolder(view); 
    } 

    @Override 
    public void onBindViewHolder(BeachesViewHolder holder, int position) { 
     holder.b_pic.setImageResource(arrayList.get(position).getImg_id()); 
     holder.b_id.setText(arrayList.get(position).getName()); 

    } 

    @Override 
    public int getItemCount() { 

     return arrayList.size(); 
    } 
    public static class BeachesViewHolder extends RecyclerView.ViewHolder 
    { 
     ImageView b_pic; 
     TextView b_id; 

     public BeachesViewHolder(View itemView) { 
      super(itemView); 
      b_pic=(ImageView)itemView.findViewById(R.id.beachpic); 
      b_id=(TextView)itemView.findViewById(R.id.beaches_id); 

     } 
    } 

    public void setFilter(ArrayList<beachesalbum>newlist) 
    {arrayList=new ArrayList<>(); 
    arrayList.addAll(newlist); 
    notifyDataSetChanged();} 
} 

請給予您的幫助。

+1

*上使用setfilter *錯誤 - **什麼錯誤** –

+1

的可能的複製[如何過濾與搜索查看一個RecyclerView(http://stackoverflow.com/questions/30398247/how-to - 篩選-A-recyclerview上帶有一個-搜索查看) –

回答

0

在你BeachActivity你設置的適配器arrayListRecyclerView適配器保留您的參考arrayList。因此,如果您需要過濾掉RecyclerView中的某些項目,則需要在arrayList中進行更改。

@Override 
public boolean onQueryTextChange(String newText) { 
    newText = newText.toLowerCase(); 

    // Clear the arrayList first. 
    arrayList.clear(); 

    // If the search text is empty, repopulate the arrayList 
    if(newText.length == 0) { 
     int count = 0; 
     for (String Name :b_name) { 
      arrayList.add(new beachesalbum(Name,b_pic[count])); 
      count++; 
     } 
    } 

    else { 
     int count = 0; 
     for (String Name :b_name) { 
      if(Name.contains(newText)) 
       arrayList.add(new beachesalbum(Name,b_pic[count])); 
      count++; 
     } 
    } 

    adapter.setFilter(arrayList); 

    return true; 
} 

而在你的適配器

public void setFilter(ArrayList<beachesalbum> newlist) { 
    this.arrayList.clear(); 
    this.arrayList.addAll(newlist); 
    notifyDataSetChanged(); 
} 

更新

setFilter功能。是的,從以前的答案。您需要採取RecyclerAdapterBeaches adapter而不是RecyclerView.Adapter adapter。我錯過了那部分。感謝@loosethinker。

RecyclerAdapterBeaches adapter; 
2

對於RecyclerView.AdaptersetFilter函數不存在,它是adapter變量的類型。既然你總是分配一個RecyclerAdapterBeaches它,你應該改變它的類型。

否則,它不能確保該對象具有setFilter函數。

public class BeachActivity extends AppCompatActivity implements SearchView.OnQueryTextListener { 
    Toolbar toolbarbeach; 
    RecyclerView recyclerView; 
    RecyclerAdapterBeaches adapter; // Update this line 

    // ... 
}