2017-10-31 3 views
2

이 링크를 따라 RecyclerView에서 검색 기능을 구현하려고했습니다. using SearchView with 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]; 
     } 
    }; 
} 

:

여기 내 모델 클래스입니다. 내가 필터링을 볼 수 없습니다입니다 이유를 찾기 위해 노력하고

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

      } 
     }); 
    } 

: 아래

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

내 MainActivity입니다 : 여기 필터 논리를 구현하는 어댑터 클래스 내 방법입니다 결과, 만약 내가 내 arrayList에지고있다. 존재 does't 경우

+0

은 publishResults가 호출됩니까? – Mars

+0

나는 아래 답변했다. 내가 옳다면, 빠른 픽스입니다. – Mars

답변

2

코드에서 볼 수 없지만 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(); 
    } 

이 변경보기를 업데이트하는 경우

(또는 실제로 목록을 filteredKickStarter 살펴보기)

+0

나는 당신이 맞다고 생각한다. –

+1

가장 흔한 실수는 복제본의 복제본이다.; p – Mars

+1

고마워. 많이 @Mars 나는 정말 어리석은 실수를 저질 렀다. 내 시간을 구 했잖아. –

0

...... 당신의 활동에

private ArrayList<Kickstarter> filter(List<Kickstarter> models, String query) { 
    query = query.toLowerCase(); 
    final ArrayList<Kickstarter> filteredModelList = new ArrayList<>(); 
    for (Kickstarter model : models) { 
     final String text = model.getState().toLowerCase(); 
     if (text.contains(query)) { 
      filteredModelList.add(model); 
     } 
    } 
    return filteredModelList; 
} 

private void search(SearchView searchView) { 

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

      @Override 
      public boolean onQueryTextChange(String newText) { 
       final ArrayList<Kickstarter> filteredModelList = filter(subCategory, newText); 
       adapter.setFilter(filteredModelList); 
      } 
     }); 
    } 

을이 시도하고이 방법을 추가하는 것은 ....

public void setFilter(ArrayList<Kickstarter> countryModels) { 
     subCategory = new ArrayList<>(); 
     subCategory.addAll(countryModels); 
     notifyDataSetChanged(); 
    } 

    @Override 
    public long getItemId(int position) { 
     return position; 
    } 

    @Override 
    public int getItemViewType(int position) { 
     return position; 
    } 

    @Override 
    public int getItemCount() { 
     return subCategory.size(); 
    } 

어댑터입니다 희망이 당신을 도울 것입니다 ....

Fe 엘

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

어댑터 클래스 .....

+0

subCategory 란 무엇이며 어디에 선언하고 있습니까? –

+0

어댑터의 주요 arraylist 개체 – sushildlh

+0

같은 결과입니다. 업데이트 된 목록을 볼 수 없습니다. –

0

활동 클래스 onQueryTextChange 아무것도 물어 필터링 무료 -> updateList 방법

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

나를 위해 일하는이 방법 ...

0

변경 사항을 업데이트하려면 목록을 먼저 업데이트 한 다음 위치를 리사이클 러보기에 알려야합니다. 코드를 조금 수정하는 것이 좋습니다.

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

리사이클 러 뷰의 Adapter 클래스에 위 코드를 작성하십시오.

관련 문제