Android 如何使用图像在custome listview中执行搜索操作
我试图在自定义listview中设置搜索有一个运行时错误不知道为什么我遵循了一个堆栈over flow post 活动代码: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
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;
}