2013-12-19 56 views
1

这是我的主要活动的.java[Android]如何仅对名字和姓氏进行搜索?

package com.example.search; 

import java.util.ArrayList; 
import java.util.Arrays; 
import java.util.HashMap; 
import java.util.Iterator; 
import java.util.List; 

import android.app.Activity; 
import android.content.Context; 
import android.os.Bundle; 
import android.support.v4.app.FragmentActivity; 
import android.text.Editable; 
import android.text.TextWatcher; 
import android.widget.ArrayAdapter; 
import android.widget.EditText; 
import android.widget.Filter; 
import android.widget.ListView; 

public User getUserByName(String firstName, String lastName) { 
    synchronized (userList) { 
     Iterator<User> iterator = userList.iterator(); 
     while (iterator.hasNext()) { 
      User user = (User) iterator.next(); 
      if (user.getFirstName().equals(firstName) 
        && user.getLastName().equals(lastName)) { 
       return user; 
      } 
     } 
     // no user found 
     return null; 
    } 
} 


public class MainActivity extends FragmentActivity { 
    private EditText firstNameEditText; 
    private EditText lastNameEditText; 
    private UserListAdapter<User> adapter; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     firstNameEditText = (EditText) findViewById(R.id.firstNameEditText); 
     lastNameEditText = (EditText) findViewById(R.id.lastNameEditText); 
     final ListView listView = (ListView) findViewById(R.id.listView); 
     ArrayList<User> usersList = new ArrayList<User>(); 
     // add items to list 
     adapter = new UserListAdapter<User>(this, 
       R.layout.textview_layout, usersList); 
     listView.setAdapter(adapter); 
     firstNameEditText.setOnFocusChangeListener(new View.OnFocusChangeListener() { 

      @Override 
      public void onFocusChange(View v, boolean hasFocus) { 
       if(hasFocus) { 
        adapter.setFilterMode(UserListAdapter.MODE_FILTER_BY_FIRST_NAME); 
       } 
      } 
     }); 
     lastNameEditText.setOnFocusChangeListener(new View.OnFocusChangeListener() { 

      @Override 
      public void onFocusChange(View v, boolean hasFocus) { 
       if(hasFocus) { 
        adapter.setFilterMode(UserListAdapter.MODE_FILTER_BY_LAST_NAME); 
       } 
      } 
     }); 
     TextWatcher textWatcher = new TextWatcher() { 

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

      } 

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

      } 

      @Override 
      public void afterTextChanged(Editable s) { 
       adapter.getFilter().filter(s.toString()); 
      } 
     }; 

     firstNameEditText.addTextChangedListener(textWatcher); 
     lastNameEditText.addTextChangedListener(textWatcher); 
    } 

    public static class UserListAdapter<T> extends ArrayAdapter<T> { 
     public static final int MODE_FILTER_BY_FIRST_NAME = 0xFEED; 
     public static final int MODE_FILTER_BY_LAST_NAME = 0xDEAF; 
     private List<T> objects; 
     private int filterMode; 

     public UserListAdapter(Context context, int textViewResourceId, 
       List<T> objects) { 
      super(context, textViewResourceId, objects); 
      init(objects); 
     } 

     public UserListAdapter(Context context, int resource, 
       int textViewResourceId, T[] objects) { 
      super(context, resource, textViewResourceId, objects); 
      init(Arrays.asList(objects)); 
     } 

     private void init(List<T> objects) { 
      this.objects = objects; 
     } 

     public UserListAdapter(Context context, int resource, 
       int textViewResourceId, List<T> objects) { 
      super(context, resource, textViewResourceId, objects); 
      init(objects); 
     } 

     public UserListAdapter(Context context, int resource, 
       int textViewResourceId) { 
      super(context, resource, textViewResourceId); 
     } 

     public UserListAdapter(Context context, int resource) { 
      super(context, resource); 
     } 

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

       @Override 
       protected void publishResults(CharSequence constraint, 
         FilterResults results) { 
        UserListAdapter.this.clear(); 
        ArrayList<T> list = (ArrayList<T>) results.values; 
        UserListAdapter.this.addAll(list); 
        if (results.count > 0) { 
         notifyDataSetChanged(); 
        } else { 
         notifyDataSetInvalidated(); 
        } 
       } 

       @Override 
       protected synchronized FilterResults performFiltering(
         CharSequence constraint) { 
        FilterResults results = new FilterResults(); 
        ArrayList<T> list = new ArrayList<T>(); 
        Iterator<T> iterator = objects.iterator(); 
        while (iterator.hasNext()) { 
         T t = (T) iterator.next(); 
         User user = (User) t; 
         String s = null; 
         if (filterMode == MODE_FILTER_BY_FIRST_NAME) { 
          s = user.getFirstName(); 
         } else if (filterMode == MODE_FILTER_BY_LAST_NAME) { 
          s = user.getLastName(); 
         } 
         if (s.equals(constraint.toString())) { 
          list.add(t); 
         } 
        } 
        results.values = list; 
        results.count = list.size(); 
        return results; 
       } 
      }; 
     } 

     public int getFilterMode() { 
      return filterMode; 
     } 

     public void setFilterMode(int filterMode) { 
      this.filterMode = filterMode; 
     } 
    } 

    public static class User { 
     // attributes 
     private String accountID; 
     private String companyName; 
     private String designation; 
     private String firstName; 
     private String lastName; 
     private String profileimageBLOB; 

     // behaviors 
     public User() // default constructor 
     { 
      // attributes will be initialized to their default values 
     } 

     public User(String accID, String comName, String design, String fName, 
       String lName, String image) // parameterized constructor 
     { 
      accountID = accID; 
      companyName = comName; 
      designation = design; 
      firstName = fName; 
      lastName = lName; 
      profileimageBLOB = image; 
     } 

     // set and get methods 
     public void setAccountID(String accID) { 
      accountID = accID; 
     } 

     public String getAccountID() { 
      return accountID; 
     } 

     public void setCompanyName(String comName) { 
      companyName = comName; 
     } 

     public String getCompanyName() { 
      return companyName; 
     } 

     public void setDesignation(String design) { 
      designation = design; 
     } 

     public String getDesignation() { 
      return designation; 
     } 

     public void setFirstName(String fName) { 
      firstName = fName; 
     } 

     public String getFirstName() { 
      return firstName; 
     } 

     public void setLastName(String lName) { 
      lastName = lName; 
     } 

     public String getLastName() { 
      return lastName; 
     } 

     public void setProfileImage(String image) { 
      profileimageBLOB = image; 
     } 

     public String getProfileImage() { 
      return firstName; 
     } 

     // toString() method 
     public String toString() { 
      return accountID + "\t" + companyName + "\t" + designation + "\t\t" 
        + firstName + "\t" + lastName + "\t" + profileimageBLOB; 
     } 
    } 

我做出相应的调整,以@Gopal饶,这是我上面的代码,但是我面对了很多的错误,我无法理解,我在做正确吗?

请指教,但仍然没有工作

+0

什么叫整个字符串是什么意思? –

+0

你的搜索逻辑/方法在哪里? – TheLostMind

+0

他可能是指“而不是toString()方法”。至于解决方案,@GopalRao的答案将适用于完全匹配。 – NitroNbg

回答

5

试试这个...

public User getUserByName(String firstName, String lastName) { 
    synchronized (userList) { 
     Iterator<User> iterator = userList.iterator(); 
     while (iterator.hasNext()) { 
      User user = (User) iterator.next(); 
      if (user.getFirstName().equals(firstName) 
        && user.getLastName().equals(lastName)) { 
       return user; 
      } 
     } 
     // no user found 
     return null; 
    } 
} 


public class MainActivity extends FragmentActivity { 
    private EditText firstNameEditText; 
    private EditText lastNameEditText; 
    private UserListAdapter<User> adapter; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     firstNameEditText = (EditText) findViewById(R.id.firstNameEditText); 
     lastNameEditText = (EditText) findViewById(R.id.lastNameEditText); 
     final ListView listView = (ListView) findViewById(R.id.listView); 
     ArrayList<User> usersList = new ArrayList<User>(); 
     // add items to list 
     adapter = new UserListAdapter<User>(this, 
       R.layout.textview_layout, usersList); 
     listView.setAdapter(adapter); 
     firstNameEditText.setOnFocusChangeListener(new View.OnFocusChangeListener() { 

      @Override 
      public void onFocusChange(View v, boolean hasFocus) { 
       if(hasFocus) { 
        adapter.setFilterMode(UserListAdapter.MODE_FILTER_BY_FIRST_NAME); 
       } 
      } 
     }); 
     lastNameEditText.setOnFocusChangeListener(new View.OnFocusChangeListener() { 

      @Override 
      public void onFocusChange(View v, boolean hasFocus) { 
       if(hasFocus) { 
        adapter.setFilterMode(UserListAdapter.MODE_FILTER_BY_LAST_NAME); 
       } 
      } 
     }); 
     TextWatcher textWatcher = new TextWatcher() { 

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

      } 

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

      } 

      @Override 
      public void afterTextChanged(Editable s) { 
       adapter.getFilter().filter(s.toString()); 
      } 
     }; 

     firstNameEditText.addTextChangedListener(textWatcher); 
     lastNameEditText.addTextChangedListener(textWatcher); 
    } 

    public static class UserListAdapter<T> extends ArrayAdapter<T> { 
     public static final int MODE_FILTER_BY_FIRST_NAME = 0xFEED; 
     public static final int MODE_FILTER_BY_LAST_NAME = 0xDEAF; 
     private List<T> objects; 
     private int filterMode; 

     public UserListAdapter(Context context, int textViewResourceId, 
       List<T> objects) { 
      super(context, textViewResourceId, objects); 
      init(objects); 
     } 

     public UserListAdapter(Context context, int resource, 
       int textViewResourceId, T[] objects) { 
      super(context, resource, textViewResourceId, objects); 
      init(Arrays.asList(objects)); 
     } 

     private void init(List<T> objects) { 
      this.objects = objects; 
     } 

     public UserListAdapter(Context context, int resource, 
       int textViewResourceId, List<T> objects) { 
      super(context, resource, textViewResourceId, objects); 
      init(objects); 
     } 

     public UserListAdapter(Context context, int resource, 
       int textViewResourceId) { 
      super(context, resource, textViewResourceId); 
     } 

     public UserListAdapter(Context context, int resource) { 
      super(context, resource); 
     } 

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

       @Override 
       protected void publishResults(CharSequence constraint, 
         FilterResults results) { 
        UserListAdapter.this.clear(); 
        ArrayList<T> list = (ArrayList<T>) results.values; 
        UserListAdapter.this.addAll(list); 
        if (results.count > 0) { 
         notifyDataSetChanged(); 
        } else { 
         notifyDataSetInvalidated(); 
        } 
       } 

       @Override 
       protected synchronized FilterResults performFiltering(
         CharSequence constraint) { 
        FilterResults results = new FilterResults(); 
        ArrayList<T> list = new ArrayList<T>(); 
        Iterator<T> iterator = objects.iterator(); 
        while (iterator.hasNext()) { 
         T t = (T) iterator.next(); 
         User user = (User) t; 
         String s = null; 
         if (filterMode == MODE_FILTER_BY_FIRST_NAME) { 
          s = user.getFirstName(); 
         } else if (filterMode == MODE_FILTER_BY_LAST_NAME) { 
          s = user.getLastName(); 
         } 
         if (s.equals(constraint.toString())) { 
          list.add(t); 
         } 
        } 
        results.values = list; 
        results.count = list.size(); 
        return results; 
       } 
      }; 
     } 

     public int getFilterMode() { 
      return filterMode; 
     } 

     public void setFilterMode(int filterMode) { 
      this.filterMode = filterMode; 
     } 
    } 

    public static class User { 
     // attributes 
     private String accountID; 
     private String companyName; 
     private String designation; 
     private String firstName; 
     private String lastName; 
     private String profileimageBLOB; 

     // behaviors 
     public User() // default constructor 
     { 
      // attributes will be initialized to their default values 
     } 

     public User(String accID, String comName, String design, String fName, 
       String lName, String image) // parameterized constructor 
     { 
      accountID = accID; 
      companyName = comName; 
      designation = design; 
      firstName = fName; 
      lastName = lName; 
      profileimageBLOB = image; 
     } 

     // set and get methods 
     public void setAccountID(String accID) { 
      accountID = accID; 
     } 

     public String getAccountID() { 
      return accountID; 
     } 

     public void setCompanyName(String comName) { 
      companyName = comName; 
     } 

     public String getCompanyName() { 
      return companyName; 
     } 

     public void setDesignation(String design) { 
      designation = design; 
     } 

     public String getDesignation() { 
      return designation; 
     } 

     public void setFirstName(String fName) { 
      firstName = fName; 
     } 

     public String getFirstName() { 
      return firstName; 
     } 

     public void setLastName(String lName) { 
      lastName = lName; 
     } 

     public String getLastName() { 
      return lastName; 
     } 

     public void setProfileImage(String image) { 
      profileimageBLOB = image; 
     } 

     public String getProfileImage() { 
      return firstName; 
     } 

     // toString() method 
     public String toString() { 
      return accountID + "\t" + companyName + "\t" + designation + "\t\t" 
        + firstName + "\t" + lastName + "\t" + profileimageBLOB; 
     } 
    } 
} 

有关同步的照顾......

+0

这不是搜索功能。它从列表中删除项目。 **你能解释一下,如果用户从Edittext中删除所有文本会发生什么。它显示所有项目的前一个列表? –

+0

@MdAbdulGafur thanx,编辑答案... –

+0

谢谢,它只返回一个用户,但如果两个用户名有姓和名和两个字符相同。 ListView是由用户数组的List不是一个单独的对象。 此外,你不告诉我显示他更新ListView中的userList,这里需要调用这个函数。 请再次编辑您的答案并提供更多信息。 –

0

你需要做的,然后自定义搜索你需要添加自定义ListView搜索功能。

这是一个很大的例子,我给你这个链接。我认为它可以帮助你。

Link

感谢

0

你需要重写getFilter在适配器类中的方法perforFiltering使用 一些迭代方法获取数据的适当列表。

请按照以下link