Java 与ArrayList结合时的searchableListView
我正在尝试创建一个可搜索的列表视图。最初,它在硬编码阵列中工作得很好。但当我使用ArrayList并用json填充它时,它现在不会显示任何搜索结果。它现在正在正确加载列表,但搜索不起作用。 这是我的密码Java 与ArrayList结合时的searchableListView,java,android,arraylist,Java,Android,Arraylist,我正在尝试创建一个可搜索的列表视图。最初,它在硬编码阵列中工作得很好。但当我使用ArrayList并用json填充它时,它现在不会显示任何搜索结果。它现在正在正确加载列表,但搜索不起作用。 这是我的密码 public class MainActivity extends AppCompatActivity { public ProgressDialog pd; Toolbar mToolbar; ArrayAdapter mAdapter; ListView mListView; TextVi
public class MainActivity extends AppCompatActivity {
public ProgressDialog pd;
Toolbar mToolbar;
ArrayAdapter mAdapter;
ListView mListView;
TextView mEmptyView;
PatientListAdapter adapter = null;
String clinic_id, response;
public BufferedReader reader = null;
public ArrayList<PatientListDetails> patientListDetailsList;
private String url = "http://192.168.2.4/projectFolder1/FetchData/getDataList.php?";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
setTitle("View Project List");
pd = new ProgressDialog(this);
pd.setIndeterminate(true);
pd.setCancelable(false);
pd.setTitle("Niramaya");
pd.setMessage("Fetching patient list. Please wait....");
mToolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(mToolbar);
mListView = (ListView) findViewById(R.id.list);
mEmptyView = (TextView) findViewById(R.id.emptyView);
new GetPatientListTask().execute(url+"cid=1");
// mAdapter = new ArrayAdapter(MainActivity.this,
// android.R.layout.simple_list_item_1,
// getResources().getStringArray(R.array.months_array));
// mListView.setAdapter(mAdapter);
//
// mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
// @Override
// public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
// Toast.makeText(MainActivity.this, adapterView.getItemAtPosition(i).toString(), Toast.LENGTH_SHORT).show();
// }
// });
//
// mListView.setEmptyView(mEmptyView);
}
private class GetPatientListTask extends AsyncTask<String,String,List<PatientListDetails>> {
List<PatientListDetails> patientDetailsList = new ArrayList<>();
@Override
protected void onPreExecute() {
super.onPreExecute();
pd.show();
}
@Override
protected List<PatientListDetails> doInBackground(String... strings) {
HttpURLConnection connection;
StringBuffer buffer = null;
JSONObject jsonObject;
JSONArray jsonArray;
try{
URL url = new URL(strings[0]);
connection = (HttpURLConnection) url.openConnection();
connection.connect();
InputStream stream = connection.getInputStream();
reader = new BufferedReader(new
InputStreamReader(stream));
buffer = new StringBuffer();
String line = "";
while((line=reader.readLine())!=null){
buffer.append(line);
}
jsonArray = new JSONArray(buffer.toString());
for(int i=0; i<jsonArray.length(); i++){
jsonObject = jsonArray.getJSONObject(i);
response = jsonObject.getString("status");
if(response.equals("0")){
PatientListDetails patientListDetails = new PatientListDetails();
patientListDetails.setStatus(jsonObject.getString("status"));
patientListDetails.setPatient_id(jsonObject.getString("patient_id"));
patientListDetails.setFull_name(jsonObject.getString("full_name"));
patientListDetails.setGender(jsonObject.getString("gender"));
//Log.e("name",jsonObject.getString("full_name"));
patientDetailsList.add(patientListDetails);
}
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (JSONException e) {
e.printStackTrace();
}
return patientDetailsList;
}
@Override
protected void onPostExecute(List<PatientListDetails> s) {
super.onPostExecute(s);
pd.dismiss();
adapter = new
PatientListAdapter(getApplicationContext(),R.layout.patient_list,s);
mListView.setAdapter(adapter);
}
}
class MyViewHolder{
TextView tvFull_name,tvGender,btn;
EditText pid;
MyViewHolder(View v){
tvFull_name = (TextView)v.findViewById(R.id.patient_name);
tvGender = (TextView)v.findViewById(R.id.patient_gender);
pid = (EditText) v.findViewById(R.id.patient_id);
btn = (TextView) v.findViewById(R.id.btn_view);
}
}
public class PatientListAdapter extends ArrayAdapter implements
Filterable{
int resource;
private LayoutInflater inflater;
public PatientListAdapter(@NonNull Context context, int resource,
@NonNull List<PatientListDetails> objects) {
super(context, resource, objects);
patientListDetailsList= (ArrayList<PatientListDetails>)
objects;
this.resource=resource;
inflater=(LayoutInflater)getSystemService(LAYOUT_INFLATER_SERVICE);
}
@NonNull
@Override
public Filter getFilter() {
return new Filter() {
@Override
protected FilterResults performFiltering(CharSequence constraint) {
return null;
}
@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
try {
patientListDetailsList = (ArrayList<PatientListDetails>) results.values;
}catch (NullPointerException e){
Log.e("Error",e.toString());
}
notifyDataSetChanged();
}
};
}
@RequiresApi(api = Build.VERSION_CODES.O)
@SuppressLint("InflateParams")
@NonNull
@Override
public View getView(final int position, @Nullable View convertView, @NonNull ViewGroup parent) {
//return super.getView(position, convertView, parent);
MyViewHolder holder = null;
if(convertView==null){
convertView = inflater.inflate(R.layout.patient_list, null);
holder = new MyViewHolder(convertView);
convertView.setTag(holder);
}
if (holder != null) {
holder.tvFull_name.setText(patientListDetailsList.get(position).getFull_name());
}
// if (holder != null) {
// holder.tvGender.setText(patientListDetailsList.get(position).getGender());
// }
// final String pat_id = patientListDetailsList.get(position).getPatient_id();
// if (holder != null) {
// holder.btn.setOnClickListener(new View.OnClickListener() {
// @Override
// public void onClick(View v) {
// }
// });
// }
return convertView;
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.actionbarmenu, menu);
MenuItem mSearch = menu.findItem(R.id.action_search);
SearchManager searchManager = (SearchManager)getSystemService(Context.SEARCH_SERVICE);
SearchView mSearchView = (SearchView) menu.findItem(R.id.action_search).getActionView();
mSearchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
mSearchView.setQueryHint("Search");
mSearchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
return false;
}
@Override
public boolean onQueryTextChange(String newText) {
adapter.getFilter().filter(newText);
return true;
}
});
return super.onCreateOptionsMenu(menu);
}
}
public类MainActivity扩展了AppCompatActivity{
公共发展对话;
工具栏工具栏;
ArrayAdapter mAdapter;
列表视图;
TextView mEmptyView;
PatientListAdapter适配器=空;
字符串clinic_id,响应;
public BufferedReader reader=null;
公共阵列列表patientListDetailsList;
专用字符串url=”http://192.168.2.4/projectFolder1/FetchData/getDataList.php?";
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
setTitle(“查看项目列表”);
pd=新进度对话框(本);
pd.SetUndeterminate(真);
pd.可设置可取消(假);
pd.setTitle(“Niramaya”);
pd.setMessage(“正在获取患者列表,请稍候…”);
mToolbar=(工具栏)findviewbyd(R.id.Toolbar);
设置支持操作栏(mToolbar);
mListView=(ListView)findViewById(R.id.list);
mEmptyView=(TextView)findViewById(R.id.emptyView);
新建GetPatientListTask().execute(url+“cid=1”);
//mAdapter=新阵列适配器(MainActivity.this,
//android.R.layout.simple\u list\u item\u 1,
//getResources().getStringArray(R.array.months_array));
//mListView.setAdapter(mAdapter);
//
//mListView.setOnItemClickListener(新的AdapterView.OnItemClickListener(){
//@覆盖
//公共无效onItemClick(AdapterView AdapterView、View视图、int i、long l){
//Toast.makeText(MainActivity.this,adapterView.getItemAtPosition(i).toString(),Toast.LENGTH_SHORT).show();
// }
// });
//
//mListView.setEmptyView(mEmptyView);
}
私有类GetPatientListTask扩展了AsyncTask{
List patientDetailsList=new ArrayList();
@凌驾
受保护的void onPreExecute(){
super.onPreExecute();
pd.show();
}
@凌驾
受保护列表doInBackground(字符串…字符串){
httpurl连接;
StringBuffer=null;
JSONObject JSONObject;
JSONArray JSONArray;
试一试{
URL=新URL(字符串[0]);
connection=(HttpURLConnection)url.openConnection();
connection.connect();
InputStream=connection.getInputStream();
读卡器=新的BufferedReader(新的
InputStreamReader(流));
buffer=新的StringBuffer();
字符串行=”;
而((line=reader.readLine())!=null){
buffer.append(行);
}
jsonArray=新的jsonArray(buffer.toString());
对于(int i=0;i如果您正在寻找基于文本匹配的过滤器,则可以使用以下代码-
@Override
protected FilterResults performFiltering(CharSequence constraint) {
String filterString = constraint.toString().toLowerCase();
FilterResults results = new FilterResults();
final List<String> list = originalData;
int count = list.size();
final ArrayList<String> nlist = new ArrayList<String>(count);
String filterableString ;
for (int i = 0; i < count; i++) {
filterableString = list.get(i);
if (filterableString.toLowerCase().contains(filterString)) {
nlist.add(filterableString);
}
}
results.values = nlist;
results.count = nlist.size();
return results;
}
@覆盖
受保护的筛选器结果性能筛选(CharSequence约束){
String filterString=constraint.toString().toLowerCase();
FilterResults results=新的FilterResults();
最终列表=原始数据;
int count=list.size();
最终ArrayList NLList=新ArrayList(计数);
串滤器串;
for(int i=0;i
如果要查找基于文本匹配的过滤器,可以使用以下代码-
@Override
protected FilterResults performFiltering(CharSequence constraint) {
String filterString = constraint.toString().toLowerCase();
FilterResults results = new FilterResults();
final List<String> list = originalData;
int count = list.size();
final ArrayList<String> nlist = new ArrayList<String>(count);
String filterableString ;
for (int i = 0; i < count; i++) {
filterableString = list.get(i);
if (filterableString.toLowerCase().contains(filterString)) {
nlist.add(filterableString);
}
}
results.values = nlist;
results.count = nlist.size();
return results;
}
@覆盖
受保护的筛选器结果性能筛选(CharSequence约束){
String filterString=constraint.toString().toLowerCase();
FilterResults results=新的FilterResults();
最终列表=原始数据;
int count=list.size();
最终ArrayList NLList=新ArrayList(计数);
串滤器串;
for(int i=0;i
您的performFiltering(CharSequence约束)
方法返回null。您应该添加一些逻辑来过滤该方法中的数据您的performFiltering(CharSequence约束)
method正在返回null。您应该添加一些逻辑来过滤该方法中的数据。originalData在这里表示什么?我得到一个null指针异常。java.lang.NullPointerException:尝试在null对象引用上为代码int count=List.size()的链接调用接口方法“int java.util.List.size();originalData
这是您从服务器获取的患者列表,originalData在这里代表什么?我得到一个空指针异常。java.lang.NullPointerException:尝试在空对象引用上为代码int count=list.size()的链接调用接口方法“int java.util.list.size()”;originalData
这是您从服务器获取的患者列表