【发布时间】:2018-01-30 16:36:55
【问题描述】:
我已经处理了很长一段时间的应用程序,并且即将完成,但我需要最后一件事的帮助。
在这个应用程序中,用户可以输入name of client、mobile number of client 和email id of client,所有这些信息都会存储到在线数据库中。我有一个生成 JSON 文件的 PHP 文件,我的应用程序获取此 JSON 文件并将其内容设置为 listview。
这是我的 ListActivity,它有一个负责获取 JSON 文件的子类
public class ListActivity extends AppCompatActivity implements MaterialSearchView.OnQueryTextListener {
String json_string;
ListDataAdapter listDataAdapter;
MaterialSearchView materialSearchView;
DataProvider dataProvider;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_list);
Toolbar searching = (Toolbar)findViewById(R.id.searchBar);
setSupportActionBar(searching);
getSupportActionBar().setTitle("Search");
searching.setTitleTextColor(Color.parseColor("#ffffff"));
materialSearchView = (MaterialSearchView)findViewById(R.id.search_view);
final ListView listView = (ListView) findViewById(R.id.list_view);
listDataAdapter = new ListDataAdapter(getApplicationContext(),R.layout.row_layout);
listView.setAdapter(listDataAdapter);
Log.e("data=======", String.valueOf(listDataAdapter));
new GetJSONfile().execute();
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
DataProvider dataProvider = (DataProvider) listDataAdapter.getItem(i);
int idofclient = dataProvider.getId();
String nameOfClient = dataProvider.getName();
String mobileOfClient = dataProvider.getMob();
String emailOfClient = dataProvider.getEmail();
Intent calAct = new Intent(ListActivity.this, UserProfile.class);
Bundle bundle = new Bundle();
bundle.putInt("idofCC", (idofclient));
bundle.putString("name", nameOfClient);
bundle.putString("mobile", mobileOfClient);
bundle.putString("email", emailOfClient);
calAct.putExtras(bundle);
startActivity(calAct);
}
});
}
@Override
public boolean onQueryTextSubmit(String s) {
return false;
}
@Override
public boolean onQueryTextChange(String newText) {
newText = newText.toLowerCase();
ArrayList<DataProvider> dataProvider2 = new ArrayList<>();
//dataProvider is your data which is provide to adapter in onPostExecute
// so make it as global variable so you can access it
for (DataProvider dp : listDataAdapter) {
String name = dp.getName().toLowerCase();
if (name.contains(newText)) {
dataProvider2.add(dp);
}
}
listDataAdapter.setFilter(dataProvider2);
return true;
}
public class GetJSONfile extends AsyncTask<Void, Void, String> {
String url_get;
String jsondata;
@Override
protected void onPreExecute() {
url_get = "http://10.0.2.2/webapp/jasonclient.php";
}
@Override
protected String doInBackground(Void... voids) {
try {
URL url = new URL(url_get);
HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
InputStream inputStream = httpURLConnection.getInputStream();
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
StringBuilder stringBuilder = new StringBuilder();
while((jsondata = bufferedReader.readLine())!=null){
stringBuilder.append(jsondata+"\n");
}
bufferedReader.close();
inputStream.close();
httpURLConnection.disconnect();
Log.e("Tag =============", String.valueOf(stringBuilder));
return stringBuilder.toString();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onProgressUpdate(Void... values) {
super.onProgressUpdate(values);
}
@Override
protected void onPostExecute(String jsonResult) {
json_string = jsonResult;
try{
JSONObject jsonn = new JSONObject(json_string);
JSONArray jsonArray = jsonn.getJSONArray("clientinfo");
int count = 0;
while(count<jsonArray.length()){
JSONObject JO = jsonArray.getJSONObject(count);
int id = JO.getInt("client_id");
String name = JO.getString("client_name");
String mobile = JO.getString("client_mobile");
String email = JO.getString("client_email");
Log.e("nameeeeeeeee==========",name);
Log.e("mobileeeeeee==========",mobile);
Log.e("emaillllllll==========",email);
dataProvider = new DataProvider(id,name,mobile,email);
Log.e("tag==================", String.valueOf(dataProvider));
listDataAdapter.add(dataProvider);
count++;
}
} catch (JSONException e) {
}
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu,menu);
MenuItem menuItem = menu.findItem(R.id.ActionSearchView);
materialSearchView.setMenuItem(menuItem);
materialSearchView.setOnQueryTextListener(this);
return true;
}
}
以下是我的 ListDataAdapter 类
public class ListDataAdapter extends ArrayAdapter {
List list = new ArrayList();
public ListDataAdapter( Context context, int resource) {
super(context, resource);
}
static class LayoutHandler {
TextView ID,NAME,MOB,EMAIL;
}
@Override
public void add(Object object) {
super.add(object);
list.add(object);
}
@Override
public int getCount() {
return list.size();
}
@Override
public Object getItem(int position) {
return list.get(position);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View row = convertView;
LayoutHandler layoutHandler;
if(row == null){
LayoutInflater layoutInflater = (LayoutInflater) this.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
row = layoutInflater.inflate(R.layout.row_layout,parent,false);
layoutHandler = new LayoutHandler();
layoutHandler.NAME = (TextView) row.findViewById(R.id.text_user_name);
row.setTag(layoutHandler);
}else{
layoutHandler = (LayoutHandler) row.getTag();
}
DataProvider dataProvider = (DataProvider) this.getItem(position);
layoutHandler.NAME.setText(dataProvider.getName());
return row;
}
public void setFilter(ArrayList<DataProvider> dataProvider2)
{
//dataProvider is your List which is used in constructor of adapter
//class
ArrayList<Object> dataProvider = new ArrayList<>();
dataProvider.addAll(dataProvider2);
notifyDataSetChanged();
}
}
这是一个示例,说明当我开始在搜索栏中输入一些字符时,我希望应用执行什么操作。
这是一个漫长的项目,所以我没有包含我所有的源代码,但是如果你需要什么,请评论,我会添加它。
【问题讨论】:
-
你可以通过两种方式来做这些事情,要么将所有列表数据存储在 sqlite 上,要么在 edittext 上搜索时从 sqlite 获取数据,或者通过每个字符的 json 请求? @TanavSharma
-
@AmrBerag 你怎么能说这是你提到的问题的重复?
-
@Abhishekkumar 你真的读了吗?
-
您的适配器类是否扩展了
BaseAdapter? -
@Yupi 不,它没有延伸到那个.. 它延伸到
ArrayAdapter