2016-04-16 14 views
0

Ich habe auf this, this also und this one too verwiesen. Nein, wo ich die Lösung meines Problems finde. Auf eingeben Bearbeiten von Text Keine Filterung ist da und Listenansicht bleibt, wie es Hier ist der Code:Suche funktioniert nicht in benutzerdefinierten Listenansicht

MainActivity.java

public class MainActivity extends AppCompatActivity implements OnItemClickListener { 

public static final String[] titles = new String[] { "H C Verma", 
     "P Bahadur", "I E Irodov", "M L Khanna", 
     "O P Tondon", "Morrison & Boyd", "Halliday Resnick", 
     "R D Sharma", "S L Loney", "Hall and Knight", "Krotov", "I A Maron" }; 
public EditText search; 
CustomAdapter adapter; 

public static final String[] descriptions = new String[] { 

     "Physics", 
     "Chemistry", 
     "Physics", 
     "Mathematics", 
     "Chemistry", 
     "Chemistry", 
     "Physics", 
     "Mathematics", 
     "Mathematics", 
     "Chemistry", 
     "Physics", 
     "Mathematics" 

}; 

public static final Integer[] images = { R.drawable.hcv, 
    R.drawable.bahadur, R.drawable.irodov, R.drawable.mlkhanna, 
    R.drawable.tondon, R.drawable.boyd, R.drawable.resnick, R.drawable.sharma, 
    R.drawable.loney, R.drawable.knight, R.drawable.krotov, R.drawable.maron}; 
public static final String[] pub = new String[]{"Bharti Bhavan", "G R Bathla Publications", "Arihant", 
"Jai Prakash Nath", "G R Bathla Publications", "Pearson Publications", 
"Wiley Publications", "Dhanpat Rai Publications","Classic Texts series","Classic Texts series","G K Publications","G K Publications"}; 

ListView listView; 
List<RowItem> rowItems; 

/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    search = (EditText)findViewById(R.id.inputSearch); 

    rowItems = new ArrayList<>(); 
    for (int i = 0; i < titles.length; i++) { 
     RowItem item = new RowItem(images[i], titles[i], descriptions[i], pub[i]); 
     rowItems.add(item); 
    } 

    listView = (ListView) findViewById(R.id.list); 
    adapter = new CustomAdapter(this, rowItems); 
    listView.setAdapter(adapter); 
    listView.setOnItemClickListener(this); 
    listView.setTextFilterEnabled(true); 

    search.addTextChangedListener(new TextWatcher() { 
     @Override 
     public void beforeTextChanged(CharSequence s, int start, int count, int after) { 

     } 

     @Override 
     public void onTextChanged(CharSequence s, int start, int before, int count) { 
      System.out.println("Text ["+s+"]"); 

      adapter.getFilter().filter(s.toString()); 

     } 

     @Override 
     public void afterTextChanged(Editable s) { 

     } 
    }); 
} 

@Override 
public void onItemClick(AdapterView<?> parent, View view, int position, 
         long id) { 
    Toast toast = Toast.makeText(getApplicationContext(), 
      "Item " + (position + 1) + ": " + rowItems.get(position), 
      Toast.LENGTH_SHORT); 
    toast.show(); 
} 

}

CustomAdapter.java

public class CustomAdapter extends BaseAdapter implements Filterable{ 
List<RowItem> filteredData; 
Context context; 
List<RowItem> rowItems; 
CustomFilter filter; 

public CustomAdapter(Context context, List<RowItem> items) { 
    this.context = context; 
    this.rowItems = items; 
    this.filteredData = items; 
} 
@Override 
public int getCount() { 
    return filteredData.size(); 
} 

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

@Override 
public long getItemId(int position) { 
    return rowItems.indexOf(getItem(position)); 
} 



/*private view holder class*/ 
private class ViewHolder { 
    ImageView imageView; 
    TextView txtTitle; 
    TextView txtDesc; 
    TextView pubname; 
} 

public View getView(int position, View convertView, ViewGroup parent) { 
    ViewHolder holder = null; 

    LayoutInflater mInflater = (LayoutInflater) 
      context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE); 
    if (convertView == null) { 
     convertView = mInflater.inflate(R.layout.list_item, parent, false); 
     holder = new ViewHolder(); 
     holder.txtDesc = (TextView) convertView.findViewById(R.id.desc); 
     holder.txtTitle = (TextView) convertView.findViewById(R.id.title); 
     holder.pubname = (TextView) convertView.findViewById(R.id.pub); 
     holder.imageView = (ImageView) convertView.findViewById(R.id.icon); 
     convertView.setTag(holder); 
    } 
    else { 
     holder = (ViewHolder) convertView.getTag(); 
    } 

    RowItem rowItem = (RowItem) getItem(position); 

    holder.txtDesc.setText(rowItem.getDesc()); 
    holder.txtTitle.setText(rowItem.getTitle()); 
    holder.pubname.setText(rowItem.getPub()); 
    holder.imageView.setImageResource(rowItem.getImageId()); 

    return convertView; 
} 
public Filter getFilter() { 
    if(filter == null) 
    { 
     filter=new CustomFilter(); 
    } 

    return filter;} 


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

      FilterResults results = new FilterResults(); 

      if (constraint != null && constraint.length() > 0) { 
       //CONSTARINT TO UPPER 
       constraint = constraint.toString().toUpperCase(); 

       ArrayList<RowItem> filters = new ArrayList<RowItem>(); 

       //get specific items 
       for (int i = 0; i < filteredData.size(); i++) { 
        if (filteredData.get(i).getTitle().toUpperCase().contains(constraint)) { 
         RowItem p = new RowItem(filteredData.get(i).getImageId(), filteredData.get(i).getTitle(), filteredData.get(i).getDesc(), filteredData.get(i).getPub()); 

         filters.add(p); 
        } 
       } 

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

      } else { 
       results.count = filteredData.size(); 
       results.values = filteredData; 

      } 

      return results; 
     } 
     @SuppressWarnings("unchecked") 
     @Override 
     protected void publishResults(CharSequence constraint, FilterResults results) { 
      // TODO Auto-generated method stub 

      if (results.count == 0) { 
       notifyDataSetInvalidated(); 
      } else { 
       rowItems = (ArrayList<RowItem>) results.values; 
       notifyDataSetChanged(); 
      } 
     } 

    }} 

conten t_main.xml

<?xml version="1.0" encoding="utf-8"?> 


<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:layout_marginTop="35dp" 
    android:orientation="vertical" > 
<EditText android:id="@+id/inputSearch" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:layout_marginTop="45dp" 
    android:hint="Search Books.." 
    android:inputType="textVisiblePassword"/> 

<ListView 
     android:id="@+id/list" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:clipToPadding="false" 
     android:padding="20dip" 
     android:listSelector="@drawable/list_selector" 
     /> 

</LinearLayout> 

Bitte helfen Sie mir.

mit ArrayAdapter

public class CustomAdapter extends ArrayAdapter<RowItem> implements Filterable{ 
List<RowItem> filteredData; 
Context context; 
List<RowItem> rowItems; 
CustomFilter filter; 

public CustomAdapter(Context context, List<RowItem> items) { 
    super(context, R.layout.list_item); 
    this.context = context; 
    this.rowItems = items; 
    this.filteredData = items; 
} 
/* @Override 
public int getCount() { 
    return filteredData.size(); 
} 

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

@Override 
public long getItemId(int position) { 
    return rowItems.indexOf(getItem(position)); 
}*/ 



/*private view holder class*/ 
private class ViewHolder { 
    ImageView imageView; 
    TextView txtTitle; 
    TextView txtDesc; 
    TextView pubname; 
} 

public View getView(int position, View convertView, ViewGroup parent) { 
    ViewHolder holder = null; 

    LayoutInflater mInflater = (LayoutInflater) 
      context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE); 
    if (convertView == null) { 
     convertView = mInflater.inflate(R.layout.list_item, parent, false); 
     holder = new ViewHolder(); 
     holder.txtDesc = (TextView) convertView.findViewById(R.id.desc); 
     holder.txtTitle = (TextView) convertView.findViewById(R.id.title); 
     holder.pubname = (TextView) convertView.findViewById(R.id.pub); 
     holder.imageView = (ImageView) convertView.findViewById(R.id.icon); 
     convertView.setTag(holder); 
    } 
    else { 
     holder = (ViewHolder) convertView.getTag(); 
    } 

    RowItem rowItem = (RowItem) getItem(position); 

    holder.txtDesc.setText(rowItem.getDesc()); 
    holder.txtTitle.setText(rowItem.getTitle()); 
    holder.pubname.setText(rowItem.getPub()); 
    holder.imageView.setImageResource(rowItem.getImageId()); 

    return convertView; 
} 
public Filter getFilter() { 
    if(filter == null) 
    { 
     filter=new CustomFilter(); 
    } 

    return filter;} 


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

      FilterResults results = new FilterResults(); 

      if (constraint != null && constraint.length() > 0) { 
       //CONSTARINT TO UPPER 
       constraint = constraint.toString().toUpperCase(); 

       ArrayList<RowItem> filters = new ArrayList<RowItem>(); 

       //get specific items 
       for (int i = 0; i < filteredData.size(); i++) { 
        if (filteredData.get(i).getTitle().toUpperCase().contains(constraint)) { 
         RowItem p = new RowItem(filteredData.get(i).getImageId(), filteredData.get(i).getTitle(), filteredData.get(i).getDesc(), filteredData.get(i).getPub()); 

         filters.add(p); 
        } 
       } 

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

      } else { 
       results.count = filteredData.size(); 
       results.values = filteredData; 

      } 

      return results; 
     } 
     @SuppressWarnings("unchecked") 
     @Override 
     protected void publishResults(CharSequence constraint, FilterResults results) { 
      // TODO Auto-generated method stub 

      if (results.count == 0) { 
       notifyDataSetInvalidated(); 
      } else { 
       rowItems = (ArrayList<RowItem>) results.values; 
       notifyDataSetChanged(); 
      } 
     } 

    } 
+0

Warum benutzen Sie 'ArrayAdapter' nicht? Es ist 'filterable' also keine Notwendigkeit es zu implementieren – pskink

+0

Sir @ pskink, ich versuchte zuerst ArrayAdapter, und in meiner vorherigen Frage habe ich erfahren, dass Basisadapter besser für benutzerdefinierte Listenansicht ist, und ArrayAdapter muss auch filterable http implementieren: //stackoverflow.com/questions/19122848/custom-getfilter-in-custom-arrayadapter-in-android –

+0

nein: 'public class ArrayAdapter erweitert BaseAdapter implementiert filterable', so dass Sie es nicht implementieren müssen – pskink

Antwort

0

Ok so! Die beiden dummen Fehler im Code getan ist: In CustomAdapter.java die ersetzen Basisklasse

Text
rowItems = (ArrayList<RowItem>) results.values; 

mit

filteredData = (ArrayList<RowItem>) results.values; 

und da auf das Löschen der eingegebene Text in Bearbeitung auch erweitert führt Wenn die gefilterte Datei erneut durchsucht wird, wird nur nach bereits gefilterten Daten gesucht. Fügen Sie also

hinzu

kurz vor

FilterResults results = new FilterResults(); 

Danke.

+0

Sir! Ich musste die Suche nach drei Parametern prioritär durchführen (Name des Buches, Herausgeber und seine Beschreibung) .. und muss auch die gefundenen Ergebnisse anzeigen! Ich benutze nicht ArrayAdapter ... seinen Beton! Base ist flexibel, um angepasst zu werden! und wenn ich jemals Array-Adapter benutze, muss ich es anpassen, Filter auch..als Basisadapter muss überschreiben getcount-Methode (um Nr. der Suchergebnisse anzuzeigen) Ich bin damit zufrieden. –