AsynTask를 이용해서 Json 파싱한 내용을 리스트뷰에 뿌린후에
리스트뷰 검색을 응용하고 싶습니다.
현재 상태로는 ListViewAdapter에서 필터를 만들어서 하는건데 이게 검색어를 입력하면 리스트뷰에 뜨지를 않습니다.
아마도 파싱한 내용을 onPostExecute에서 진행하는데 이게 안맞아서 그런것 같아요 ㅠㅠ
파싱한 리스트뷰를 검색하고 싶을때는 어떻게 해야될까요??
public class MainActivity extends Activity {
ListView list;
EditText editSearch;
JsonListAdapter adapter;
ArrayList<JsonBean> arraylist = new ArrayList<JsonBean>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.jong_vet_main);
list = (ListView) findViewById(R.id.list);
// 검색
new ReadJsonParser()
.execute("파싱할사이트");
adapter = new JsonListAdapter(this, arraylist);
list.setAdapter(adapter);
editSearch = (EditText) findViewById(R.id.search_edit);
editSearch.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before,
int count) {
// TODO Auto-generated method stub
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
// TODO Auto-generated method stub
}
@Override
public void afterTextChanged(Editable s) {
// TODO Auto-generated method stub
String text = editSearch.getText().toString()
.toLowerCase(Locale.getDefault());
adapter.filter(text);
}
});
}
private class ReadJsonParser extends AsyncTask<String, String, String> {
@Override
protected String doInBackground(String... urls) {
HttpClient httpclient = new DefaultHttpClient();
StringBuilder builder = new StringBuilder();
HttpPost httppost = new HttpPost(urls[0]);
try {
HttpResponse response = httpclient.execute(httppost);
StatusLine statusLine = response.getStatusLine();
int statusCode = statusLine.getStatusCode();
if (statusCode == 200) {
HttpEntity entity = response.getEntity();
InputStream content = entity.getContent();
BufferedReader reader = new BufferedReader(
new InputStreamReader(content, "euc-kr"));
String line;
while ((line = reader.readLine()) != null) {
builder.append(line);
}
}
} catch (Exception e) {
e.printStackTrace();
}
Log.i("!!!", builder.toString());
return builder.toString();
}
@Override
protected void onPostExecute(String result) {
try {
//check
arraylist.clear();
JSONArray petHospitalArray = new JSONArray(result);
for (int i = 0; i < petHospitalArray.length(); i++) {
JSONObject jObject = petHospitalArray.getJSONObject(i);
JsonBean mJson = new JsonBean();
String latitude = "";
String longitude = "";
String name = "";
String address = "";
String tel = "";
latitude = jObject.getString("위도");
longitude = jObject.getString("경도");
name = jObject.getString("병원명");
address = jObject.getString("소재지도로명주소");
tel = jObject.getString("연락처");
mJson.setLatitude(latitude);
mJson.setLongitude(longitude);
mJson.setName(name);
mJson.setAddress(address);
mJson.setTel(tel);
arraylist.add(mJson);
}
adapter.notifyDataSetChanged();
} catch (JSONException e) {
e.printStackTrace();
}
}
}
}
public class JsonListAdapter extends BaseAdapter {
Context mContext;
LayoutInflater inflater;
private List<JsonBean> myjsonlist = null;
private ArrayList<JsonBean> arraylist;
public JsonListAdapter(Context context, List<JsonBean> myjsonlist) {
mContext = context;
this.myjsonlist = myjsonlist;
inflater = LayoutInflater.from(mContext);
this.arraylist = new ArrayList<JsonBean>();
this.arraylist.addAll(myjsonlist);
}
public class ViewHolder {
TextView latitudeText;
TextView longitudeText;
TextView nameText;
TextView addressText;
TextView tellText;
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return myjsonlist.size();
}
@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return myjsonlist.get(position);
}
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return position;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
final ViewHolder holder;
if (convertView == null) {
holder = new ViewHolder();
convertView = inflater.inflate(R.layout.jong_vetlist, null);
// Locate the Textviews
holder.latitudeText = (TextView) convertView
.findViewById(R.id.latitude_text);
holder.longitudeText = (TextView) convertView
.findViewById(R.id.longitude_text);
holder.nameText = (TextView) convertView
.findViewById(R.id.name_text);
holder.addressText = (TextView) convertView
.findViewById(R.id.address_text);
holder.tellText = (TextView) convertView
.findViewById(R.id.tel_text);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
// Set the results into TextViews
holder.latitudeText.setText(myjsonlist.get(position).getLatitude());
holder.longitudeText.setText(myjsonlist.get(position).getLongitude());
holder.nameText.setText(myjsonlist.get(position).getName());
holder.addressText.setText(myjsonlist.get(position).getAddress());
holder.tellText.setText(myjsonlist.get(position).getTel());
final String name = myjsonlist.get(position).getName();
final String latitude = myjsonlist.get(position).getLatitude();
final String longitude = myjsonlist.get(position).getLongitude();
final String address = myjsonlist.get(position).getAddress();
final String tel = myjsonlist.get(position).getTel();
convertView.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Intent intent = new Intent(mContext,
jong.example.jsonex.HospitalContentActivity.class);
intent.putExtra("latitude", (myjsonlist.get(position).getLatitude()));
intent.putExtra("longitude", (myjsonlist.get(position).getLongitude()));
intent.putExtra("name", (myjsonlist.get(position).getName()));
intent.putExtra("address", (myjsonlist.get(position).getAddress()));
intent.putExtra("tel", (myjsonlist.get(position).getTel()));
mContext.startActivity(intent);
}
});
return convertView;
}
// Filter Class
public void filter(String charText) {
charText = charText.toLowerCase(Locale.getDefault());
myjsonlist.clear();
if (charText.length() == 0) {
myjsonlist.addAll(arraylist);
} else {
for (JsonBean jb : arraylist) {
if (jb.getName().toLowerCase(Locale.getDefault())
.contains(charText)) {
myjsonlist.add(jb);
}
}
}
notifyDataSetChanged();
}
}