2017-01-16 4 views
-2

カスタムリストビューで検索を設定しようとしていますが、実行時エラーがあります。なぜ私がフローポストのスタックをたどったのか分かりません。コード:検索の操作を画像で行う

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

アダプターコード

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

}

とsongfile情報クラス

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() { 

} 

アプリは、それが正しくリストビューを表示罰金ですが、私は、それは誤り

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) 

で私が間違っているのmは任意のアイデアをクラッシュエディットテキストをクリックしたとき?

+0

あなたは最初のスニペットの完全なコードを投稿できますか? –

答えて

0

あなたはあなたがグローバル

+0

sirしかし検索部分が機能していません – SAVVY

0

としてSearchAdapter adapteをすでに定義したように、それは

adapte = new SearchAdapter(this, songarr); 

ない

BaseAdapter adapter = new SearchAdapter(this, songarr); 

である必要があり、nullオブジェクト

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

にフィルタを適用していますadapteを初期化する必要があり、私はあなたがあなたのadpapterのフィルタメソッド内で、その後

BaseAdapter adapter = new SearchAdapter(this, songarr); 

を必要といけないと思い、あなたはは、フィルタリングされた値を反映するためにをnotifyDatasetChanged呼び出す必要があります。私は、データを取得することができる午前ユーチューブビデオの1以下のことで

+0

フィルタメソッドでnotify datasetchangedを呼び出しましたが、データをフィルタリングしていません – SAVVY

+0

adapte.notifyDatasetChanged()を追加しましたが、まだ動作していません – SAVVY

0

アダプタクラスコード

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

と私の活動のクラスコード、これはいくつかのいずれかを助ける

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

・ホープ将来的に