Android 如何使用图像在custome listview中执行搜索操作

Android 如何使用图像在custome listview中执行搜索操作,android,listview,android-edittext,android-filterable,Android,Listview,Android Edittext,Android Filterable,我试图在自定义listview中设置搜索有一个运行时错误不知道为什么我遵循了一个堆栈over flow post 活动代码: private ArrayList<Songfileinfo> songarr = new ArrayList<>(); private static final int EXT_STORAGE_PERMISSION_REQ_CODE = 2; private SearchAdapter adapte; @Override protected

我试图在自定义listview中设置搜索有一个运行时错误不知道为什么我遵循了一个堆栈over flow post 活动代码:

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

知道我哪里做错了吗

您正在对空对象应用筛选器

adapte.getFilter().filter(charSequence.toString());
应该是

adapte = new SearchAdapter(this, songarr);
不是


由于您已经将
SearchAdapter adapte
定义为全局您必须初始化adapte,我想您不需要

BaseAdapter adapter = new SearchAdapter(this, songarr);

然后在adpapter的filter方法中,您必须调用notifyDatasetChanged以反映过滤后的值。

通过跟踪youtube视频之一,我可以获得数据

适配器类代码

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();
    }
}
公共类CustomAdapter扩展BaseAdapter实现可过滤{
专用阵列列表显示;
私人ArrayList searcharr;
自定义过滤器;
语境;
公共CustomAdapter(上下文上下文,ArrayList songarr){
this.context=上下文;
this.display=songarr;
this.searcharr=songarr;
}
@凌驾
public int getCount(){
返回display.size();
}
@凌驾
公共对象getItem(int-pos){
返回显示。获取(pos);
}
@凌驾
公共长getItemId(int-pos){
返回显示.indexOf(getItem(pos));
}
@凌驾
公共视图getView(int pos、视图转换视图、视图组父视图){
LayoutInflater LayoutInflater=(LayoutInflater)context.getSystemService(context.LAYOUT\u INFLATER\u SERVICE);
if(convertView==null){
convertView=LayoutFlater.充气(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_图像);
textView.setText(display.get(pos.getTitle());
textView1.setText(display.get(pos.getAlbum());
Glide.with(context).load(Uri.parse(display.get(pos.getAlbum_art()))
.缩略图(0.5f)
.fitCenter()
.错误(R.可绘制音乐)
.diskCacheStrategy(diskCacheStrategy.SOURCE)
.进入(圆形图像视图);
返回视图;
}
@凌驾
公共过滤器getFilter(){
if(customFilter==null){
customFilter=新的customFilter();
}
返回自定义过滤器;
}
类CustomFilter扩展了过滤器{
@凌驾
受保护过滤器结果执行过滤(CharSequence CharSequence){
FilterResults FilterResults=新的FilterResults();
if(charSequence!=null&&charSequence.length()>0){
charSequence=charSequence.toString().toUpperCase();
ArrayList过滤器=新的ArrayList();
对于(int i=0;i
和我的活动类代码

 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;
}
private ArrayList songarr=new ArrayList();
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
checkReadStoragePermission();
Songdata加载=新的Songdata();
this.songar=load.getPlayList(this);
ListView ListView=(ListView)findViewById(R.id.list);
SearchView SearchView=(SearchView)findviewbyd(R.id.SearchView);
最终CustomAdapter=new CustomAdapter(this,songarr);
setAdapter(customAdapter);
searchView.setOnQueryTextListener(新的searchView.OnQueryTextListener(){
@凌驾
公共布尔值onQueryTextSubmit(字符串查询){
返回false;
}
@凌驾
公共布尔onQueryTextChange(字符串newText){
customAdapter.getFilter().filter(新文本);
返回false;
}
});
}
专用ArrayListgetPlaylist(){
ArrayList newlist=新的ArrayList();
Songfileinfo Songfileinfo;

对于(int i=0;我可以发布第一个代码段的完整代码吗?我在filter方法中调用了notify datasetchanged,但它没有过滤我添加的数据adapte.notifyDatasetChanged(),但它仍然不起作用
BaseAdapter adapter = new SearchAdapter(this, songarr);
BaseAdapter adapter = new SearchAdapter(this, songarr);
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;
}