繁体   English   中英

在 RecyclerView 中搜索

[英]Searching in RecyclerView

我尝试通过使用 SearchView 和 RecyclerView按照此链接在 RecyclerView 中实现搜索功能。 我的过滤工作正常,但结果没有在适配器中更新,这就是我看不到结果的原因。

这是我的模型类:

public class Kickstarter implements Parcelable {

    @SerializedName("s.no")
    private String s_no;

    @SerializedName("amt.pledged")
    private String amt_pledged;

    @SerializedName("blurb")
    private String blurb;

    @SerializedName("by")
    private String by;

    @SerializedName("country")
    private String country;

    @SerializedName("currency")
    private String currency;

    @SerializedName("end.time")
    private String end_time;

    @SerializedName("location")
    private String location;

    @SerializedName("percentage")
    private String percentage;

    @SerializedName("num.backers")
    private String num_backers;

    @SerializedName("state")
    private String state;

    @SerializedName("title")
    private String title;

    @SerializedName("type")
    private String type;

    @SerializedName("url")
    private String url;

    public Kickstarter(String s_no, String amt_pledged, String blurb, String by, String country, String currency, String end_time, String location, String percentage,
                        String num_backers, String state, String title, String type, String url){
        this.s_no = s_no;
        this.amt_pledged = amt_pledged;
        this.blurb = blurb;
        this.by = by;
        this.country = country;
        this.currency = currency;
        this.end_time = end_time;
        this.location = location;
        this.num_backers = num_backers;
        this.state = state;
        this.title = title;
        this.type = type;
        this.url = url;
        this.percentage = percentage;
    }

    public Kickstarter(Parcel parcel) {
        s_no = parcel.readString();
        amt_pledged = parcel.readString();
        blurb = parcel.readString();
        by = parcel.readString();
        country = parcel.readString();
        currency = parcel.readString();
        end_time = parcel.readString();
        location = parcel.readString();
        num_backers = parcel.readString();
        state = parcel.readString();
        title= parcel.readString();
        type = parcel.readString();
        url = parcel.readString();
        percentage = parcel.readString();
    }

    public String getS_no() {
        return s_no;
    }

    public void setS_no(String s_no) {
        this.s_no = s_no;
    }

    public String getAmt_pledged() {
        return amt_pledged;
    }

    public void setAmt_pledged(String amt_pledged) {
        this.amt_pledged = amt_pledged;
    }

    public String getBlurb() {
        return blurb;
    }

    public void setBlurb(String blurb) {
        this.blurb = blurb;
    }

    public String getBy() {
        return by;
    }

    public void setBy(String by) {
        this.by = by;
    }

    public String getCountry() {
        return country;
    }

    public void setCountry(String country) {
        this.country = country;
    }

    public String getCurrency() {
        return currency;
    }

    public void setCurrency(String currency) {
        this.currency = currency;
    }

    public String getEnd_time() {
        return end_time;
    }

    public void setEnd_time(String end_time) {
        this.end_time = end_time;
    }

    public String getLocation() {
        return location;
    }

    public void setLocation(String location) {
        this.location = location;
    }

    public String getPercentage() {
        return percentage;
    }

    public void setPercentage(String percentage) {
        this.percentage = percentage;
    }

    public String getNum_backers() {
        return num_backers;
    }

    public void setNum_backers(String num_backers) {
        this.num_backers = num_backers;
    }

    public String getState() {
        return state;
    }

    public void setState(String state) {
        this.state = state;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }

    public String getUrl() {
        return url;
    }

    public void setUrl(String url) {
        this.url = url;
    }

    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel parcel, int i) {
        parcel.writeString(this.s_no);
        parcel.writeString(this.amt_pledged);
        parcel.writeString(this.blurb);
        parcel.writeString( this.by);
        parcel.writeString(this.country);
        parcel.writeString(this.currency);
        parcel.writeString(this.end_time);
        parcel.writeString(this.location);
        parcel.writeString(this.num_backers);
        parcel.writeString(this.state);
        parcel.writeString(this.title);
        parcel.writeString(this.type);
        parcel.writeString(this.url);
        parcel.writeString(this.percentage);


    }

    public static final Creator<Kickstarter> CREATOR = new Creator<Kickstarter>() {
        @Override
        public Kickstarter createFromParcel(Parcel parcel) {
            return new Kickstarter(parcel);
        }

        @Override
        public Kickstarter[] newArray(int i) {
            return new Kickstarter[i];
        }
    };
}

我正在尝试按州名进行搜索。 这是我在 Adapter 类中实现过滤器逻辑的方法:

@Override
    public Filter getFilter() {
        return new Filter() {
            @Override
            protected FilterResults performFiltering(CharSequence charSequence) {

                String charString = charSequence.toString();

                if (charString.isEmpty()) {

                    filteredKickStarter = kickStarter;
                }
                else {
                    ArrayList<Kickstarter> filteredList = new ArrayList<>();

                    for (Kickstarter search : kickStarter) {

                        if ( search.getState().toLowerCase().contains(charString) ) {

                            filteredList.add(search);
                        }
                    }

                    filteredKickStarter = filteredList;
                }
                FilterResults filterResults = new FilterResults();
                filterResults.values = filteredKickStarter;
                return filterResults;
            }

            @Override
            protected void publishResults(CharSequence charSequence, FilterResults filterResults) {
                filteredKickStarter = (ArrayList<Kickstarter>)filterResults.values;
                notifyDataSetChanged();
            }
        };
    }

以下是我的主要活动:

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        setToolbar();

        mRecyclerView = (RecyclerView)findViewById(R.id.kictstarterRecycler);
        mRecyclerView.setHasFixedSize(true);
        mRecyclerView.setLayoutManager(new LinearLayoutManager(this));


        fetchKickStarter(mRecyclerView);
    }

    private void setToolbar() {
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
    }


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.main_menu, menu);

        final MenuItem searchItem = menu.findItem(R.id.action_search);
        final SearchView searchView = (SearchView) MenuItemCompat.getActionView(searchItem);
        search(searchView);
        return true;
    }

    private void search(SearchView searchView) {

        searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
            @Override
            public boolean onQueryTextSubmit(String query) {
                return false;
            }

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


    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        return super.onOptionsItemSelected(item);
    }

    private void fetchKickStarter(final RecyclerView mRecyclerView) {
        ApiInterface apiService = ApiClient.getClient().create(ApiInterface.class);
        Call<JsonElement> call = apiService.getKickStarter();
        call.enqueue(new Callback<JsonElement>() {
            @Override
            public void onResponse(Call<JsonElement> call, Response<JsonElement> response) {
                Log.d("resonse", response.toString());
                JsonElement object = response.body();
                Type listType = new TypeToken<List<Kickstarter>>() {
                }.getType();
                mKickStarter = new Gson().fromJson(object.getAsJsonArray(), listType);
                mAdapter = new KickstarterAdapter(mKickStarter,R.layout.kickstarter_row_layout,MainActivity.this);
                mRecyclerView.setAdapter(mAdapter);

            }

            @Override
            public void onFailure(Call<JsonElement> call, Throwable t) {

            }
        });
    }

我试图找出为什么我无法看到过滤结果,如果我进入我的数组列表。

从您的代码中看不到,但是您的Adapter列表设置为什么? 您使用的是kickStarter 还是filteredKickStarter? 如果您设置为 Kickstarter,那么notifyDataSetChanged()将无济于事。 如果是这种情况,请更改:

@Override
protected void publishResults(CharSequence charSequence, FilterResults filterResults) {
    filteredKickStarter = (ArrayList<Kickstarter>)filterResults.values;
    notifyDataSetChanged();
}

    @Override
    protected void publishResults(CharSequence charSequence, FilterResults filterResults) {
        kickStarter = (ArrayList<Kickstarter>)filterResults.values;
        notifyDataSetChanged();
    }

如果此更改更新了您的视图,那么您将需要以另一种方式存储未过滤的列表(或让您的列表实际查看过滤的KickStarter)

Activity 类 onQueryTextChange 和过滤器

  @Override
  public boolean onQueryTextChange(String newText) {
    Log.d(TAG, "onQueryTextChange");
    // filter your list from your input
    filter(newText);
    // you can use runnable postDelayed like 500 ms to delay search text
    return false;
  }

  void filter(String text) {
    Log.d(TAG, "filter");
    try {
      if (mList != null && !mList.isEmpty()) {
        if (temp != null) {
          temp = new ArrayList<>();
        } else {
          temp.clear();
        }
        for (Kickstarter data : mList) {
          // or use .equal(text) with you want equal match
          // use .toLowerCase() for better matches
          if (data.getState().toLowerCase().contains(text.toLowerCase())) {
            temp.add(data);
          }
        }
        // update recyclerview
        adapter.updateList(temp);
      }
    } catch (Exception e) {
      e.printStackTrace();
    }
  }

适配器类 -> updateList 方法

public void updateList(List<Kickstarter> itemEntities) {
    data = itemEntities;
    notifyDataSetChanged();
}

这种方法对我有用...

要更新更改,您需要先更新列表,然后将位置通知回收者视图。 我建议你稍微修改一下代码。

        private void updateCard(List<Kickstarter> itemEntities) { 
        itemEntities.set(Position, updateData);
        notifyItemChanged(Position);
    }

在你的回收器视图的 Adapter 类中编写上面的代码。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM