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 |