0

아래에 edittext가 있습니다. &는 recyclerview에있는 목록입니다. 먼저 편집 목록을 사용하여 목록 &을 필터링 한 다음 목록에서 특정 항목을 선택하면 응용 프로그램에서 인쇄/토스트합니다.recyclerview 목록에서 잘못된 항목 가져 오기 필터링 및 선택

내 문제는 목록에서 특정 항목을 선택하면 목록을 필터링 할 수 있지만 잘못된 항목 이름은 필터링되지 않고 원래 목록에서 가져 오는 것임을 의미합니다.

다음은 내가 문제가 여기 intent.putExtra("Name", nameList.get(position).getName()); 원래 목록의 항목을 얻을 생각 단편

onCreateView() { 
     recyclerView.addOnItemTouchListener(new RecyclerItemClickListener(context, 
       new RecyclerItemClickListener.OnItemClickListener() { 
        @Override 
        public void onItemClick(View view, int position) { 
         // TODO Handle item click 
         // Send the event to the host activity 
         Intent intent = new Intent(); 
         intent.putExtra("Name", nameList.get(position).getName()); 
         getTargetFragment().onActivityResult(
           getTargetRequestCode(), 101, intent); 
         dismiss(); 
        } 
       }) 
     ); 

    addTextListener(); 

} 

public void addTextListener(){ 

    editTextSearch.addTextChangedListener(new TextWatcher() { 

     public void afterTextChanged(Editable s) {} 

     public void beforeTextChanged(CharSequence s, int start, int count, int after) {} 

     public void onTextChanged(CharSequence query, int start, int before, int count) { 
      adapter.getFilter().filter(query.toString().toLowerCase()); 
     } 
    }); 
} 

내 어댑터 클래스 코드

public class NameListAdapter extends RecyclerView.Adapter<NameListAdapter.DataObjectHolder> 
     implements Filterable { 

    private ArrayList<NameDetail> originalNameDetailArrayList; 
    private List<NameDetail> filterNameDetailList; 
    private Context mContext = null; 
    private ValueFilter valueFilter; 

    @Override 
    public NameListAdapter.DataObjectHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.sd_custom_cardview_for_name_list_item, parent, false); 

     DataObjectHolder dataObjectHolder = new DataObjectHolder(view); 
     return dataObjectHolder; 
    } 

    @Override 
    public Filter getFilter() { 
     if (valueFilter == null) { 
      valueFilter = new ValueFilter(); 
     } 
     return valueFilter; 
    } 

    public class DataObjectHolder extends RecyclerView.ViewHolder { 

     TextView textViewName; 
     ImageView image; 

     public DataObjectHolder(View itemView) { 
      super(itemView); 
      mContext = itemView.getContext(); 
      textViewName = (TextView)itemView.findViewById(R.id.textView_Name); 
     } 

    } 


    public NameListAdapter(Context context, ArrayList<NameDetail> originalNameDetailArrayList) { 
     this.mContext = context; 
     this.originalNameDetailArrayList = originalNameDetailArrayList; 
     this.filterNameDetailList = originalNameDetailArrayList; 
    } 

    @Override 
    public void onBindViewHolder(final NameListAdapter.DataObjectHolder holder, int position) { 
     holder.textViewName.setText(originalNameDetailArrayList.get(position).getName()); 
    } 
    @Override 
    public int getItemCount() { 
     return originalNameDetailArrayList.size(); 
    } 

    private class ValueFilter extends Filter { 
     @Override 
     protected FilterResults performFiltering(CharSequence constraint) { 
      FilterResults results = new FilterResults(); 

      if (constraint != null && constraint.length() > 0) { 
       ArrayList<NameDetail> filterList = new ArrayList<NameDetail>(); 
       for (int i = 0; i < filterNameDetailList.size(); i++) { 
        if ((filterNameDetailList.get(i).getName().toUpperCase()) 
          .contains(constraint.toString().toUpperCase())) { 
         NameDetail listItem = new RegionDetail(); 
         listItem.setID(filterNameDetailList.get(i).getID()); 
         listItem.setName(filterNameDetailList.get(i).getName()); 
         filterList.add(listItem); 
        } 
       } 
       results.count = filterList.size(); 
       results.values = filterList; 
      } else { 
       results.count = filterNameDetailList.size(); 
       results.values = filterNameDetailList; 
      } 
      return results; 

     } 

     @Override 
     protected void publishResults(CharSequence constraint, 
             FilterResults results) { 
      originalNameDetailArrayList = (ArrayList<NameDetail>) results.values; 
      notifyDataSetChanged(); 
      Log.v("Size", " : " + originalNameDetailArrayList.size()); 
      if (originalNameDetailArrayList.size() == 0) { 
       new GlobalToast().showToastMessage(mContext, mContext.getResources().getString(R.string.no_records_found)); 
      } 
     } 
    } 

} 
+0

[이 답변] (http://stackoverflow.com/questions/24885223/why-doesnt-recyclerview-have-onitemclicklistener-and-how-recyclerview-is-dif)을 참조하십시오. –

+0

@ SelçukCihan 길을 바꾸는 대신 필터링 된 항목을 가져 오는 다른 방법이 있어야합니다. – VVB

+0

대안으로, onCreateViewHolder 내에 각 행에 리스너를 설정할 수 있습니다. –

답변

0

안에 내 일부 코드입니다. 그러나 어댑터 내부에있는 필터링 된 목록의 항목이 필요합니다.

holder.itemView.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     // your implementation 
    } 
}); 

또는 어댑터 getFilteredItem(position)에서 함수를 만들 :

나는 어댑터 내부에 OnClickListener를를 사용하여 recomment 것입니다.

편집

또 다른 아이디어는 당신의 조각에서 콜백을 작성하고 어댑터를 통해 전달할 수 있습니다.

holder.itemView.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     callback.onItemClicked(item); 
    } 
}); 

그런 다음 당신이 당신의 조각 내에서 호출 할 수 있습니다 : 어댑터 내부의 온 클릭이 콜백 전화 사용자가 필터링되어

@Override 
public Filter getFilter() { 
    if (valueFilter == null) { 
     valueFilter = new ValueFilter(); 
    } 
    return valueFilter; 
} 

:

public void onItemClicked(MyItem item) { 
    // your implementation 
    item.getName(); // do whatever you want with the name 
} 
+0

다른 조각 작업에 과부하가 걸리기 때문에이 작업을 수행 할 수 없습니다. – VVB

+0

다른 조각 작업의 코드를 표시 할 수 있습니까? – beeb

+0

내 대답이 다른 아이디어로 업데이트되었습니다. – beeb

-1

나는 문제가 여기에있다 생각 onTextChanged이지만 새 필터를 만드는 대신 이전 필터를 다시 사용하고 있습니다. 모든 getFilter 요청에서 다음과 같이 새 필터를 만들어야합니다.

@Override 
public Filter getFilter() { 
    return new ValueFilter() 
} 

희망이 있습니다.

+0

내 문제는 필터가 아닙니다. 필터링 된 위치 대신 – VVB

0

나는 이것이 늦었다 고 알고 있지만 같은 문제가있었습니다. 내가 내 문제를 해결 했으므로 나는 너를 도우려고 생각했다.

쉽게 수정할 수 있습니다. 아래처럼 모델을 반환하는 리사이클 러 뷰 어댑터 내부에 메소드를 생성하십시오.

public Model getItem (int position) { 
    return modelList.get(position) 
} 

여기 modelListList 또는 ModelArrayList입니다.

나는이 도움이 되었으면 좋겠 recyclerAdapter.getItem(position)

로 필터링 된 목록에이 메서드를 호출합니다. 스택 오버플로에 대한 답변이 처음입니다. 도움이된다면 답장하십시오.