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

我正在创建一个包含3个标签片段的应用。 这是其中一个片段,数据显示在列表视图中。 我在向列表视图添加搜索filter时遇到了麻烦。

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

logcat消息,代码正在运行但searchview无法正常工作

W/OpenGLRenderer: Failed to set EGL_SWAP_BEHAVIOR on surface 0x7f68b3d56a80, error=EGL_SUCCESS V/RenderScript: 0x7f68b3d72000 Launching thread(s), CPUs 2 W/System: Ignoring header X-Parse-Client-Key because its value was null. W/System: Ignoring header X-Parse-Client-Key because its value was null. W/EGL_emulation: eglSurfaceAttrib not implemented W/OpenGLRenderer: Failed to set EGL_SWAP_BEHAVIOR on surface 0x7f68b3e0f740, error=EGL_SUCCESS W/System: Ignoring header X-Parse-Client-Key because its value was null. D/score: Retrieved 23 _User W/Settings: Setting airplane_mode_on has moved from android.provider.Settings.System to android.provider.Settings.Global, returning read-only value. I/Choreographer: Skipped 59 frames! The application may be doing too much work on its main thread. D/score: Retrieved 100 Organization D/score: Retrieved 100 _User W/EGL_emulation: eglSurfaceAttrib not implemented W/OpenGLRenderer: Failed to set EGL_SWAP_BEHAVIOR on surface 0x7f68b3daa980, error=EGL_SUCCESS W/EGL_emulation: eglSurfaceAttrib not implemented W/OpenGLRenderer: Failed to set EGL_SWAP_BEHAVIOR on surface 0x7f68b3f336c0, error=EGL_SUCCESS W/EGL_emulation: eglSurfaceAttrib not implemented W/OpenGLRenderer: Failed to set EGL_SWAP_BEHAVIOR on surface 0x7f68b3daa300, error=EGL_SUCCESS 

这是我的适配器java类。

 import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.os.StrictMode; import android.support.v4.app.FragmentActivity; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ArrayAdapter; import android.widget.ImageView; import android.widget.TextView; import com.parse.ParseObject; import com.squareup.picasso.Picasso; import java.io.IOException; import java.net.MalformedURLException; import java.net.URL; import java.util.List; public class IndividualsAdaptor extends ArrayAdapter { protected Context mContext; protected List mStatus; public IndividualsAdaptor(Context context, int individuals, List status) { super(context, R.layout.t3, status); mContext = context; mStatus = 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) mStatus.get(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; } } 

片段java文件

 import android.content.Context; import android.os.Bundle; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ArrayAdapter; import android.widget.ImageView; import android.widget.ListView; import android.widget.SearchView; import com.parse.FindCallback; import com.parse.ParseException; import com.parse.ParseFile; import com.parse.ParseObject; import com.parse.ParseQuery; import java.net.URL; import java.util.ArrayList; import java.util.List; public class Individuals extends android.support.v4.app.ListFragment implements FindCallback { private List mOrganization = new ArrayList(); 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); final IndividualsAdaptor adaptor = new IndividualsAdaptor(getActivity(), mOrganization); setListAdapter(adaptor); ParseQuery.getQuery("_User").findInBackground(this); sv.setOnQueryTextListener(new SearchView.OnQueryTextListener() { @Override public boolean onQueryTextSubmit(String text) { // TODO Auto-generated method stub return false; } @Override public boolean onQueryTextChange(String text) { adaptor.getFilter().filter(text); return false; } }); } @Override public void done(List scoreList, ParseException e) { if (e == null) { Log.d("score", "Retrieved " + scoreList.size() + " _User"); mOrganization.clear(); mOrganization.addAll(scoreList); ((IndividualsAdaptor) getListAdapter()).notifyDataSetChanged(); } else { Log.d("score", "Error: " + e.getMessage()); } } } 

list-view xml

       

数据xml

          

试试这个适配器代码:

 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 filteredList = new ArrayList<>(); ParseObject tmpItem; String tmpUsername, tmpStatus, tmpPositions, tmpOrg; for(int i=0; i) filterResults.values); } };} public void updateBackupList(List newList){ mBackupList.clear(); mBackupList.addAll(newList); } } 

和Individuals.java:

 public class Individuals extends ListFragment { private List mOrganization = new ArrayList(); 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 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()); } } } 

为视图创建一个类变量

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

可以使用此布局。

         

我认为问题在这里:

 SearchView searchView = (SearchView)view.findViewById(R.id.searchTextView); view=inflater.inflate(R.layout.individuals, container, false); 

您在创建视图之前调用searchview