2017-01-16 2 views
-2

J'essaie de définir la recherche dans une liste personnalisée il y a une erreur de temps d'exécution ne sais pas pourquoi j'ai suivi l'un de la pile sur le post de flux .Il est ce que j'essaie activité code:comment faire une opération de recherche dans custome listview avec image

private ArrayList<Songfileinfo> songarr = new ArrayList<>(); 
private static final int EXT_STORAGE_PERMISSION_REQ_CODE = 2; 
private SearchAdapter adapte; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    checkReadStoragePermission(); 
    Songdata load = new Songdata(); 
    this.songarr = load.getPlayList(this); 

    ListView listView = (ListView) findViewById(R.id.list); 


    EditText editText = (EditText)findViewById(R.id.editText); 
    editText.addTextChangedListener(new TextWatcher() { 
     @Override 
     public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) { 

     } 

     @Override 
     public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) { 
      adapte.getFilter().filter(charSequence.toString()); 
     } 

     @Override 
     public void afterTextChanged(Editable editable) { 

     } 
    }); 
    adapte = new SearchAdapter(this, songarr); 
    listView.setAdapter(adapte); 
} 

code Adaptateur

public class SearchAdapter extends BaseAdapter implements Filterable { 

private ArrayList<Songfileinfo> songar; 
private ArrayList<Songfileinfo> searchar; 
private LayoutInflater inflater; 
private Context context; 

public SearchAdapter(Context context, ArrayList<Songfileinfo> songarr) { 
    this.searchar = songarr; 
    this.songar = songarr; 
    this.context= context; 
    inflater = LayoutInflater.from(context); 
} 

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

@Override 
public Object getItem(int i) { 
    return i; 
} 

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

private class ViewHolder { 
    LinearLayout llContainer; 
    TextView tvName, tvPrice; 
    CircleImageView circleImageView; 
} 

@Override 
public View getView(final int i, View convertview, ViewGroup viewGroup) { 
    ViewHolder holder = null; 
    if (convertview == null) { 
     holder = new ViewHolder(); 
     convertview = inflater.inflate(R.layout.custom, null); 
     holder.llContainer = (LinearLayout) convertview.findViewById(R.id.tryi1); 
     holder.tvName = (TextView) convertview.findViewById(R.id.textView); 
     holder.tvPrice = (TextView) convertview.findViewById(R.id.textView2); 
     holder.circleImageView = (CircleImageView) convertview.findViewById(R.id.profile_image); 
     convertview.setTag(holder); 

    } else { 
     holder = (ViewHolder) convertview.getTag(); 
    } 

    holder.tvName.setText(songar.get(i).getTitle()); 
    holder.tvPrice.setText(songar.get(i).getAlbum()); 
    Glide.with(context).load(Uri.parse(songar.get(i).getAlbum_art())) 
      .thumbnail(0.5f) 
      .fitCenter() 
      .error(R.drawable.music) 
      .diskCacheStrategy(DiskCacheStrategy.SOURCE) 
      .into(holder.circleImageView); 

    return convertview; 
} 
@Override 
public Filter getFilter() { 
    Filter filter = new Filter() { 

     @SuppressWarnings("unchecked") 
     @Override 
     protected void publishResults(CharSequence constraint,FilterResults results) { 

      searchar = (ArrayList<Songfileinfo>) results.values; // has the filtered values 
      notifyDataSetChanged(); // notifies the data with new filtered values 
     } 

     @Override 
     protected FilterResults performFiltering(CharSequence constraint) { 
      FilterResults results = new FilterResults();  // Holds the results of a filtering operation in values 
      ArrayList<Songfileinfo> FilteredArrList = new ArrayList<Songfileinfo>(); 

      if (searchar == null) { 
       searchar = new ArrayList<Songfileinfo>(songar); // saves the original data in mOriginalValues 
      } 

          if (constraint == null || constraint.length() == 0) { 

       // set the Original result to return 
       results.count = searchar.size(); 
       results.values = searchar; 
      } else { 
       constraint = constraint.toString().toLowerCase(); 
       for (int i = 0; i < searchar.size(); i++) { 
        String data = searchar.get(i).getTitle(); 
        if (data.toLowerCase().startsWith(constraint.toString())) { 
         FilteredArrList.add(new Songfileinfo(searchar.get(i).getTitle(),searchar.get(i).getAlbum(),searchar.get(i).getAlbum_art())); 
        } 
       } 
       // set the Filtered result to return 
       results.count = FilteredArrList.size(); 
       results.values = FilteredArrList; 
      } 
      return results; 
     } 
    }; 
    return filter; 
} 

}

et informations songfile classe

public class Songfileinfo implements Parcelable{ 
private String title,album,artist,file_uri; 
private String album_art; 

public Songfileinfo(Parcel in) { 
    title = in.readString(); 
    album = in.readString(); 
    artist = in.readString(); 
    file_uri = in.readString(); 
    album_art = in.readString(); 
} 

public static final Creator<Songfileinfo> CREATOR = new Creator<Songfileinfo>() { 
    @Override 
    public Songfileinfo createFromParcel(Parcel in) { 
     return new Songfileinfo(in); 
    } 

    @Override 
    public Songfileinfo[] newArray(int size) { 
     return new Songfileinfo[size]; 
    } 
}; 

public Songfileinfo(String album_art,String title,String album) { 
    this.album=album; 
    this.album_art=album_art; 
    this.title=title; 
} 

public Songfileinfo() { 

} 

l'application est très bien, il affiche correctement le listview mais quand je clique sur le texte de modifier, il se bloque avec l'erreur

java.lang.NullPointerException: Attempt to invoke virtual method 'android.widget.Filter beatbox.neelay.searchtest.SearchAdapter.getFilter()' on a null object reference 
        at beatbox.neelay.searchtest.MainActivity$1.onTextChanged(MainActivity.java:47) 
        at android.widget.TextView.sendOnTextChanged(TextView.java:8000) 
        at android.widget.TextView.handleTextChanged(TextView.java:8062) 
        at android.widget.TextView$ChangeWatcher.onTextChanged(TextView.java:10185) 
        at android.text.SpannableStringBuilder.sendTextChanged(SpannableStringBuilder.java:1033) 
        at android.text.SpannableStringBuilder.replace(SpannableStringBuilder.java:559) 
        at android.text.SpannableStringBuilder.replace(SpannableStringBuilder.java:492) 
        at android.text.SpannableStringBuilder.replace(SpannableStringBuilder.java:34) 
        at android.view.inputmethod.BaseInputConnection.replaceText(BaseInputConnection.java:685) 
        at android.view.inputmethod.BaseInputConnection.setComposingText(BaseInputConnection.java:445) 
        at com.android.internal.view.IInputConnectionWrapper.executeMessage(IInputConnectionWrapper.java:340) 
        at com.android.internal.view.IInputConnectionWrapper$MyHandler.handleMessage(IInputConnectionWrapper.java:78) 
        at android.os.Handler.dispatchMessage(Handler.java:102) 
        at android.os.Looper.loop(Looper.java:148) 
        at android.app.ActivityThread.main(ActivityThread.java:5441) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:738) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:628) 

une idée où je fais mal ??

+0

Pouvez-vous poster le code complet du premier extrait ?? –

Répondre

0

Vous êtes appliquer le filtre sur un objet nul

adapte.getFilter().filter(charSequence.toString()); 

il devrait être

adapte = new SearchAdapter(this, songarr); 

pas

BaseAdapter adapter = new SearchAdapter(this, songarr); 

Comme vous l'avez déjà défini SearchAdapter adapte comme global

+0

monsieur mais maintenant la partie recherche ne fonctionne pas – SAVVY

0

Vous doivent initialiser ADAPTE, je suppose que vous ne avez pas besoin

BaseAdapter adapter = new SearchAdapter(this, songarr); 

puis à l'intérieur méthode du filtre de votre adpapter, vous devez appeler notifyDatasetChanged pour refléter les valeurs filtrées.

+0

J'ai appelé notify datasetchanged dans la méthode de filtrage mais il ne filtre pas les données – SAVVY

+0

j'ai ajouté adapte.notifyDatasetChanged() mais ça ne marche toujours pas – SAVVY

0

En suivant l'un de la vidéo sur youtube je suis en mesure d'obtenir les données

code classe Adaptateur

public class CustomAdapter extends BaseAdapter implements Filterable { 
private ArrayList<Songfileinfo> display; 
private ArrayList<Songfileinfo> searcharr; 
CustomFilter customFilter; 
Context context; 

public CustomAdapter(Context context, ArrayList<Songfileinfo> songarr) { 
    this.context = context; 
    this.display = songarr; 
    this.searcharr = songarr; 
} 

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

@Override 
public Object getItem(int pos) { 
    return display.get(pos); 
} 

@Override 
public long getItemId(int pos) { 
    return display.indexOf(getItem(pos)); 
} 

@Override 
public View getView(int pos, View convertView, ViewGroup parent) { 
    LayoutInflater layoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    if (convertView == null) { 
     convertView = layoutInflater.inflate(R.layout.custom, null); 

    } 
    TextView textView = (TextView) convertView.findViewById(R.id.textView); 
    TextView textView1 = (TextView) convertView.findViewById(R.id.textView2); 
    CircleImageView circleImageView = (CircleImageView) convertView.findViewById(R.id.profile_image); 
    textView.setText(display.get(pos).getTitle()); 
    textView1.setText(display.get(pos).getAlbum()); 
    Glide.with(context).load(Uri.parse(display.get(pos).getAlbum_art())) 
      .thumbnail(0.5f) 
      .fitCenter() 
      .error(R.drawable.music) 
      .diskCacheStrategy(DiskCacheStrategy.SOURCE) 
      .into(circleImageView); 

    return convertView; 
} 

@Override 
public Filter getFilter() { 
    if (customFilter==null){ 
     customFilter = new CustomFilter(); 
    } 
    return customFilter; 
} 


class CustomFilter extends Filter { 

    @Override 
    protected FilterResults performFiltering(CharSequence charSequence) { 
     FilterResults filterResults = new FilterResults(); 
     if (charSequence != null && charSequence.length() > 0) { 
      charSequence = charSequence.toString().toUpperCase(); 
      ArrayList<Songfileinfo> filter = new ArrayList<>(); 
      for (int i = 0; i < searcharr.size(); i++) { 
       if (searcharr.get(i).getTitle().toUpperCase().contains(charSequence)) { 
        Songfileinfo songfileinfo = new Songfileinfo(searcharr.get(i).getTitle(), searcharr.get(i).getAlbum(), searcharr.get(i).getAlbum_art()); 
        filter.add(songfileinfo); 
       } 
      } 
      filterResults.count = filter.size(); 
      filterResults.values = filter; 
     } else { 
      filterResults.count = searcharr.size(); 
      filterResults.values = searcharr; 
     } 

     return filterResults; 
    } 

    @Override 
    protected void publishResults(CharSequence charSequence, FilterResults filterResults) { 
     display = (ArrayList<Songfileinfo>) filterResults.values; 
     notifyDataSetChanged(); 
    } 
} 

et mon code de classe d'activité

private ArrayList<Songfileinfo> songarr = new ArrayList<>(); 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    checkReadStoragePermission(); 
    Songdata load = new Songdata(); 
    this.songarr = load.getPlayList(this); 
    ListView listView = (ListView) findViewById(R.id.list); 
    SearchView searchView = (SearchView) findViewById(R.id.searchview); 
    final CustomAdapter customAdapter = new CustomAdapter(this, songarr); 
    listView.setAdapter(customAdapter); 
    searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() { 
     @Override 
     public boolean onQueryTextSubmit(String query) { 



      return false; 
     } 

     @Override 
     public boolean onQueryTextChange(String newText) { 
      customAdapter.getFilter().filter(newText); 
      return false; 
     } 
    }); 

} 

private ArrayList<Songfileinfo>getPlaylist(){ 
    ArrayList<Songfileinfo> newlist =new ArrayList<Songfileinfo>(); 
    Songfileinfo songfileinfo; 
    for (int i =0;i<songarr.size();i++){ 

     songfileinfo =new Songfileinfo(songarr.get(i).getTitle(),songarr.get(i).getAlbum_art(),songarr.get(i).getAlbum()); 
     newlist.add(songfileinfo); 
    } 
    return newlist; 
} 

Hope cela aidera quelqu'un à l'avenir