Java android:使用自定义适配器在ListView中添加SearchView

Java android:使用自定义适配器在ListView中添加SearchView,java,android,listview,android-searchmanager,android-filter,Java,Android,Listview,Android Searchmanager,Android Filter,我正在创建一个包含3个选项卡片段的应用程序。这是片段之一,数据显示在列表视图中。在列表视图中添加搜索筛选器时,我遇到了麻烦 我已经在这个片段和列表中添加了搜索视图,所有内容都正常工作,没有任何错误,但是,当在搜索视图列表中键入内容时没有排序,如果有人知道,请告诉我代码中的错误 logcat消息,代码正在运行,但searchview不工作 这是我的适配器java类 片段java文件 导入android.content.Context; 导入android.os.Bundle; 导入android

我正在创建一个包含3个选项卡片段的应用程序。这是片段之一,数据显示在列表视图中。在列表视图中添加搜索筛选器时,我遇到了麻烦

我已经在这个片段和列表中添加了搜索视图,所有内容都正常工作,没有任何错误,但是,当在搜索视图列表中键入内容时没有排序,如果有人知道,请告诉我代码中的错误

logcat消息,代码正在运行,但searchview不工作

这是我的适配器java类

片段java文件

导入android.content.Context;
导入android.os.Bundle;
导入android.util.Log;
导入android.view.LayoutInflater;
导入android.view.view;
导入android.view.ViewGroup;
导入android.widget.ArrayAdapter;
导入android.widget.ImageView;
导入android.widget.ListView;
导入android.widget.SearchView;
导入com.parse.FindCallback;
导入com.parse.ParseException;
导入com.parse.parse文件;
导入com.parse.ParseObject;
导入com.parse.ParseQuery;
导入java.net.URL;
导入java.util.ArrayList;
导入java.util.List;
公共类个人扩展了android.support.v4.app.ListFragment
实现FindCallback{
私有列表组织=新建ArrayList();
SearchView sv;
个体接受器;
@凌驾
CreateView上的公共视图(布局、充气机、视图组容器、捆绑包保存状态){
返回充气机。充气(右布局。个人,容器,假);
}
@凌驾
已创建公用void onview(视图,捆绑包b){
super.onViewCreated(视图,b);
sv=(SearchView)view.findViewById(R.id.searchView1);
最终个体适配器=新个体适配器(getActivity(),mOrganization);
setListAdapter(适配器);
graseQuery.getQuery(“_User”).findInBackground(this);
sv.setOnQueryTextListener(新的SearchView.OnQueryTextListener(){
@凌驾
公共布尔值onQueryTextSubmit(字符串文本){
//TODO自动生成的方法存根
返回false;
}
@凌驾
公共布尔值onQueryTextChange(字符串文本){
adapter.getFilter().filter(文本);
返回false;
}
});
}
@凌驾
已完成公共作废(列表分数列表,Parsee异常){
如果(e==null){
Log.d(“score”,“Retrieved”+scoreList.size()+“_User”);
组织。清除();
mOrganization.addAll(记分表);
((IndividualsAdaptor)getListAdapter()).notifyDataSetChanged();
}否则{
Log.d(“分数”,“错误:+e.getMessage());
}
}
}
列表视图xml


数据xml


为视图创建一个类变量

  View view;

   @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    view=inflater.inflate(R.layout.individuals, container, false);
            return view;
        }
在“搜索”视图中使用此选项

 SearchView searchView = (SearchView)view.findViewById(R.id.searchTextView);
可以使用此布局

    <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:weightSum="1"
    android:layout_height="match_parent">

    <TextView android:id="@id/android:empty"
        android:text="No data"
        android:layout_width="match_parent"
        android:layout_weight="0.1"
        android:layout_height="0dp"
        tools:ignore="HardcodedText" />

    <SearchView
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="0.1"
        android:id="@+id/searchUserTextField"
        android:background="@android:color/holo_red_dark"
        android:textColor="@android:color/white"
        android:textSize="14sp"
        android:hint="Search by Name or Company"
        android:textColorHint="#fff" />

    <ListView android:id="@id/android:list"
        android:layout_width="match_parent"
        android:layout_weight="0.6"
        android:layout_height="wrap_content"
        />

    <ImageView
        android:id="@+id/imageView7"
        android:layout_height="wrap_content"
        android:layout_width="wrap_content"
        android:layout_weight="0.2"
        android:src="@mipmap/ic_launcher"/>

</LinearLayout>

我认为问题在于:

SearchView searchView = (SearchView)view.findViewById(R.id.searchTextView);
    view=inflater.inflate(R.layout.individuals, container, false);
您在创建视图之前调用searchview

请尝试以下适配器代码:

public class IndividualsAdaptor extends ArrayAdapter {
protected Context mContext;
// Code for Custom Filter.
protected List mBackupList = new ArrayList();

public IndividualsAdaptor(Context context, List status) {
    super(context, R.layout.t3, status);
    mContext = context;
    // Code for Custom Filter.
    mBackupList.addAll(status);
}

@Override
public View getView(final int position, View convertView, ViewGroup parent) {
    ViewHolder holder;

    if (android.os.Build.VERSION.SDK_INT > 9) {
        StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
        StrictMode.setThreadPolicy(policy);
    }

    if (convertView == null) {
        convertView = LayoutInflater.from(mContext).inflate(R.layout.t3, null);
        holder = new ViewHolder();
        holder.usernameHomepage = (TextView) convertView.findViewById(R.id.fname);
        holder.statusHomepage = (TextView) convertView.findViewById(R.id.lname);
        holder.pposition = (TextView) convertView.findViewById(R.id.idposition);
        holder.orgName = (TextView) convertView.findViewById(R.id.organizationname);
        holder.logo = (ImageView) convertView.findViewById(R.id.imageView);
        convertView.setTag(holder);
    } else {
        holder = (ViewHolder) convertView.getTag();
    }

    ParseObject statusObject = (ParseObject) getItem(position);
    // title
    String username = statusObject.getString("firstname");
    holder.usernameHomepage.setText(username);
    // content
    String status = statusObject.getString("lastname");
    holder.statusHomepage.setText(status);
    // content
    String positions = statusObject.getString("position");
    holder.pposition.setText(positions);
    // content
    String org = statusObject.getString("organizationName");
    holder.orgName.setText(org);
    // logo
    URL url = null;
    Bitmap bmp = null;
    try {
        url = new URL("img hosting location" + statusObject.getString("image"));
        bmp = BitmapFactory.decodeStream(url.openConnection().getInputStream());
    } catch (MalformedURLException e) {
    }catch (IOException e) {
    }
    holder.logo.setImageBitmap(bmp);
    Picasso.with(mContext)
            .load(String.valueOf(url))
            .into(((ImageView) convertView
                    .findViewById(R.id.imageView)));

    return convertView;
}

public static class ViewHolder {
    TextView usernameHomepage;
    TextView statusHomepage;
    TextView orgName;
    TextView pposition;
    ImageView logo;
}

// Code for Custom Filter.
@Override
public Filter getFilter() {return new Filter(){
    @Override
    protected FilterResults performFiltering(CharSequence charSequence) {
        String queryString = charSequence.toString().toLowerCase();
        List<ParseObject> filteredList = new ArrayList<>();
        ParseObject tmpItem;
        String tmpUsername, tmpStatus, tmpPositions, tmpOrg;
        for(int i=0; i<mBackupList.size(); i++){
            tmpItem = (ParseObject) mBackupList.get(i);
            tmpUsername = tmpItem.getString("firstname").toLowerCase();
            tmpStatus = tmpItem.getString("lastname").toLowerCase();
            tmpPositions = tmpItem.getString("position").toLowerCase();
            tmpOrg = tmpItem.getString("organizationName").toLowerCase();
            // The matching condition
            if(tmpUsername.contains(queryString)||tmpStatus.contains(queryString)||
                    tmpPositions.contains(queryString)||tmpOrg.contains(queryString)){
                filteredList.add(tmpItem);
            }
        }
        FilterResults filterResults = new FilterResults();
        filterResults.count = filteredList.size();
        filterResults.values = filteredList;
        return filterResults;
    }
    @Override
    protected void publishResults(CharSequence charSequence, Filter.FilterResults filterResults) {
        clear();
        addAll((List<ParseObject>) filterResults.values);
    }
};}

public void updateBackupList(List newList){
    mBackupList.clear();
    mBackupList.addAll(newList);
}
}
公共类IndividualsAdaptor扩展ArrayAdapter{
保护上下文mContext;
//自定义过滤器的代码。
受保护列表mBackupList=新的ArrayList();
公共个人适配器(上下文、列表状态){
超级(上下文,R.layout.t3,状态);
mContext=上下文;
//自定义过滤器的代码。
mBackupList.addAll(状态);
}
@凌驾
公共视图getView(最终整数位置、视图转换视图、视图组父视图){
视窗座;
如果(android.os.Build.VERSION.SDK_INT>9){
StrictMode.ThreadPolicy policy=新建StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(策略);
}
if(convertView==null){
convertView=LayoutFlater.from(mContext).充气(R.layout.t3,空);
holder=新的ViewHolder();
holder.usernameHomepage=(TextView)convertView.findViewById(R.id.fname);
holder.statusHomepage=(TextView)convertView.findViewById(R.id.lname);
holder.position=(TextView)convertView.findViewById(R.id.idposition);
holder.orgName=(TextView)convertView.findViewById(R.id.organizationname);
holder.logo=(ImageView)convertView.findViewById(R.id.ImageView);
convertView.setTag(支架);
}否则{
holder=(ViewHolder)convertView.getTag();
}
ParseObject statusObject=(ParseObject)getItem(位置);
//头衔
字符串用户名=statusObject.getString(“firstname”);
holder.usernameHomepage.setText(用户名);
//内容
字符串状态=statusObject.getString(“lastname”);
holder.statusHomepage.setText(状态);
//内容
字符串位置=statusObject.getString(“位置”);
holder.position.setText(位置);
//内容
String org=statusObject.getString(“organizationName”);
holder.orgName.setText(org);
//标志
URL=null;
位图bmp=null;
试一试{
url=新url(“img托管位置”+statusObject.getString(“图像”);
bmp=BitmapFactory.decodeStream(url.openConnection().getInputStream());
}捕获(格式错误){
}捕获(IOE异常){
}
holder.logo.setImageBitmap(bmp);
毕加索(McContext)
.load(字符串.valueOf(url))
.转换为(((图像视图)转换视图
.findviewbyd(R.id.imageView));
返回视图;
}
公共静态类视图持有者{
TextView用户名主页;
文本视图状态主页;
TextView orgName;
文本视图预设;
ImageView徽标;
}
//自定义过滤器的代码。
@凌驾
公共筛选器getFilter(){返回新筛选器(){
@凌驾
受保护过滤器结果执行过滤(CharSequence CharSequence){
String queryString=charSequence.toString().toLowerCase();
List filteredList=新建ArrayList();
解析对象tmpItem;
字符串tmpUs
  View view;

   @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    view=inflater.inflate(R.layout.individuals, container, false);
            return view;
        }
 SearchView searchView = (SearchView)view.findViewById(R.id.searchTextView);
    <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:weightSum="1"
    android:layout_height="match_parent">

    <TextView android:id="@id/android:empty"
        android:text="No data"
        android:layout_width="match_parent"
        android:layout_weight="0.1"
        android:layout_height="0dp"
        tools:ignore="HardcodedText" />

    <SearchView
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="0.1"
        android:id="@+id/searchUserTextField"
        android:background="@android:color/holo_red_dark"
        android:textColor="@android:color/white"
        android:textSize="14sp"
        android:hint="Search by Name or Company"
        android:textColorHint="#fff" />

    <ListView android:id="@id/android:list"
        android:layout_width="match_parent"
        android:layout_weight="0.6"
        android:layout_height="wrap_content"
        />

    <ImageView
        android:id="@+id/imageView7"
        android:layout_height="wrap_content"
        android:layout_width="wrap_content"
        android:layout_weight="0.2"
        android:src="@mipmap/ic_launcher"/>

</LinearLayout>
SearchView searchView = (SearchView)view.findViewById(R.id.searchTextView);
    view=inflater.inflate(R.layout.individuals, container, false);
public class IndividualsAdaptor extends ArrayAdapter {
protected Context mContext;
// Code for Custom Filter.
protected List mBackupList = new ArrayList();

public IndividualsAdaptor(Context context, List status) {
    super(context, R.layout.t3, status);
    mContext = context;
    // Code for Custom Filter.
    mBackupList.addAll(status);
}

@Override
public View getView(final int position, View convertView, ViewGroup parent) {
    ViewHolder holder;

    if (android.os.Build.VERSION.SDK_INT > 9) {
        StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
        StrictMode.setThreadPolicy(policy);
    }

    if (convertView == null) {
        convertView = LayoutInflater.from(mContext).inflate(R.layout.t3, null);
        holder = new ViewHolder();
        holder.usernameHomepage = (TextView) convertView.findViewById(R.id.fname);
        holder.statusHomepage = (TextView) convertView.findViewById(R.id.lname);
        holder.pposition = (TextView) convertView.findViewById(R.id.idposition);
        holder.orgName = (TextView) convertView.findViewById(R.id.organizationname);
        holder.logo = (ImageView) convertView.findViewById(R.id.imageView);
        convertView.setTag(holder);
    } else {
        holder = (ViewHolder) convertView.getTag();
    }

    ParseObject statusObject = (ParseObject) getItem(position);
    // title
    String username = statusObject.getString("firstname");
    holder.usernameHomepage.setText(username);
    // content
    String status = statusObject.getString("lastname");
    holder.statusHomepage.setText(status);
    // content
    String positions = statusObject.getString("position");
    holder.pposition.setText(positions);
    // content
    String org = statusObject.getString("organizationName");
    holder.orgName.setText(org);
    // logo
    URL url = null;
    Bitmap bmp = null;
    try {
        url = new URL("img hosting location" + statusObject.getString("image"));
        bmp = BitmapFactory.decodeStream(url.openConnection().getInputStream());
    } catch (MalformedURLException e) {
    }catch (IOException e) {
    }
    holder.logo.setImageBitmap(bmp);
    Picasso.with(mContext)
            .load(String.valueOf(url))
            .into(((ImageView) convertView
                    .findViewById(R.id.imageView)));

    return convertView;
}

public static class ViewHolder {
    TextView usernameHomepage;
    TextView statusHomepage;
    TextView orgName;
    TextView pposition;
    ImageView logo;
}

// Code for Custom Filter.
@Override
public Filter getFilter() {return new Filter(){
    @Override
    protected FilterResults performFiltering(CharSequence charSequence) {
        String queryString = charSequence.toString().toLowerCase();
        List<ParseObject> filteredList = new ArrayList<>();
        ParseObject tmpItem;
        String tmpUsername, tmpStatus, tmpPositions, tmpOrg;
        for(int i=0; i<mBackupList.size(); i++){
            tmpItem = (ParseObject) mBackupList.get(i);
            tmpUsername = tmpItem.getString("firstname").toLowerCase();
            tmpStatus = tmpItem.getString("lastname").toLowerCase();
            tmpPositions = tmpItem.getString("position").toLowerCase();
            tmpOrg = tmpItem.getString("organizationName").toLowerCase();
            // The matching condition
            if(tmpUsername.contains(queryString)||tmpStatus.contains(queryString)||
                    tmpPositions.contains(queryString)||tmpOrg.contains(queryString)){
                filteredList.add(tmpItem);
            }
        }
        FilterResults filterResults = new FilterResults();
        filterResults.count = filteredList.size();
        filterResults.values = filteredList;
        return filterResults;
    }
    @Override
    protected void publishResults(CharSequence charSequence, Filter.FilterResults filterResults) {
        clear();
        addAll((List<ParseObject>) filterResults.values);
    }
};}

public void updateBackupList(List newList){
    mBackupList.clear();
    mBackupList.addAll(newList);
}
}
public class Individuals extends ListFragment {
private List<ParseObject> mOrganization = new ArrayList<ParseObject>();
SearchView sv;
IndividualsAdaptor adaptor;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    return inflater.inflate(R.layout.individuals, container, false);
}

@Override
public void onViewCreated(View view, Bundle b) {
    super.onViewCreated(view, b);
    sv = (SearchView) view.findViewById(R.id.searchView1);
    adaptor = new IndividualsAdaptor(getActivity(), mOrganization);
    setListAdapter(adaptor);
    ParseQuery.getQuery("_User").findInBackground(this);

    sv.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
        @Override
        public boolean onQueryTextSubmit(String text) {
            return false;
        }
        @Override
        public boolean onQueryTextChange(String text) {
            adaptor.getFilter().filter(text);
            return true;
        }
    });
}

@Override
public void done(List<ParseObject> scoreList, ParseException e) {
    if (e == null) {
        Log.d("score", "Retrieved " + scoreList.size() + " _User");
        mOrganization.clear();
        mOrganization.addAll(scoreList);
        ((IndividualsAdaptor) getListAdapter()).updateBackupList(mOrganization);
        ((IndividualsAdaptor) getListAdapter()).notifyDataSetChanged();
    } else {
        Log.d("score", "Error: " + e.getMessage());
    }
}
}