Recent Posts
Recent Comments
Link
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
Archives
Today
Total
관리 메뉴

KKGRAM

android studio 검색되는 리스트 뷰 만들기 본문

개발

android studio 검색되는 리스트 뷰 만들기

kkgram 2016. 1. 17. 06:04




이시간에 모하는건가.. 어쨌든 어플 개발하면서 정리할게 필요해서 블로그 시작했다. 처음이니까 열심히 적어야지. 안드로이드 시작한지는 아직 반년 정도밖에 되지 않았는데 모르는거 투성이다. 맨날 그 전 플젝 뒤져가면서 하는데도 매번 소스를 볼 때마다 초면이다. 안녕하세요. 리스트뷰. 초면입니다. 안녕하세요. 어댑터.. 음.. 초면이네요... 으응..뭐라구.. 커스텀해서 리스트뷰 짜라고..? 응... 초면인데... (분명 그 전 플젝에서 했다.) 그래서 앞으로 더이상 초면이고 싶지 않아서 지금 개발하면서 정리한다. 흑흑... 집중도 떨어지겠지만 뭐.. 어쩔 수 없잖아.. 내가.. 이렇게 하지 않으면 기억을 못 하는걸.. 소스는 부분부분만 가져다 놔서 보기엔 불편할지두 머른당.. 


나만..알아보면..되는..목적..인..셈...



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;
    }
}



여섯시가 지나간다... 이쯤 하니 좀비가 되어가는 것 같다... 

자고 일어나서 마저 해야지.. 그래도.. 나름.. 많이해따.. 

개발시간은 한두시간밖에 안되고 삽질하느라 모든 시간을 다 날려버린다..흐윽... 초보힘들다...



Comments