KKGRAM
android studio 검색되는 리스트 뷰 만들기 본문
이시간에 모하는건가.. 어쨌든 어플 개발하면서 정리할게 필요해서 블로그 시작했다. 처음이니까 열심히 적어야지. 안드로이드 시작한지는 아직 반년 정도밖에 되지 않았는데 모르는거 투성이다. 맨날 그 전 플젝 뒤져가면서 하는데도 매번 소스를 볼 때마다 초면이다. 안녕하세요. 리스트뷰. 초면입니다. 안녕하세요. 어댑터.. 음.. 초면이네요... 으응..뭐라구.. 커스텀해서 리스트뷰 짜라고..? 응... 초면인데... (분명 그 전 플젝에서 했다.) 그래서 앞으로 더이상 초면이고 싶지 않아서 지금 개발하면서 정리한다. 흑흑... 집중도 떨어지겠지만 뭐.. 어쩔 수 없잖아.. 내가.. 이렇게 하지 않으면 기억을 못 하는걸.. 소스는 부분부분만 가져다 놔서 보기엔 불편할지두 머른당..
나만..알아보면..되는..목적..인..셈...
list_location_item.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/txt_location"
android:padding="15dp"
android:textSize="16sp"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
activity_main.xml
<EditText android:id="@+id/txt_search" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_margin="5dp" android:drawableLeft="@mipmap/ic_search" android:hint="동명(읍,면)을 입력 해 주세요. 예)봉명, 봉명동" android:textSize="12sp" android:singleLine="true" /> <ListView android:id="@+id/location_list" android:layout_width="wrap_content" android:layout_height="wrap_content" </ListView>
MainActivity.java
ArrayAdapter<String> search_adapter;
EditText txt_search;
ArrayList<HashMap<String, String>> locationtList;
ListView locationListView;
@Override
protected void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
String location[] = new String[] { "서울","대전","대구","부산","인천","전북","전남" };
locationListView = (ListView) findViewById(R.id.location_list);
txt_search = (EditText) findViewById(R.id.txt_search);
search_adapter = new ArrayAdapter<String>(this, R.layout.list_location_item, R.id.txt_location, location);
locationListView.setAdapter(search_adapter);
txt_search.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence cs, int arg1, int arg2, int arg3) {
MainActivity.this.search_adapter.getFilter().filter(cs);
}
@Override
public void beforeTextChanged(CharSequence arg0, int arg1, int arg2,int arg3) { }
@Override
public void afterTextChanged(Editable arg0) { }
});
}
여기까지 하면 입력되는 텍스트에 따라서 리스트뷰 아이템이 검색되는데, 나는 중간값을 입력해도 검색이 되는게 좋다.
사용자가 첫 글자가 뭘로 시작하는지 어찌 안단 말인가. 데이터가 몇 번의 스크롤로 알 수 있는게 아니라 수십, 수백 번 해야하는 거라면 맨 앞자가 뭔지 사용자는 아무것도 모른다.. 그러니까 중간검색이 필요한거지. 암.
혼자 삽질하면서 하느라 위에 소스랑 조금씩 다른 부분들이 있을 수가 있다^_ㅠ...
MainActivity.java
public class MainActivity extends BaseActivity{
LocationListAdapter search_adapter; //커스텀 어댑터
EditText txt_search; //검색창
ListView locationListView; //리스트 뷰
String location[] = new String[] { "서울","대전","대구","부산","인천","전북","전남" }; //문자열 배열
ArrayList<String> mLocationItems; //문자열 리스트
@Override
protected void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_join);
mLocationItems = new ArrayList<String>(Arrays.asList(location)); //문자열을 리스트에 넣어줌
locationListView = (ListView) findViewById(R.id.location_list);
txt_search = (EditText) findViewById(R.id.txt_search);
setLocationAdaptor();//어댑터 세팅
txt_search.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence cs, int arg1, int arg2, int arg3) {
JoinActivity.this.search_adapter.getFilter().filter(cs);
}
@Override
public void beforeTextChanged(CharSequence arg0, int arg1, int arg2,int arg3) { }
@Override
public void afterTextChanged(Editable arg0) { }
});
}
private class LocationPop extends AsyncTask<ArrayList<String>, Void, Void> {
@Override
protected void onPreExecute() {
super.onPreExecute();
}
@Override
protected Void doInBackground(ArrayList<String>... params) {
mLocationItems.clear(); //리스트 초기화
ArrayList<String> items = params[0];
if (location.length > 0) {
for (String current_item : items) {
mLocationItems.add(current_item); //리스트에 추가
}
}
return null;
}
@Override
protected void onPostExecute(Void result) {
if (!isCancelled()) {
if (mLocationItems.size() <= 0) {
} else {
setLocationAdaptor(); //어댑터 세팅
}
}
super.onPostExecute(result);
}
}
private void setLocationAdaptor() {
search_adapter = new LocationListAdapter(this, mLocationItems);
locationListView.setAdapter(search_adapter);
locationListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Toast.makeText(MainActivity.this, mLocationItems.get(position), Toast.LENGTH_SHORT).show();
}
});
}
public class LocationFilter extends Filter {
@Override
protected FilterResults performFiltering(CharSequence constraint) {
String constraintStr = constraint.toString();
FilterResults result = new Filter.FilterResults();
if (constraint != null && constraint.toString().length() > 0) {
ArrayList<String> filterItems = new ArrayList<String>();
synchronized (this) {
for (String item : location) {
if (item.contains(constraintStr)) { //문자열 포함되어있는지 검색
filterItems.add(item);
}
}
result.count = filterItems.size();
result.values = filterItems;
}
} else {
synchronized (this) {
result.count = location.length;
result.values = new ArrayList<String>(Arrays.asList(location));
}
}
return result;
}
@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
ArrayList<String> filtered = (ArrayList<String>) results.values;
new LocationPop().execute(filtered);
}
}
}
주석 하나없는 소스 올리자니 내 습관 보이는 것 같아서 쥐구멍 들어가고싶따...(그래서 급하게 달음)
LocationListAdapter.java
/**
* Created by yeon on 2016-01-17.
*/
public class LocationListAdapter extends BaseAdapter {
LayoutInflater mLayoutInflater;
ArrayList<String> mListItems;
Context mContext;
public LocationListAdapter(Context context, ArrayList<String> listItems) {
this.mContext = context;
this.mListItems = listItems;
mLayoutInflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
@Override
public int getCount() {
return mListItems.size();
}
@Override
public Object getItem(int position) {
return mListItems.get(position);
}
@Override
public long getItemId(int position) {
return mListItems.get(position).hashCode();
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder = null;
if (convertView == null) {
holder = new ViewHolder();
convertView = mLayoutInflater.inflate(R.layout.list_location_item, null);
holder.textView = (TextView) convertView.findViewById(R.id.txt_location);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
holder.textView.setText(mListItems.get(position).toString());
return convertView;
}
public Filter getFilter() {
return ((JoinActivity) mContext).new LocationFilter();
}
public static class ViewHolder {
public TextView textView;
}
}
여섯시가 지나간다... 이쯤 하니 좀비가 되어가는 것 같다...
자고 일어나서 마저 해야지.. 그래도.. 나름.. 많이해따..
개발시간은 한두시간밖에 안되고 삽질하느라 모든 시간을 다 날려버린다..흐윽... 초보힘들다...
'개발' 카테고리의 다른 글
| JSONObject의 get 사용 시 NullException 처리하기 (0) | 2016.02.02 |
|---|---|
| (Object to Json) Object 를 Json 으로 변환하기 마지막엔 String로 (1) | 2016.01.25 |
| JavaScript replace를 Java replaceAll 처럼 사용하기 (0) | 2016.01.19 |
| android Studio inputType 정리 (0) | 2016.01.17 |
| Java String To JsonArray & JsonArray To String[] (0) | 2016.01.17 |