需要一些帮助来在我的 Android 应用程序中实现搜索功能,该应用程序在 fragment 中显示 expandablelistview
。我在网上找到了很多示例,但没有一个具有相同的方法(Fragment + Expandablelistview)。
Expandable_adapter 类
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import android.content.Context;
import android.graphics.Typeface;
import android.text.Html;
import android.text.method.LinkMovementMethod;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseExpandableListAdapter;
import android.widget.ImageView;
import android.widget.TextView;
import com.genesysci.leo.R;
import com.genesysci.leo.others.Child;
public class Expandable_adapter extends BaseExpandableListAdapter{
private final int VIEW_ITEM = 1;
private final int VIEW_PROG = 0;
// The minimum amount of items to have below your current scroll position
// before loading more.
private int visibleThreshold = 5;
private int lastVisibleItem, totalItemCount;
private Context _context;
private ArrayList<String>_listDataHeader;
private HashMap<String, ArrayList<Child>> _listDataChild;
private HashMap<String, ArrayList<Child>> _listDataChildTemp;
//= new HashMap <String, ArrayList<Child>>();
public Expandable_adapter(Context context, ArrayList<String> listDataHeader, HashMap<String, ArrayList<Child>> listDataChild) {
this._context = context;
this._listDataHeader = listDataHeader;
this._listDataChild = listDataChild;
this._listDataChildTemp = new HashMap<String, ArrayList<Child>>();
_listDataChildTemp.putAll(_listDataChild);
}
@Override
public Object getChild(int groupPosition, int childPosition) {
return this._listDataChild.get(this._listDataHeader.get(groupPosition)).get(childPosition);
}
@Override
public long getChildId(int groupPosition, int childPosition) {
return childPosition;
}
@Override
public View getChildView(int groupPosition, final int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {
//final String childText = (String) getChild(groupPosition, childPosition);
Child child = (Child) getChild(groupPosition, childPosition);
if (convertView == null) {
LayoutInflater layoutInflater = (LayoutInflater) this._context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = layoutInflater.inflate(R.layout.list_child, null);
}
TextView expandedListTextView = (TextView) convertView.findViewById(R.id.tv_listchild);
ImageView image = (ImageView) convertView.findViewById(R.id.img);
image.setImageBitmap(child.getImage());
ImageView image2 = (ImageView) convertView.findViewById(R.id.img2);
image2.setImageBitmap(child.getImage());
String toto = " ";
String toto1 = " ";
if (child.getName() != null) {
toto = child.getName();
}
else {
toto = "";
}
if (child.getSubject() != null) {
toto1 = child.getSubject();
}
else {
toto1 = "";
}
expandedListTextView.setText(Html.fromHtml(toto + " " + toto1));
//expandedListTextView.setText(Html.fromHtml(childText));
expandedListTextView.setMovementMethod(LinkMovementMethod.getInstance());
return convertView;
}
@Override
public int getChildrenCount(int groupPosition) {
return this._listDataChild.get(this._listDataHeader.get(groupPosition)).size();
}
@Override
public Object getGroup(int groupPosition) {
return this._listDataHeader.get(groupPosition);
}
@Override
public int getGroupCount() {
return this._listDataHeader.size();
}
@Override
public long getGroupId(int groupPosition) {
return groupPosition;
}
@Override
public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {
String headerTitle = (String) getGroup(groupPosition);
if (convertView == null) {
LayoutInflater layoutInflater = (LayoutInflater) this._context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = layoutInflater.inflate(R.layout.list_group, null);
}
TextView listTitle = (TextView) convertView.findViewById(R.id.tv_listtitle);
listTitle.setTypeface(null, Typeface.BOLD);
listTitle.setText(headerTitle);
return convertView;
}
@Override
public boolean hasStableIds() {
return false;
}
@Override
public boolean isChildSelectable(int groupPosition, int childPosition) {
return true;
}
public void filter (String text) {
_listDataChild.clear();
//HashSet<String> headerData = new HashSet<String>();
//Map<String, String> map = new HashMap<String, String>();
//HashMap<String, ArrayList<Child>> _listDataChildTemp = new HashMap<String, ArrayList<Child>>();
ArrayList<Child> testData = null;
//Child testData = null;
if(text.isEmpty()){
_listDataChildTemp.putAll(_listDataChild);
}
else {
for (Map.Entry <String, ArrayList<Child>> entry : _listDataChildTemp.entrySet()) {
String key = entry.getKey();
testData = new ArrayList<Child>();
if(testData.getClass().getName().toLowerCase().contains(text.toLowerCase())){
_listDataChild.put(key,testData);
}
}
}
notifyDataSetChanged();
}
}
子类
import android.graphics.Bitmap;
public class Child {
private String Name;
private String Subject;
private Bitmap Image;
private Bitmap Image2;
public String getName() {
return Name;
}
public void setName(String Name) {
this.Name = Name;
}
public String getSubject() {
return Subject;
}
public void setSubject(String Subject) {
this.Subject = Subject;
}
public Bitmap getImage() {
return Image;
}
public void setImage(Bitmap Image) {
this.Image = Image;
}
}
fragment 类
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import org.json.JSONArray;
import org.json.JSONObject;
import android.app.Dialog;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Handler;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.app.ProgressDialog;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v4.view.MenuItemCompat;
import android.util.Base64;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ExpandableListAdapter;
import android.widget.ExpandableListView;
import android.widget.ExpandableListView.OnChildClickListener;
import android.widget.ExpandableListView.OnGroupClickListener;
import android.widget.ExpandableListView.OnGroupCollapseListener;
import android.widget.ExpandableListView.OnGroupExpandListener;
import android.widget.ImageView;
import android.widget.SearchView;
import android.widget.TextView;
import android.widget.Toast;
import com.genesysci.leo.R;
import com.genesysci.leo.activity.MainActivity;
import com.genesysci.leo.models.Expandable_adapter;
import com.genesysci.leo.others.Child;
import com.genesysci.leo.others.HttpHandler;
public class UrielFragment extends Fragment{
private static final String TAG = HttpHandler.class.getSimpleName();
String url = "http://192.168.8.100/Android/jsonData.php";
private ProgressDialog mprocessingdialog;
private TextView tv_welcomeuser, tv_recentupdate;
ExpandableListAdapter expandableListAdapter;
private ExpandableListView exp_leaseoffer;
private ArrayList<String> listDataHeader;
View rootView;
ImageView image;
private HashMap<String, ArrayList<Child>> listDataChild;
Dialog dialog;
String flash = "";
private void save() {
Toast.makeText(getActivity(), ".............", Toast.LENGTH_SHORT).show();
}
private ArrayAdapter<String> adapter;
public class Wrapper {
Void result;
Bitmap decodedByte;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
setHasOptionsMenu(true);
rootView = inflater.inflate(R.layout.wellcome_page, container, false);
//tv_welcomeuser = (TextView) rootView.findViewById(R.id.tv_welcomeuser);
//tv_recentupdate = (TextView) rootView.findViewById(R.id.tv_recentupdate);
//FloatingActionButton fab = (FloatingActionButton) rootView.findViewById(R.id.fab);
//fab.setTitle("Familie");
//fab.setImageDrawable(ContextCompat.getDrawable(getActivity(), R.drawable.allan1));
//fab.setIcon(R.drawable.world_map);
//fab.setSize(FloatingActionButton.SIZE_MINI);
//fab.setColorNormalResId(R.color.red);
//fab.setColorPressedResId(R.color.black_semi_transparent);
image = (ImageView) rootView.findViewById(R.id.img);
exp_leaseoffer = (ExpandableListView) rootView.findViewById(R.id.lvExp);
exp_leaseoffer.setGroupIndicator(null);
exp_leaseoffer.setChildIndicator(null);
exp_leaseoffer.setChildDivider(getResources().getDrawable(R.color.white));
exp_leaseoffer.setDividerHeight(0);
exp_leaseoffer.setTextFilterEnabled(true);
SearchView searchview = (SearchView) rootView.findViewById(R.id.search);
searchview.setIconifiedByDefault(false);
searchview.setSubmitButtonEnabled(true);
searchview.setQueryRefinementEnabled(false);
searchview.setQueryHint("Search");
searchview.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String text) {
//can't resolve method filter
expandableListAdapter.filter(text);
return false;
}
@Override
public boolean onQueryTextChange(String text) {
//can't resolve method filter
expandableListAdapter.filter(text);
return false;
}
});
/*fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
new DownloadJason().execute();
}
});*/
new DownloadJason().execute();
return rootView;
}
private class DownloadJason extends AsyncTask<Void, Void, Wrapper> {
String jsonstr = null;
@Override
protected void onPreExecute() {
super.onPreExecute();
mprocessingdialog = new ProgressDialog(getActivity());
//mprocessingdialog.setTitle(" Veuillez patienter...");
mprocessingdialog.setMessage("chargement...");
mprocessingdialog.setIndeterminate(false);
mprocessingdialog.show();
}
@Override
protected Wrapper doInBackground(Void... arg0) {
Wrapper w = new Wrapper();
listDataHeader = new ArrayList<String>();
HttpHandler jp = new HttpHandler();
try {
// test si serveur joignable
URL urlServer = new URL("http://192.168.8.100");
HttpURLConnection urlConn = (HttpURLConnection) urlServer.openConnection();
urlConn.setConnectTimeout(3000); //<- 3Seconds Timeout
urlConn.connect();
// si bon code recu
if (urlConn.getResponseCode() == 200) {
try {
jsonstr = jp.makeServiceCall(url);
writeToFile(jsonstr);
} catch ( NullPointerException e) {
Log.e(TAG, "Exception: " + e.getMessage());
}
}
}
catch (IOException e1) {
Log.e(TAG, "IOException: " + e1.getMessage());
}
try {
// essai lecture locale
jsonstr = readFromFile();
}
catch ( NullPointerException e) {
Log.e(TAG, "NullPointerException: " + e.getMessage());
}
listDataHeader = new ArrayList<String>();
listDataChild = new HashMap<String, ArrayList<Child>>();
if (jsonstr != null) {
try {
JSONObject jobj = new JSONObject(jsonstr);
JSONArray jarray = jobj.getJSONArray("data");
for (int hk = 0; hk < jarray.length(); hk++) {
JSONObject d = jarray.getJSONObject(hk);
String mimi = d.getString("phone_number");
if (mimi.equalsIgnoreCase("600")) {
flash = "FoudreNoire";
}
else {
flash = "Maracaibo";
}
// Adding Header data
listDataHeader.add(d.getString("name"));
// Adding child data for lease offer
ArrayList<Child> lease_offer = new ArrayList<Child>();
Child ch = new Child();
Child ch2 = new Child();
Child ch3 = new Child();
ch.setName(d.getString("name"));
ch3.setSubject(d.getString("subject"));
String image = d.getString("phone_number");
byte[] decodedString = Base64.decode(image, Base64.DEFAULT);
Bitmap decodedByte = BitmapFactory.decodeByteArray(decodedString, 0,decodedString.length);
ch2.setImage(decodedByte);
//lease_offer.add(d.getString("name") + " " + flash + " " + d.getString("id"));
//lease_offer.add(d.getString("subject"));
//lease_offer.add("Contacts : "+d.getString("phone_number"));
lease_offer.add(ch);
lease_offer.add(ch2);
lease_offer.add(ch3);
// Header into Child data
listDataChild.put(listDataHeader.get(hk), lease_offer);
}
}
catch (Exception e) {
Log.e(TAG, "Exception: " + e.getMessage());
//afficher notification acces internet requis
notifyNoConnection();
}
}
else {
Log.d("Json url view", "Empty");
// Server call failed
}
return w;
}
private void writeToFile(String data) {
try {
OutputStreamWriter osw = new OutputStreamWriter(getActivity().openFileOutput("18621", Context.MODE_PRIVATE));
osw.write(data);
osw.close();
}
catch (IOException e) {
Log.e("Exception", "File write failed: " + e.toString());
}
}
private String readFromFile() {
String ret = "";
try {
InputStream inputStream = getActivity().openFileInput("18621");
if ( inputStream != null ) {
InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
String receiveString = "";
StringBuilder stringBuilder = new StringBuilder();
while ( (receiveString = bufferedReader.readLine()) != null ) {
stringBuilder.append(receiveString);
}
inputStream.close();
ret = stringBuilder.toString();
}
} catch (FileNotFoundException e) {
Log.e("login activity", "File not found: " + e.toString());
} catch (IOException e) {
Log.e("login activity", "Can not read file: " + e.toString());
}
return ret;
}
private void notifyNoConnection() {
Handler handler = new Handler(getActivity().getMainLooper());
handler.post( new Runnable(){
public void run(){
noConnection();
}
});
}
@Override
protected void onPostExecute(Wrapper w) {
super.onPostExecute(w);
mprocessingdialog.dismiss();
expandableListAdapter = new Expandable_adapter(getActivity(), listDataHeader, listDataChild);
Log.i("groups", listDataHeader.toString());
exp_leaseoffer.setAdapter(expandableListAdapter);
exp_leaseoffer.setOnGroupClickListener(new OnGroupClickListener() {
@Override
public boolean onGroupClick(ExpandableListView parent, View v, int groupPosition, long id) {
return false;
}
});
// Listview Group expanded listener
exp_leaseoffer.setOnGroupExpandListener(new OnGroupExpandListener() {
int previousItem = -1;
@Override
public void onGroupExpand(int groupPosition) {
if(groupPosition != previousItem )
exp_leaseoffer.collapseGroup(previousItem );
previousItem = groupPosition;
}
});
exp_leaseoffer.setOnGroupCollapseListener(new OnGroupCollapseListener() {
@Override
public void onGroupCollapse(int groupPosition) {
// Toast.makeText(getActivity().getApplicationContext(), listDataHeader.get(groupPosition) + " Collapsed", Toast.LENGTH_SHORT).show();
}
});
exp_leaseoffer.setOnChildClickListener(new OnChildClickListener() {
@Override
public boolean onChildClick(ExpandableListView parent, View v, int groupPosition, int childPosition, long id) {
return false;
}
});
}
@Override
protected void onCancelled() {
}
}
public void openDialog() {
dialog = new Dialog(getActivity());
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
dialog.setContentView(R.layout.dialog);
dialog.setCancelable(false);
TextView m = (TextView) dialog.findViewById(R.id.dialog_info);
m.setText(R.string.dialog_text);
final Button n = (Button) dialog.findViewById(R.id.dialog_cancel);
final Button p = (Button) dialog.findViewById(R.id.dialog_ok);
dialog.show();
n.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View arg0) {
dialog.dismiss();
}
});
p.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View arg0) {
getActivity().finish();
}
});
}
public void noConnection() {
dialog = new Dialog(getActivity());
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
dialog.setContentView(R.layout.dialog_retry);
dialog.setCancelable(false);
TextView m = (TextView) dialog.findViewById(R.id.retry_dialog);
m.setText(R.string.dialog_text_no_connection);
final Button n = (Button) dialog.findViewById(R.id.retry_retry);
final Button p = (Button) dialog.findViewById(R.id.retry_close);
dialog.show();
n.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View arg0) {
new DownloadJason().execute();
dialog.dismiss();
}
});
p.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View arg0) {
getActivity().finish();
}
});
}
}
最佳答案
请尝试这个,我认为它可以解决您的问题
SearchView searchview= (SearchView)viewlayout.findViewById(R.id.searchview);
searchview.setIconifiedByDefault(false);
searchview.setSubmitButtonEnabled(true);
searchview.setQueryRefinementEnabled(false);
searchview.setQueryHint("Search by name");
searchview.setImeOptions(EditorInfo.IME_ACTION_GO);
searchview.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
if(unCapAdapter!=null){
adapter.filter(query);// add filter method in your adapter
}
return false;
}
@Override
public boolean onQueryTextChange(String query) {
adapter.filter(query);
return false;
}
});
//您的适配器代码
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import android.content.Context;
import android.graphics.Typeface;
import android.text.Html;
import android.text.method.LinkMovementMethod;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseExpandableListAdapter;
import android.widget.ImageView;
import android.widget.TextView;
import com.genesysci.leo.R;
import com.genesysci.leo.others.Child;
public class Expandable_adapter extends BaseExpandableListAdapter{
private final int VIEW_ITEM = 1;
private final int VIEW_PROG = 0;
// The minimum amount of items to have below your current scroll position
// before loading more.
private int visibleThreshold = 5;
private int lastVisibleItem, totalItemCount;
private Context _context;
private ArrayList<String>_listDataHeader;
private HashMap<String, List<Child>> _listDataChild;
private HashMap<String, ArrayList<Child>> _listDataChildTemp=new HashMap<String, ArrayList<Child>>();
public Expandable_adapter(Context context, ArrayList<String> listDataHeader, HashMap<String, List<Child>> listDataChild) {
this._context = context;
this._listDataHeader = listDataHeader;
this._listDataChild = listDataChild;
_listDataChildTemp.putAll(listChildData);
}
@Override
public Object getChild(int groupPosition, int childPosition) {
return this._listDataChild.get(this._listDataHeader.get(groupPosition)).get(childPosition);
}
@Override
public long getChildId(int groupPosition, int childPosition) {
return childPosition;
}
@Override
public View getChildView(int groupPosition, final int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {
//final String childText = (String) getChild(groupPosition, childPosition);
Child child = (Child) getChild(groupPosition, childPosition);
if (convertView == null) {
LayoutInflater layoutInflater = (LayoutInflater) this._context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = layoutInflater.inflate(R.layout.list_child, null);
}
TextView expandedListTextView = (TextView) convertView.findViewById(R.id.tv_listchild);
ImageView image = (ImageView) convertView.findViewById(R.id.img);
image.setImageBitmap(child.getImage());
ImageView image2 = (ImageView) convertView.findViewById(R.id.img2);
image2.setImageBitmap(child.getImage());
String toto = " ";
String toto1 = " ";
if (child.getName() != null) {
toto = child.getName();
}
else {
toto = "";
}
if (child.getSubject() != null) {
toto1 = child.getSubject();
}
else {
toto1 = "";
}
expandedListTextView.setText(Html.fromHtml(toto + " " + toto1));
//expandedListTextView.setText(Html.fromHtml(childText));
expandedListTextView.setMovementMethod(LinkMovementMethod.getInstance());
return convertView;
}
@Override
public int getChildrenCount(int groupPosition) {
return this._listDataChild.get(this._listDataHeader.get(groupPosition)).size();
}
@Override
public Object getGroup(int groupPosition) {
return this._listDataHeader.get(groupPosition);
}
@Override
public int getGroupCount() {
return this._listDataHeader.size();
}
@Override
public long getGroupId(int groupPosition) {
return groupPosition;
}
@Override
public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {
String headerTitle = (String) getGroup(groupPosition);
if (convertView == null) {
LayoutInflater layoutInflater = (LayoutInflater) this._context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = layoutInflater.inflate(R.layout.list_group, null);
}
TextView listTitle = (TextView) convertView.findViewById(R.id.tv_listtitle);
listTitle.setTypeface(null, Typeface.BOLD);
listTitle.setText(headerTitle);
return convertView;
}
@Override
public boolean hasStableIds() {
return false;
}
@Override
public boolean isChildSelectable(int groupPosition, int childPosition) {
return true;
}
public void filter(String text){
_listDataChild.clear();
HashSet<String> headerData=new HashSet<String>();
ArrayList<Child> testData=null;
if(text.isEmpty()){
_listDataChild.putAll(_listDataChildTemp);
}else{
for (Map.Entry<String, ArrayList<Child>> entry : _listDataChildTemp.entrySet()) {
String key = entry.getKey();
testData=new ArrayList<Child>();
if(testData.getName().toLowerCase().contains(text.toLowerCase())){
_listDataChild.put(key,testData);
}
}
}
notifyDataSetChanged();
}
}
关于java - Android搜索(EditText)功能在fragment ExpandableListView中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41476401/