【问题标题】:setFilter help needed需要 setFilter 帮助
【发布时间】:2017-03-23 23:29:06
【问题描述】:

所以基本上我正在编写一个Activity,它在RecyclerView 中显示海滩列表。假设发生的情况是,在上面的搜索菜单中,当用户开始输入他们正在寻找的海滩时,海滩列表最终会缩小到他们正在寻找的海滩。所以我实际上是在我的最后一行代码上让它完全正常运行,但我在这一行的setFilter 部分不断收到错误

adapter.setFilter(newlist);

下面是我的代码,请指教。

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);

beachalbum.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.java

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();}
}

请提供您的帮助。

【问题讨论】:

标签: java android-studio arraylist


【解决方案1】:

RecyclerView.Adapter 不存在setFilter 函数,这是adapter 变量的类型。由于您总是为其分配RecyclerAdapterBeaches,因此您只需将其类型更改为该类型即可。

否则无法保证对象有setFilter函数。

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

    // ...
}

【讨论】:

    【解决方案2】:

    在您的BeachActivity 中,您正在使用arrayList 设置适配器。 RecyclerView 适配器保留您的 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;
    }
    

    还有适配器中的setFilter 函数

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

    更新

    是的,来自上一个答案。您需要使用RecyclerAdapterBeaches adapter 而不是RecyclerView.Adapter adapter。我错过了那部分。谢谢@loosethinker。

    RecyclerAdapterBeaches adapter;
    

    【讨论】:

      猜你喜欢
      • 2022-01-04
      • 2017-10-05
      • 2012-09-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多