2012-08-29 2 views
0

내 목록을 검색하기 위해 목록보기 위에 텍스트 편집을 구현하려고합니다.목록보기의 텍스트 편집 기능이있는 Android Search가 제대로 작동하지 않습니다.

텍스트 편집을 사용한 검색 기능이 작동하지 않는 것은 아니며 다른 고객이 생각할 수있는 고객 이름은 아닙니다. 제발 도와주세요, 아래

내가 포럼에서 많은 예제를 보았다

ublic class ClienteAdapter extends ArrayAdapter<Cliente> {  
public ArrayList<Cliente> original; 
public ArrayList<Cliente> fitems; 
private Filter filter;  

public ClienteAdapter(Context context, int textViewResourceId, 
      ArrayList<Cliente> items) { 
     super(context, textViewResourceId, items); 
     this.original = new ArrayList<Cliente>(items); 
     this.fitems = new ArrayList<Cliente>(items); 

    } 
private class ViewHolder { 
    public TextView ClienteNome;  
    public ImageView ClienteImg; 
} 

public void addItem(final Cliente item) 
{  
    this.original.add(item); 
} 
public View getView(int position, View convertView, ViewGroup parent) 
{ 
    View v = convertView; 
    ViewHolder holder; 
     if (v == null) 
     { 
      LayoutInflater vi = (LayoutInflater)getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      v = vi.inflate(R.layout.clienteitem, null); 
      holder = new ViewHolder(); 
      holder.ClienteNome = (TextView) v.findViewById(R.id.clinome); 
      holder.ClienteImg = (ImageView) v.findViewById(R.id.imagem_plista); 
      v.setTag(holder); 
     } 
     else 
      holder = (ViewHolder)v.getTag();   
     final Cliente cliente = original.get(position); 
     if (cliente != null) { 
      holder.ClienteNome.setText(cliente.getNomeCliente());    
      holder.ClienteImg.setImageResource(cliente.getImagemCliente()); 
     }     
    return v; 
} 
public Filter getFilter() 
{ 
    if (filter == null) 
      filter = new ClassClienteFiltro();  
    return filter; 
} 
private class ClassClienteFiltro extends Filter 
{ 
    @Override 
    protected FilterResults performFiltering(CharSequence constraint) { 
     FilterResults results = new FilterResults(); 
     String prefix = constraint.toString().toLowerCase(); 

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

      for (int i=0; i<count; i++) 
      { 
       final Cliente clienteclass = list.get(i); 
       final String value = clienteclass.getNomeCliente().toLowerCase(); 

       if (value.startsWith(prefix)) 
       { 
        nlist.add(clienteclass); 
       } 
      } 
      results.values = nlist; 
      results.count = nlist.size(); 
     } 
     return results; 
    } 
    @SuppressWarnings("unchecked") 
    @Override 
    protected void publishResults(CharSequence constraint, 
      FilterResults results) { 
     fitems = (ArrayList<Cliente>)results.values; 
     clear(); 
     int count = fitems.size(); 
     for (int i=0; i<count; i++) 
     { 
      Cliente cliente = (Cliente)fitems.get(i); 
      add(cliente); 
     } 
    } 
} 

} 코드

public class MainActivity extends Activity { 

private List<Cliente> listaClientes = null; 
public ClienteAdapter adapter; 
private ArrayList<Cliente> arraycli = new ArrayList<Cliente>(); 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main);  
    ListView lista = (ListView) findViewById(R.id.listView1); 
    arraycli.add(new Cliente("luis", R.drawable.ic_action_search)); 
    arraycli.add(new Cliente("aaaaa", R.drawable.ic_launcher)); 
    arraycli.add(new Cliente("bbbb", R.drawable.ic_launcher)); 
    arraycli.add(new Cliente("ccccc", R.drawable.ic_launcher)); 
    arraycli.add(new Cliente("aaaa", R.drawable.ic_launcher)); 
    arraycli.add(new Cliente("testeeeeee", R.drawable.ic_launcher)); 
    final ClienteAdapter adapter = new ClienteAdapter(this, R.id.listView1, arraycli); 
    lista.setAdapter(adapter); 
    EditText procurar = (EditText) findViewById(R.id.edprocurar); 
    procurar.addTextChangedListener(new TextWatcher() {  
     public void onTextChanged(CharSequence s, int start, int before, int count) { 
      adapter.getFilter().filter(s.toString()); 

     }   
     public void beforeTextChanged(CharSequence s, int start, int count, 
       int after) { 
      // TODO Auto-generated method stub 

     }   
     public void afterTextChanged(Editable s) { 
      // TODO Auto-generated method stub 

     } 
    }); 

} 

}

내 사용자 정의 어댑터입니다,하지만 불행히도 그것을 만들 수 없습니다 100 % 일해라. 도와주세요. 이미 들어 줘서 고마워.

답변

0

나는 내 애플 리케이션에서 비슷한 일을하지만, 어댑터를 사용하여 검색을 수행하는 대신 onTextChanged 메소드 내에서 검색 로직을 수행한다.

사용자가 입력 한 내용에 따라 보조 ArrayList를 만든 다음 업데이트 된 정보로 보조 어댑터를 만드는 방법으로이 작업을 수행 할 수 있습니다.

사용자 유형이 folliwng 할 때마다 :

A. 지우기 보조 ArrayList를합니다.

B. Primary ArrayList를 탐색하고 사용자가 입력 한 것과 일치하는 이름을 검색하십시오.

C.이 항목을 보조 ArrayList에 추가하십시오.

D. 보조 어댑터를 사용하여 새 어댑터를 만듭니다.

E. ListView의 어댑터를 새 것으로 설정하십시오. 내 예에서

arraycliSort = new ArrayList<Cliente>(); //secondary ArrayList 

    yourEditText.addTextChangedListener(new TextWatcher() { 

     public void afterTextChanged(Editable s) { 

     } 

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

     public void onTextChanged(CharSequence s, int start, int before, 
       int count){     

      textlength = yourEditText.getText().length(); 
      arraycliSort.clear(); //A 



      for (int i = 0; i < arraycli.size(); i++) { //B 
       if (textlength <= arraycli.get(i).name.length()) { 
        if (yourEditText.getText().toString().equalsIgnoreCase((String) arraycli.get(i).name.subSequence(0,textlength))) 
        { 
         arraycliSort.add(arraycli.get(i)); //C 
        } 
       } 
      } 

      adapter = new ClientAdapter(this, R.id.listView1, arraycli); //D 
      yourListView.setAdapter(adapter); //E 
     } 
    }); 

난 당신이 당신이 찾고있는 이름에 액세스하는 방법 확실하지 않다, 그래서 (내가) .name을을 arraycli.get 사용, 당신은 필요에 따라 조정해야합니다.

희망이 도움이 될 수 있습니다.

관련 문제