2016-02-24 2 views
0

Я пытаюсь перечислить все установленные приложения и динамически фильтровать результат в виде списка. Ниже мой код в listadapter.java:Невозможно отфильтровать элементы списка просмотра

import java.text.SimpleDateFormat; 
import java.util.ArrayList; 
import java.util.Date; 
import java.util.List; 

import android.app.Activity; 
import android.content.pm.PackageInfo; 
import android.content.pm.PackageManager; 
import android.graphics.drawable.Drawable; 
import android.util.Log; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.BaseAdapter; 
import android.widget.CheckBox; 
import android.widget.Filter; 
import android.widget.Filterable; 
import android.widget.TextView; 

public class Listadapter extends BaseAdapter implements Filterable { 


    List<PackageInfo> packageList; 
    List<PackageInfo> filteredData = null; 
    List<PackageInfo> originalData = null; 
    Activity context; 
    PackageManager packageManager; 
    boolean[] itemChecked; 
    private boolean notifyChanged = true; 
    ItemFilter mFilter = new ItemFilter(); 
LayoutInflater mInflater; 

    public Listadapter(Activity context, List<PackageInfo> packageList, 
         PackageManager packageManager) { 
     super(); 
     this.context = context; 
     this.packageList = packageList; 
     itemChecked = new boolean[packageList.size()]; 
     this.packageManager = packageManager; 


     this.filteredData = packageList; 
     this.originalData = packageList; 
     mInflater = LayoutInflater.from(context); 

    } 




    private class ViewHolder { 
     TextView apkName; 
     CheckBox ck1; 
    } 

    public int getCount() { 
     if(filteredData==null){ 
      Log.v("LOG", "Warn, null filteredData"); 
      return 0; 
     }else{ 
      return filteredData.size(); 
     } 
    } 

    public Object getItem(int position) { 
     return filteredData.get(position); 
    } 



    public long getItemId(int position) { 
     return 0; 
    } 

    @Override 
    public View getView(final int position, View convertView, ViewGroup parent) { 
     final ViewHolder holder; 

     LayoutInflater inflater = context.getLayoutInflater(); 

     if (convertView == null) { 
      convertView = mInflater.inflate(R.layout.list_item, null); 
      holder = new ViewHolder(); 

      holder.apkName = (TextView) convertView 
        .findViewById(R.id.textView1); 
      // holder.ck1 = (CheckBox) convertView 
      //  .findViewById(R.id.checkBox1); 

      convertView.setTag(holder); 

     } else { 

      holder = (ViewHolder) convertView.getTag(); 
     } 

     PackageInfo packageInfo = (PackageInfo) getItem(position); 

     SimpleDateFormat sdf = new SimpleDateFormat("[yyyy-MM-dd]"); 


     Drawable appIcon = packageManager 
       .getApplicationIcon(packageInfo.applicationInfo); 
     //String packageName = packageInfo.packageName; 

     String appName = packageManager.getApplicationLabel(
       packageInfo.applicationInfo).toString() + "\n" + sdf.format(new Date(packageInfo.firstInstallTime)); 
     // String appName = packageManager.getApplicationLabel(
     //    packageInfo.applicationInfo).toString()+ "\n" + packageInfo.packageName ; 

       appIcon.setBounds(0, 0, 150, 150); 
     holder.apkName.setCompoundDrawables(appIcon, null, null, null); 
     holder.apkName.setCompoundDrawablePadding(15); 
     holder.apkName.setText(appName); 
     // holder.apkName.setText(packageName); 
     // holder.ck1.setChecked(false); 

     // if (itemChecked[position]) 
     //  holder.ck1.setChecked(true); 
     // else 
     // holder.ck1.setChecked(false); 
/* 
     holder.ck1.setOnClickListener(new OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       // TODO Auto-generated method stub 
       if (holder.ck1.isChecked()) 
        itemChecked[position] = true; 
       else 
        itemChecked[position] = false; 
      } 
     }); 

     if (itemChecked != null) { 

     } 
*/ 
     return convertView; 

    } 

    //////search filter 

    @Override 
    public Filter getFilter() { 
     return mFilter; 
    } 

    private class ItemFilter extends Filter { 
     @Override 
     protected FilterResults performFiltering(CharSequence constraint) { 

      String filterString = constraint.toString().toLowerCase(); 

      FilterResults results = new FilterResults(); 

      final List<PackageInfo> list = originalData; 

      int count = packageList.size(); 
      final ArrayList<PackageInfo> nlist = new ArrayList<>(count); 

      PackageInfo filterableString; 

      for (int i = 0; i < count; i++) { 
       filterableString = list.get(i); 
       if (filterString.toLowerCase().contains(filterString)) { 
        nlist.add(filterableString); 
       } 
      } 

      results.values = nlist; 
      results.count = nlist.size(); 

      return results; 
     } 

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

    } 


    ///filter finished 


} 

В MainActivity.java, у меня есть ниже код, чтобы действовать на SearchView внутри OnCreate:

final Listadapter Adapter = new Listadapter(this, (ArrayList<PackageInfo>) packageList1, packageManager); 

     apps.setAdapter(Adapter); 


     //enables filtering for the contents of the given ListView 
     apps.setTextFilterEnabled(true); 

     final SearchView sv = (SearchView) findViewById(R.id.inputSearch); 



     sv.setOnQueryTextListener(new SearchView.OnQueryTextListener() { 


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

      @Override 
      public boolean onQueryTextChange(String text) { 

       Adapter.getFilter().filter(text); 
       return false; 
      } 
     }); 

При вводе текста в SearchView, он делает ничего. Он не фильтрует элементы списка или не дает никаких ошибок.

+0

Это меню действий в меню поиска или отдельного вида активности insdie? –

+0

Вы проверили этот ответ http://stackoverflow.com/questions/14038331/android-searchview-filter-listview/14038461#14038461? – Greensy

+0

Это отдельный вид внутри деятельности макет т.е.

ответ

0

Почему вы используете три arraylist. два достаточно. удалить packageList

Вы возвращаете true для OnQueryTextSubmit.

searchView.setQueryHint("Search"); 
      searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() { 
       @Override 
       public boolean onQueryTextSubmit(String query) { 
        return false; 
       } 

       @Override 
       public boolean onQueryTextChange(String newText) { 


        if (adapter != null && newText != null) { 
         adapter.getFilter().filter(newText); 

         return true; 
        } 

        return false; 
       } 


      }); 

и вы не сравниваете имя приложения с поисковым текстом и не приводите результаты к списку.

@Override 
     protected FilterResults performFiltering(CharSequence constraint) { 

      String constraintStr = constraint.toString().toLowerCase(Locale.getDefault()); 
      FilterResults result = new FilterResults(); 

      if (constraintStr != null & constraintStr.length() > 0) { 
       ArrayList<PackageInfo> filterItems = new ArrayList< PackageInfo>(); 

       synchronized (this) { 
        for (PackageInfo item : originalData) { 
         if (packageManager.getApplicationLabel(
      item.applicationInfo).toLowerCase(Locale.getDefault()).contains(constraintStr)) { 
          filterItems.add(item); 
         } 
        } 
        result.count = filterItems.size(); 
        result.values = filterItems; 
       } 
      } else { 
       synchronized (this) { 
        result.count = originalData.size(); 
        result.values = originalData; 
       } 
      } 
      return result; 


     } 

     @Override 
     protected void publishResults(CharSequence constraint, FilterResults results) { 
      filteredData = (ArrayList<PackageInfo>) results.values; 

      // Debug.e("filteredData", "" + filteredData.toString()); 
      notifyDataSetChanged(); 
     } 

    } 
+0

Большое спасибо Sree Reddy Menon. Теперь я могу правильно фильтровать элементы списка. Быстрый вопрос, если я хочу добавить отфильтрованный элемент в массив при нажатии на него, как я могу получить его имя пакета? С get (int), он получает исходные позиции в соответствующих позициях, но я хочу отфильтрованный элемент. –

+0

Я тебя не понял. Вы хотите отфильтровать элементы или выбранный элемент из списка при нажатии на Listview. ? –

+1

жаль насчет путаницы. Я достиг того, что искал, и правильно выбрал фильтрованные элементы. Большое спасибо за вашу помощь :-) –