2012-12-29 2 views
0

영원히 노력했지만 문제가 무엇인지 알 수 없습니다. 제 경우에는 데이터로 채워지는 여러 개의 '모듈'이 있습니다. EditText를 사용하여 목록을 필터링 할 수도 있지만 맞춤형 어댑터에서 올바른 행 ID를 반환하지는 않습니다 (객체가 다르다는 점을 제외하고는 동일 함에도 불구하고).android 맞춤 어댑터 필터가 맞춤 목록 항목과 작동하지 않습니다.

여기 내 2 파일입니다. RecordsListAdapter.java에서 필터가 올바르게 작동하고 ContactsListAdapter.java에서 잘못된 rowID를 반환합니다.

희망을 보내주세요.

- EDIT - 문제는 rowID가 반환 된 것과 같습니다. '원래'rowID를 반환하지 않으며, 'filtered'rowID를 반환하므로 두 경우 모두 첫 번째 행을 1 회 반환하지만 필터링하면 안됩니다.

package nl.cuse.crm.adapters; 

import java.util.ArrayList; 

import nl.cuse.crm.objects.lists.RecordsListItem; 
import android.R; 
import android.content.Context; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.ArrayAdapter; 
import android.widget.Filter; 
import android.widget.TextView; 

public class RecordsListAdapter extends ArrayAdapter<RecordsListItem> { 
    private ArrayList<RecordsListItem> original; 
    private ArrayList<RecordsListItem> filtered; 
    private ArrayList<RecordsListItem> fulllist; 
    private Filter filter; 
    int resource; 

    public RecordsListAdapter(Context context, int textViewResourceId, 
      ArrayList<RecordsListItem> items) { 
     super(context, textViewResourceId, items); 
     this.original = items; 
     this.fulllist = new ArrayList<RecordsListItem>(items); 
     this.filtered = new ArrayList<RecordsListItem>(items); 
     resource = textViewResourceId; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 

     View v = convertView; 

     if (v == null) { 
      LayoutInflater inflater = (LayoutInflater) getContext() 
        .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      v = inflater.inflate(R.layout.simple_list_item_1, null); 
     } 

     RecordsListItem m = original.get(position); 

     if (m != null) { 

      TextView tt = (TextView) v.findViewById(R.id.text1); 

      tt.setText(m.get_name()); 
     } else { 
      System.out.println("m is null"); 
     } 

     return v; 

    } 

    @Override 
    public Filter getFilter() { 
     if (filter == null) 
      filter = new CustomFilter(); 

     return filter; 
    } 

    private class CustomFilter extends Filter { 
     @Override 
     protected FilterResults performFiltering(CharSequence constraint) { 
      System.out.println("Called it: " + constraint); 
      FilterResults results = new FilterResults(); 
      String prefix = constraint.toString().toLowerCase(); 

      if ((prefix == null) || (prefix.length() == 0)) { 
       ArrayList<RecordsListItem> list = new ArrayList<RecordsListItem>(
         fulllist); 
       results.values = list; 
       results.count = list.size(); 
      } else { 
       final ArrayList<RecordsListItem> list = new ArrayList<RecordsListItem>(
         fulllist); 
       final ArrayList<RecordsListItem> nlist = new ArrayList<RecordsListItem>(); 
       int count = list.size(); 

       for (int i = 0; i < count; i++) { 
        final RecordsListItem pkmn = list.get(i); 
        final String value = pkmn.get_name().toLowerCase(); 

        if (value.contains(prefix)) { 
         nlist.add(pkmn); 
        } 
       } 
       results.values = nlist; 
       results.count = nlist.size(); 
      } 
      return results; 
     } 

     @SuppressWarnings("unchecked") 
     @Override 
     protected void publishResults(CharSequence constraint, 
       FilterResults results) { 
      filtered = (ArrayList<RecordsListItem>) results.values; 

      clear(); 
      int count = filtered.size(); 
      for (int i = 0; i < count; i++) { 
       RecordsListItem pkmn = filtered.get(i); 
       add(pkmn); 
      } 
     } 

    } 

} 

package nl.cuse.crm.adapters; 

import java.util.ArrayList; 

import nl.cuse.crm.R; 
import nl.cuse.crm.objects.lists.ContactListItem; 
import android.content.Context; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.ArrayAdapter; 
import android.widget.Filter; 
import android.widget.TextView; 

public class ContactListAdapter extends ArrayAdapter<ContactListItem> { 
    private ArrayList<ContactListItem> original; 
    private ArrayList<ContactListItem> filtered; 
    private ArrayList<ContactListItem> fulllist; 
    private Filter filter; 
    int resource; 

    public ContactListAdapter(Context context, int textViewResourceId, 
      ArrayList<ContactListItem> items) { 
     super(context, textViewResourceId, items); 
     this.original = items; 
     this.fulllist = new ArrayList<ContactListItem>(items); 
     this.filtered = new ArrayList<ContactListItem>(items); 
     resource = textViewResourceId; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 

     View v = convertView; 

     if (v == null) { 
      LayoutInflater inflater = (LayoutInflater) getContext() 
        .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      v = inflater.inflate(R.layout.custom_list_item_contacts, null); 
     } 

     ContactListItem m = original.get(position); 

     if (m != null) { 

      TextView tt = (TextView) v.findViewById(R.id.rd_text1); 
      TextView tt2 = (TextView) v.findViewById(R.id.rd_text2); 

      if (tt != null) { 
       tt.setText(m.get_firstname() + " " + m.get_lastname()); 
      } 
      if (tt2 != null) { 
       tt2.setText(m.get_title()); 
      } 
     } 

     return v; 

    } 

    @Override 
    public Filter getFilter() { 
     if (filter == null) 
      filter = new CustomFilter(); 

     return filter; 
    } 

    private class CustomFilter extends Filter { 
     @Override 
     protected FilterResults performFiltering(CharSequence constraint) { 
      System.out.println("Called it: " + constraint); 
      FilterResults results = new FilterResults(); 
      String prefix = constraint.toString().toLowerCase(); 

      if ((prefix == null) || (prefix.length() == 0)) { 
       ArrayList<ContactListItem> list = new ArrayList<ContactListItem>(
         fulllist); 
       results.values = list; 
       results.count = list.size(); 
      } else { 
       final ArrayList<ContactListItem> list = new ArrayList<ContactListItem>(
         fulllist); 
       final ArrayList<ContactListItem> nlist = new ArrayList<ContactListItem>(); 
       int count = list.size(); 

       for (int i = 0; i < count; i++) { 
        final ContactListItem pkmn = list.get(i); 
        final String value = pkmn.get_firstname().toLowerCase() 
          + "" + pkmn.get_lastname().toLowerCase(); 

        if (value.contains(prefix)) { 
         nlist.add(pkmn); 
        } 
       } 
       results.values = nlist; 
       results.count = nlist.size(); 
      } 
      return results; 
     } 

     @SuppressWarnings("unchecked") 
     @Override 
     protected void publishResults(CharSequence constraint, 
       FilterResults results) { 
      filtered = (ArrayList<ContactListItem>) results.values; 

      clear(); 
      int count = filtered.size(); 
      for (int i = 0; i < count; i++) { 
       ContactListItem pkmn = filtered.get(i); 
       add(pkmn); 
      } 
     } 

    } 

} 
+0

질문이 모호합니다 (문제를 더 자세히 설명해보십시오). 'rowId'가 부정확하다는 것을 어디에서 알 수 있습니까? 당신의 두 어댑터가 동일한 것을 보면, 타입이'RecordsListItem'과'ContactListItem' 만 다릅니다. – Luksprog

+0

방금 ​​내가 잘못한 것을 발견하고 고쳤습니다. 나는 같은 문제를 가진 다른 사람들을 설명 할 것이다. 필터링하면 목록에 새 색인이 생기므로 목록의 첫 번째 항목은 항상 1 행입니다. listList.get (rowID)로 Listener를 작성했습니다.이 경우 rowID가 변경 될 때 필터가 적용되지 않습니다. 내가이 문제를 해결하기 위해 한 것은 ArrayAdapter의 복사본을 만들고 필터를 사용하여 목록 인덱스를 필터로 변경 한 것입니다. –

+1

답변으로 의견을 게시하고 올바른 것으로 표시하십시오. – Luksprog

답변

0

난 그냥 내가 잘못했다, 그리고 고정 무엇을 발견했다. 나는 같은 문제를 가진 다른 사람들을 설명 할 것이다. 필터링하면 목록에 새 색인이 생기므로 목록의 첫 번째 항목은 항상 1 행입니다. listList.get (rowID)로 Listener를 작성했습니다.이 경우 rowID가 변경 될 때 필터가 적용되지 않습니다. 이 문제를 해결하기 위해 ArrayAdapter 복사본을 만들고 필터를 사용하여 목록 인덱스를 분명히 변경했습니다.

관련 문제