2014-05-02 28 views
21

Faceci Potrzebuję pomocy. Próbowałem implementować SearchView w moim projekcie. Ale mój projekt zawiera listę z niestandardowym adapterem do niej podłączonym. Miejsca ale wszystkie przykłady realizowane przy użyciu arrayadapter..Lets że mam klasę Employee i zawiera imię i wiek fields..How aby filtrować pracowników przy użyciu tylko ich nazwa ..SearchView In ListView o niestandardowym adapterze

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; 
     } 


    } 

i to jest mój klasa adaptera, która rozszerza 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 w Advance ..

Odpowiedz

47

wypróbować ten sposób nadzieję, że to pomoże ...

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: W moim przypadku używam ImageView to możliwe, filtr yto – user3265781

+0

, ale jest problem, po przefiltrowaniu, gdy użytkownik kliknie na element na liście filtrowanej, nadal otwiera element z oryginalnej listy.! szukałem rozwiązań i nie mogłem rozwiązać mojego przypadku. –

+0

dziękuję bardzo. to uratowało mój dzień. – Irfan

0

Dobra odpowiedź jest tam, ale nadal istnieją pewne problemy (błędne stanowisko podczas onclick, serchview nakładka tekstowa), jak wspomniano w sekcji komentarza, więc możesz to również zrobić, postępując zgodnie z instrukcjami ing drogę

Reference, aby uzyskać więcej informacji: searchview listview android

Ja testowałem go i nie znaleźć żadnego problemu tak daleko, jeśli znajdziesz dowolny, proszę podać w sekcji komentarzy.

klasa Model: MovieNames.java

public class MovieNames { 
    private String movieName; 

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

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

} 

2: file 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> 
  1. ListViewAdapter.java klasy adaptera do ListView:

    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(); 
        } 
    
        } 
    
  2. MainActivity.Klasa 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

Source Code

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> 

Szczęśliwy Coding

+0

Dzięki za odebranie mnie –