2016-11-10 353 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 

    // ... 
}