2014-05-02 62 views
21

夥計們我需要一些幫助。我一直在試圖在我的項目中實現一個SearchView,但是我的項目包含一個帶有自定義適配器的列表視圖。我搜索了很多網站,但使用arrayadapter..Lets實施都有例子說,我有一個Employee類,它包含的名字和年齡fields..How到我只使用其名稱篩選員工..SearchView在ListView中有一個自定義適配器

public class MainActivity extends Activity implements SearchView.OnQueryTextListener 
{ 
SearchView mSearchView; 
ListView mListView; 
//String mStrings[]= {"abc","def","efg","ghi","ijk","apple","agxhsdgc","abbbcc"}; 
ArrayList<Employee> emp_list=null; 
EmployeeAdapter emp_adapter=null; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     mSearchView=(SearchView) findViewById(R.id.searchView1); 
     mListView=(ListView) findViewById(R.id.listView1); 

     emp_list=new ArrayList<Employee>(); 
     emp_list.add(new Employee("ABC", 24)); 
     emp_list.add(new Employee("ACB", 24)); 
     emp_list.add(new Employee("BVF", 28)); 
     emp_list.add(new Employee("BRT", 28)); 
     emp_list.add(new Employee("ANM", 23)); 

     emp_adapter=new EmployeeAdapter(MainActivity.this, emp_list); 
     mListView.setAdapter(emp_adapter); 

//  mListView.setAdapter(new ArrayAdapter<String>(this, 
//    android.R.layout.simple_list_item_1, 
//    mStrings)); 
     mListView.setTextFilterEnabled(true); 
     setupSearchView(); 


    } 
    private void setupSearchView() 
    { 
      mSearchView.setIconifiedByDefault(false); 
      mSearchView.setOnQueryTextListener(this); 
      mSearchView.setSubmitButtonEnabled(true); 
      mSearchView.setQueryHint("Search Here"); 
     } 

     @Override 
     public boolean onQueryTextChange(String newText) 
     { 

      if (TextUtils.isEmpty(newText.toString())) { 
       mListView.clearTextFilter(); 
      } else { 
       mListView.setFilterText(newText.toString()); 
      } 
      return true; 
     } 

     @Override 
     public boolean onQueryTextSubmit(String query) 
     { 
      return false; 
     } 


    } 

,這是我的適配器類擴展BaseAdapter ..

public class EmployeeAdapter extends BaseAdapter { 

    Context ctx; 
    ArrayList<Employee> emp_list; 
    LayoutInflater linf=null; 
    EmployeeHolder holder=null; 






    public EmployeeAdapter(Context ctx, ArrayList<Employee> emp_list) { 
     super(); 
     this.ctx = ctx; 
     this.emp_list = emp_list; 
     linf=(LayoutInflater) ctx.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    } 

    public class EmployeeHolder 
    { 
     TextView name; 
     TextView age; 

    } 



    @Override 
    public int getCount() { 
     // TODO Auto-generated method stub 
     return emp_list.size(); 
    } 

    @Override 
    public Object getItem(int position) { 
     // TODO Auto-generated method stub 
     return emp_list.get(position); 
    } 

    @Override 
    public long getItemId(int position) { 
     // TODO Auto-generated method stub 
     return position; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     // TODO Auto-generated method stub 

     if(convertView==null) 
     { 
      convertView=linf.inflate(R.layout.row, parent, false); 
      holder=new EmployeeHolder(); 
      holder.name=(TextView) convertView.findViewById(R.id.name); 
      holder.age=(TextView) convertView.findViewById(R.id.age); 

      convertView.setTag(holder); 
     } 
     else 
     { 
      holder=(EmployeeHolder) convertView.getTag(); 
     } 

     Employee e=(Employee) getItem(position); 


     holder.name.setText(e.getName()); 
     holder.age.setText(String.valueOf(e.getAge())); 

     return convertView; 

    } 

} 

Th anks提前..

回答

47

試試這個辦法,希望這將幫助你......

activity_main.xml中

<SearchView 
     android:id="@+id/searchView1" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content"/> 


    <ListView 
     android:id="@+id/listView1" 
     android:layout_width="match_parent" 
     android:layout_height="0dp" 
     android:layout_weight="1"/> 


</LinearLayout> 

row.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <TextView 
     android:id="@+id/txtName" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" /> 

    <TextView 
     android:id="@+id/txtAge" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_marginTop="5dp"/> 

</LinearLayout> 

MainActivity.java

public class MainActivity extends Activity implements SearchView.OnQueryTextListener 
{ 
    private SearchView mSearchView; 
    private ListView mListView; 
    private ArrayList<Employee> employeeArrayList; 
    private EmployeeAdapter employeeAdapter; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     mSearchView=(SearchView) findViewById(R.id.searchView1); 
     mListView=(ListView) findViewById(R.id.listView1); 

     employeeArrayList=new ArrayList<Employee>(); 
     employeeArrayList.add(new Employee("ABC", 24)); 
     employeeArrayList.add(new Employee("ACB", 24)); 
     employeeArrayList.add(new Employee("BVF", 28)); 
     employeeArrayList.add(new Employee("BRT", 28)); 
     employeeArrayList.add(new Employee("ANM", 23)); 

     employeeAdapter=new EmployeeAdapter(MainActivity.this, employeeArrayList); 
     mListView.setAdapter(employeeAdapter); 

     mListView.setTextFilterEnabled(true); 
     setupSearchView(); 


    } 
    private void setupSearchView() 
    { 
     mSearchView.setIconifiedByDefault(false); 
     mSearchView.setOnQueryTextListener(this); 
     mSearchView.setSubmitButtonEnabled(true); 
     mSearchView.setQueryHint("Search Here"); 
    } 

    @Override 
    public boolean onQueryTextChange(String newText) 
    { 

     if (TextUtils.isEmpty(newText)) { 
      mListView.clearTextFilter(); 
     } else { 
      mListView.setFilterText(newText); 
     } 
     return true; 
    } 

    @Override 
    public boolean onQueryTextSubmit(String query) 
    { 
     return false; 
    } 


} 

EmployeeAdapter.java

public class EmployeeAdapter extends BaseAdapter implements Filterable { 

    public Context context; 
    public ArrayList<Employee> employeeArrayList; 
    public ArrayList<Employee> orig; 

    public EmployeeAdapter(Context context, ArrayList<Employee> employeeArrayList) { 
     super(); 
     this.context = context; 
     this.employeeArrayList = employeeArrayList; 
    } 


    public class EmployeeHolder 
    { 
     TextView name; 
     TextView age; 
    } 

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

      @Override 
      protected FilterResults performFiltering(CharSequence constraint) { 
       final FilterResults oReturn = new FilterResults(); 
       final ArrayList<Employee> results = new ArrayList<Employee>(); 
       if (orig == null) 
        orig = employeeArrayList; 
       if (constraint != null) { 
        if (orig != null && orig.size() > 0) { 
         for (final Employee g : orig) { 
          if (g.getName().toLowerCase() 
            .contains(constraint.toString())) 
           results.add(g); 
         } 
        } 
        oReturn.values = results; 
       } 
       return oReturn; 
      } 

      @SuppressWarnings("unchecked") 
      @Override 
      protected void publishResults(CharSequence constraint, 
              FilterResults results) { 
       employeeArrayList = (ArrayList<Employee>) results.values; 
       notifyDataSetChanged(); 
      } 
     }; 
    } 

    public void notifyDataSetChanged() { 
     super.notifyDataSetChanged(); 
    } 


    @Override 
    public int getCount() { 
     return employeeArrayList.size(); 
    } 

    @Override 
    public Object getItem(int position) { 
     return employeeArrayList.get(position); 
    } 

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

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     EmployeeHolder holder; 
     if(convertView==null) 
     { 
      convertView=LayoutInflater.from(context).inflate(R.layout.row, parent, false); 
      holder=new EmployeeHolder(); 
      holder.name=(TextView) convertView.findViewById(R.id.txtName); 
      holder.age=(TextView) convertView.findViewById(R.id.txtAge); 
      convertView.setTag(holder); 
     } 
     else 
     { 
      holder=(EmployeeHolder) convertView.getTag(); 
     } 

     holder.name.setText(employeeArrayList.get(position).getName()); 
     holder.age.setText(String.valueOf(employeeArrayList.get(position).getAge())); 

     return convertView; 

    } 

} 

Employee.java

public class Employee { 

    private String name; 
    private int age; 

    public Employee(String name,int age){ 
     this.name = name; 
     this.age = age; 
    } 

    public String getName(){ 
     return name; 
    } 

    public int getAge(){ 
     return age; 
    } 
} 
+0

@Haresh:對我來說,我使用的ImageView,纔有可能一拖過濾器 – user3265781

+0

但有一個問題,過濾後,當用戶點擊過濾列表中的項目,它仍然從原始列表中打開項目。我GOOGLE了,找到解決方案,但無法解決我的情況。 –

+0

非常感謝。它拯救了我的一天。 – Irfan

0

很好的回答是存在的,但還是有一些問題(錯誤的位置時的onclick,serchview文本疊加),如註釋部分所述,所以您也可以按照以下步驟操作荷蘭國際集團的方式

參考更多的信息:searchview listview android

我已經測試過它,並沒有發現任何問題,到目前爲止,如果你發現任何,請在評論區提。

模型類:MovieNames.java

public class MovieNames { 
    private String movieName; 

    public MovieNames(String movieName) { 
     this.movieName = movieName; 
    } 

    public String getAnimalName() { 
     return this.movieName; 
    } 

} 

2:listview_item.xml文件:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:padding="10dp"> 


    <TextView 
     android:id="@+id/name" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" /> 

</RelativeLayout> 
  • ListViewAdapter.java類列表視圖適配器:

    import android.content.Context; 
        import android.view.LayoutInflater; 
        import android.view.View; 
        import android.view.ViewGroup; 
        import android.widget.BaseAdapter; 
        import android.widget.TextView; 
        import java.util.ArrayList; 
        import java.util.Locale; 
    
    
    
    public class ListViewAdapter extends BaseAdapter { 
    
    // Declare Variables 
    
    Context mContext; 
    LayoutInflater inflater; 
    private ArrayList<MovieNames> arraylist; 
    
    public ListViewAdapter(Context context) { 
        mContext = context; 
        inflater = LayoutInflater.from(mContext); 
        this.arraylist = new ArrayList<MovieNames>(); 
        this.arraylist.addAll(MainActivity.movieNamesArrayList); 
    } 
    
    public class ViewHolder { 
        TextView name; 
    } 
    
    @Override 
    public int getCount() { 
        return MainActivity.movieNamesArrayList.size(); 
    } 
    
    @Override 
    public MovieNames getItem(int position) { 
        return MainActivity.movieNamesArrayList.get(position); 
    } 
    
    @Override 
    public long getItemId(int position) { 
        return position; 
    } 
    
    public View getView(final int position, View view, ViewGroup parent) { 
        final ViewHolder holder; 
        if (view == null) { 
         holder = new ViewHolder(); 
         view = inflater.inflate(R.layout.listview_item, null); 
         // Locate the TextViews in listview_item.xml 
         holder.name = (TextView) view.findViewById(R.id.name); 
         view.setTag(holder); 
        } else { 
         holder = (ViewHolder) view.getTag(); 
        } 
        // Set the results into TextViews 
        holder.name.setText(MainActivity.movieNamesArrayList.get(position).getAnimalName()); 
        return view; 
    } 
    
    // Filter Class 
    public void filter(String charText) { 
        charText = charText.toLowerCase(Locale.getDefault()); 
        MainActivity.movieNamesArrayList.clear(); 
        if (charText.length() == 0) { 
         MainActivity.movieNamesArrayList.addAll(arraylist); 
        } else { 
         for (MovieNames wp : arraylist) { 
          if (wp.getAnimalName().toLowerCase(Locale.getDefault()).contains(charText)) { 
           MainActivity.movieNamesArrayList.add(wp); 
          } 
         } 
        } 
        notifyDataSetChanged(); 
        } 
    
        } 
    
  • MainActivity。java類:

     import android.support.v7.app.AppCompatActivity; 
         import android.os.Bundle; 
         import android.view.View; 
         import android.widget.AdapterView; 
         import android.widget.ListView; 
         import android.widget.SearchView; 
         import android.widget.Toast; 
         import java.util.ArrayList; 
    
         public class MainActivity extends AppCompatActivity implements SearchView.OnQueryTextListener { 
    
         // Declare Variables 
        private ListView list; 
        private ListViewAdapter adapter; 
        private SearchView editsearch; 
         private String[] moviewList; 
        public static ArrayList<MovieNames> movieNamesArrayList = new ArrayList<MovieNames>(); 
    
         @Override 
        public void onCreate(Bundle savedInstanceState) { 
         super.onCreate(savedInstanceState); 
         setContentView(R.layout.activity_main); 
    
    // Generate sample data 
    
    moviewList = new String[]{"Xmen", "Titanic", "Captain America", 
         "Iron man", "Rocky", "Transporter", "Lord of the rings", "The jungle book", 
         "Tarzan","Cars","Shreck"}; 
    
    // Locate the ListView in listview_main.xml 
    list = (ListView) findViewById(R.id.listview); 
    
    movieNamesArrayList = new ArrayList<>(); 
    
    for (int i = 0; i < moviewList.length; i++) { 
        MovieNames movieNames = new MovieNames(moviewList[i]); 
        // Binds all strings into an array 
        movieNamesArrayList.add(movieNames); 
    } 
    
    // Pass results to ListViewAdapter Class 
    adapter = new ListViewAdapter(this); 
    
    // Binds the Adapter to the ListView 
    list.setAdapter(adapter); 
    
    // Locate the EditText in listview_main.xml 
    editsearch = (SearchView) findViewById(R.id.search); 
    editsearch.setOnQueryTextListener(this); 
    
    list.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
        @Override 
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
         Toast.makeText(MainActivity.this, movieNamesArrayList.get(position).getAnimalName(), Toast.LENGTH_SHORT).show(); 
        } 
    }); 
          } 
    
        @Override 
        public boolean onQueryTextSubmit(String query) { 
    
           return false; 
        } 
    
    
    
        @Override 
        public boolean onQueryTextChange(String newText) { 
          String text = newText; 
          adapter.filter(text); 
         return false; 
        } 
        } 
    
  • 1

    源代碼

    https://drive.google.com/open?id=0BzBKpZ4nzNzUOFlxeHhuWmF0Q1U

    package example.abhiandroid.searchviewexample; 
    
    import android.database.Cursor; 
    import android.os.Bundle; 
    import android.support.v7.app.AppCompatActivity; 
    import android.util.Log; 
    import android.widget.ListView; 
    import android.widget.SearchView; 
    
    import java.util.ArrayList; 
    
    public class SearchViewActivity extends AppCompatActivity implements SearchView.OnQueryTextListener { 
    
        // Declare Variables 
        ListView list; 
        ListViewAdapter adapter; 
        public static SearchView editsearch; 
        String[] animalNameList; 
        ArrayList<AnimalNames> arraylist = new ArrayList<AnimalNames>(); 
    
        @Override 
        public void onCreate(Bundle savedInstanceState) { 
         super.onCreate(savedInstanceState); 
         setContentView(R.layout.activity_search); 
         // Generate sample data 
    
         animalNameList = new String[]{"Lion", "Tiger", "Dog", 
           "Cat", "Tortoise", "Rat", "Elephant", "Fox", 
           "Cow","Donkey","Monkey"}; 
    
         // Locate the ListView in listview_main.xml 
         list = (ListView) findViewById(R.id.listview); 
    
         for (int i = 0; i < animalNameList.length; i++) { 
          AnimalNames animalNames = new AnimalNames(animalNameList[i]); 
          // Binds all strings into an array 
          arraylist.add(animalNames); 
         } 
    
         // Pass results to ListViewAdapter Class 
         adapter = new ListViewAdapter(this, arraylist); 
    
         // Binds the Adapter to the ListView 
         list.setAdapter(adapter); 
    
         // Locate the EditText in listview_main.xml 
         editsearch = (SearchView) findViewById(R.id.search); 
         editsearch.setOnQueryTextListener(this); 
    
         editsearch.setOnSuggestionListener(new SearchView.OnSuggestionListener() { 
    
          @Override 
          public boolean onSuggestionSelect(int position) { 
           return true; 
          } 
    
          @Override 
          public boolean onSuggestionClick(int position) { 
           Cursor cursor= editsearch.getSuggestionsAdapter().getCursor(); 
           cursor.moveToPosition(position); 
           String suggestion =cursor.getString(2);//2 is the index of col containing suggestion name. 
           editsearch.setQuery(suggestion,true);//setting suggestion 
           return true; 
          } 
         }); 
    
        } 
    
        @Override 
        public boolean onQueryTextSubmit(String query) { 
         Log.e("keshav","query ->"+query); 
         return false; 
        } 
    
        @Override 
        public boolean onQueryTextChange(String newText) { 
         String text = newText; 
    
         Log.e("keshav","newText ->"+newText); 
    
         adapter.filter(text); 
         return false; 
        } 
    } 
    
    
    package example.abhiandroid.searchviewexample; 
    
    import android.content.Context; 
    import android.util.Log; 
    import android.view.LayoutInflater; 
    import android.view.View; 
    import android.view.ViewGroup; 
    import android.widget.BaseAdapter; 
    import android.widget.TextView; 
    import java.util.ArrayList; 
    import java.util.List; 
    import java.util.Locale; 
    
    public class ListViewAdapter extends BaseAdapter { 
    
        // Declare Variables 
        Context mContext; 
        LayoutInflater inflater; 
        private List<AnimalNames> animalNamesList = null; 
        private ArrayList<AnimalNames> arraylist; 
    
        public ListViewAdapter(Context context, List<AnimalNames> animalNamesList) { 
         mContext = context; 
         this.animalNamesList = animalNamesList; 
         inflater = LayoutInflater.from(mContext); 
         this.arraylist = new ArrayList<AnimalNames>(); 
         this.arraylist.addAll(animalNamesList); 
        } 
    
        public class ViewHolder { 
         TextView name; 
        } 
    
        @Override 
        public int getCount() { 
         return animalNamesList.size(); 
        } 
    
        @Override 
        public AnimalNames getItem(int position) { 
         return animalNamesList.get(position); 
        } 
    
        @Override 
        public long getItemId(int position) { 
         return position; 
        } 
    
        public View getView(final int position, View view, ViewGroup parent) { 
         final ViewHolder holder; 
         if (view == null) { 
          holder = new ViewHolder(); 
          view = inflater.inflate(R.layout.search_list_view_item, null); 
          // Locate the TextViews in search_list_view_itemiew_item.xml 
          holder.name = (TextView) view.findViewById(R.id.name); 
          view.setTag(holder); 
         } else { 
          holder = (ViewHolder) view.getTag(); 
         } 
         // Set the results into TextViews 
    
         holder.name.setText(animalNamesList.get(position).getAnimalName()); 
    
         view.setOnClickListener(new View.OnClickListener() { 
          @Override 
          public void onClick(View v) { 
           Log.e("keshav","click list item ->"+animalNamesList.get(position).getAnimalName()); 
           SearchViewActivity.editsearch.setQuery(animalNamesList.get(position).getAnimalName(), false); 
    
           Log.e("keshav","click size ->"+animalNamesList.size()); 
           // TOdo size always 1 Important See cs Electric Project in Holostik 
           Log.e("keshav","click size ->"+animalNamesList.get(0).getAnimalName()); 
          } 
         }); 
         return view; 
        } 
    
        // Filter Class 
        public void filter(String charText) { 
         charText = charText.toLowerCase(Locale.getDefault()); 
         animalNamesList.clear(); 
         if (charText.length() == 0) { 
          animalNamesList.addAll(arraylist); 
         } else { 
          for (AnimalNames wp : arraylist) { 
           if (wp.getAnimalName().toLowerCase(Locale.getDefault()).contains(charText)) { 
            animalNamesList.add(wp); 
           } 
          } 
         } 
         notifyDataSetChanged(); 
        } 
    
    } 
    
    package example.abhiandroid.searchviewexample; 
    
    public class AnimalNames 
    { 
        private String animalName; 
    
        public AnimalNames(String animalName) { 
         this.animalName = animalName; 
        } 
    
        public String getAnimalName() { 
         return this.animalName; 
        } 
    
    } 
    
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
        android:layout_width="fill_parent" 
        android:layout_height="fill_parent"> 
    
        <SearchView 
         android:id="@+id/search" 
         android:layout_width="fill_parent" 
         android:layout_height="wrap_content" 
         android:iconifiedByDefault="false"> 
    
         <requestFocus /> 
        </SearchView> 
    
        <ListView 
         android:id="@+id/listview" 
         android:layout_width="fill_parent" 
         android:layout_height="fill_parent" 
         android:layout_below="@+id/search" /> 
    
    </RelativeLayout> 
    
    
    list item.xml 
    
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
        android:layout_width="fill_parent" 
        android:layout_height="fill_parent" 
        android:padding="10dp"> 
    
        <TextView 
         android:id="@+id/nameLabel" 
         android:layout_width="wrap_content" 
         android:layout_height="wrap_content" 
         android:text="Animal : " /> 
    
        <TextView 
         android:id="@+id/name" 
         android:layout_width="wrap_content" 
         android:layout_height="wrap_content" 
         android:layout_toRightOf="@+id/nameLabel" /> 
    
    </RelativeLayout> 
    

    編碼快樂

    +0

    感謝您爲我投票 –

    相關問題