Searching in Listview with searched textcolor highlighted in Listview Android

前端 未结 4 1431
终归单人心
终归单人心 2021-01-17 04:23

I Have a listview with arrayadapter .. i need to implement this in my music application ... help me out

相关标签:
4条回答
  • 2021-01-17 04:53
    String your_val = filteredList.get(position).getYourValue();
            int startPos = your_val.indexOf(searchString.toUpperCase());
            int endPos = startPos + searchString.length();
            Spannable spanText = Spannable.Factory.getInstance().newSpannable(
                    Your_value
            );
    
            if (startPos >= 0) {
                spanText.setSpan(new ForegroundColorSpan(mContext.getResources().getColor(your_color)), startPos, endPos, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
                spanText.setSpan(new android.text.style.StyleSpan(android.graphics.Typeface.BOLD), startPos, endPos, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
            }
    
    
    
            viewHolder.tvInfo.setText(spanText);
    

    just put this code in your getView methhod of bas adapter with your value

    ad = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, abc){
                @Override
                public View getView(int position, View convertView, ViewGroup parent) {
                    String your_val = filteredList.get(position).getYourValue();
                    int startPos = your_val.indexOf(searchString.toUpperCase());
                    int endPos = startPos + searchString.length();
                    Spannable spanText = Spannable.Factory.getInstance().newSpannable(
                            Your_value
                    );
    
                    if (startPos >= 0) {
                        spanText.setSpan(new ForegroundColorSpan(mContext.getResources().getColor(your_color)), startPos, endPos, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
                        spanText.setSpan(new android.text.style.StyleSpan(android.graphics.Typeface.BOLD), startPos, endPos, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
                    }
                    viewHolder.tvInfo.setText(spanText);
                    return your_view;
                }
            };
    
    0 讨论(0)
  • 2021-01-17 04:55

    first add two function getData and set Data Search to baseadapter

       public class bsAdapter extends BaseAdapter {
        Activity cntx;
    
        public bsAdapter(Activity context) {
            // TODO Auto-generated constructor stub
            this.cntx = context;
    
        }
    
        public int getCount() {
            // TODO Auto-generated method stub
            return AllSongs.size();
        }
    
        public Object getItem(int position) {
            // TODO Auto-generated method stub
            return AllSongs.get(position);
        }
    
        public long getItemId(int position) {
            // TODO Auto-generated method stub
            return AllSongs.size();
        }
        public void setDataSearch(String data) {
                this.search = data;
        } 
    
        public String getData() {
            return this.search;
        }
    

    first declare searchData in Search_class

    public String searchData;
    private bsAdapter mAdapter;
    

    and declare

    mAdapter = new bsAdapter(this);
    

    then you add condition in text watcher

      public void onTextChanged(CharSequence s, int start, int before,
                    int count) {
                textlength = et.getText().length();
                AllSongs.clear();
                for (int i = 0; i < AllSongsArray.length; i++) {
                    if (textlength <= AllSongsArray[i].length()) {
                        if (AllSongsArray[i].toLowerCase().contains(
                                et.getText().toString().toLowerCase().trim())) {
                            AllSongs.add(AllSongsArray[i]);
                        }
                    }
                  if (textlength == 0) {
    
                         mAdapter.setDataSearch(null);
    
                    } else {
    
                        searchData = s.toString().toLowerCase();
                        mAdapter.setDataSearch(SearchData);
                    }
    
             }
                AppendList(AllSongs);
            }
    

    and then put this function in baseadapter

    public static CharSequence highlight(String search, String originalText) {
    
           String normalizedText = Normalizer.normalize(originalText, Normalizer.Form.NFD).replaceAll("\\p{InCombiningDiacriticalMarks}+", "").toLowerCase();
    
           int start = normalizedText.indexOf(search);
    
           Spannable highlighted = new SpannableString(originalText);
            if (start < 0) {
                // not found, nothing to to
                return originalText;
            } else {
    
                while (start >= 0) {
    
                    int spanStart   = Math.min(start, originalText.length());
                    int spanEnd     = Math.min(start + search.length(), originalText.length());
    
                    highlighted.setSpan(new StyleSpan(android.graphics.Typeface.BOLD), spanStart, spanEnd, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
                    highlighted.setSpan(new ForegroundColorSpan(cntx.getResources().getColor(R.color.text_color_white)), spanStart, spanEnd, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
                    start = normalizedText.indexOf(search, spanEnd);
                }
    
                return highlighted;
            }
        }
    

    and put this

    public View getView(final int position, View convertView,
                ViewGroup parent) {
            View row = null;
    
            LayoutInflater inflater = cntx.getLayoutInflater();
            row = inflater.inflate(R.layout.listview_item, null);
    
            TextView tv = (TextView) row.findViewById(R.id.tv_artist_name);
    
            if(search != null){
                    tv.setText(highlight(search,AllSongs.get(position));
                }
                else if (search == null){
                    tv.setText(AllSongs.get(position));
    
                }
    
    
            return row;
    
    0 讨论(0)
  • 2021-01-17 04:56

    Here is the Utility code that I use to highlight search key in search results,Hope this may help you to implement some part of your application

    public void setTextAndhighLightSearchKeytest(String searchKey,String searchResult, TextView textView) {
        if (!TextUtils.isEmpty(searchKey) && !TextUtils.isEmpty(searchResult)) {
            String searchResultLowerCase  = searchResult.toLowerCase(Locale.UK);
            String searchKeyLowerCase  = searchKey.toLowerCase(Locale.UK);
            int start = searchResultLowerCase.indexOf(searchKeyLowerCase);
            int end = start + searchKey.length();
    
            if (start > -1 && start < searchResult.length() && end < searchResult.length()) {
                SpannableStringBuilder builder = new SpannableStringBuilder(searchResult);
                builder.setSpan(new StyleSpan(Typeface.BOLD), start, end, Spannable.SPAN_INCLUSIVE_INCLUSIVE);
                textView.setText(builder, BufferType.SPANNABLE);
            }
        }
    }
    
    0 讨论(0)
  • 2021-01-17 05:12

    So here i got the code corrected and working fine ...

    public class SearchingClass extends ListActivity {
        EditText et;
        ListView lv;
        Context context;
        static ArrayList<String> AllSongs;
        String[] AllSongsArray;
        SongsManager songManager;
        private ArrayList<HashMap<String, String>> songsList = new ArrayList<HashMap<String, String>>();
        int textlength = 0;
        public String SearchData;
        private bsAdapter mAdapter;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_searching_class);
            et = (EditText) findViewById(R.id.EditText01);
            lv = (ListView) findViewById(android.R.id.list);
            context = getBaseContext();
            songManager = new SongsManager();
            songsList = songManager.getPlayList(context);
            AllSongs = new ArrayList<String>();
            mAdapter = new bsAdapter(this);
            for (int i = 0; i < songsList.size(); i++) {
                HashMap<String, String> obj = songsList.get(i);
    
                AllSongs.add(obj.get("songTitle"));
            }
            AllSongsArray = new String[AllSongs.size()];
            AllSongsArray = AllSongs.toArray(AllSongsArray);
            setListAdapter(new bsAdapter(this));
            et.addTextChangedListener(new TextWatcher() {
                public void afterTextChanged(Editable s) {
                }
    
                public void beforeTextChanged(CharSequence s, int start, int count,
                        int after) {
                }
    
                public void onTextChanged(CharSequence s, int start, int before,
                        int count) {
    
                    textlength = et.getText().length();
                    AllSongs.clear();
                    for (int i = 0; i < AllSongsArray.length; i++) {
                        if (textlength <= AllSongsArray[i].length()) {
                            if (AllSongsArray[i].toLowerCase().contains(
                                    et.getText().toString().toLowerCase().trim())) {
                                AllSongs.add(AllSongsArray[i]);
                            }
                        }
                        if (textlength == 0) {
    
                            mAdapter.setDataSearch(null);
    
                        } else {
    
                            SearchData = s.toString().toLowerCase();
                            mAdapter.setDataSearch(SearchData);
                        }
    
                    }
                    AppendList(AllSongs);
                }
    
            });
            lv.setOnItemClickListener(new OnItemClickListener() {
    
                @Override
                public void onItemClick(AdapterView<?> parent, View view,
                        int position, long id) {
                    // TODO Auto-generated method stub
                    Toast.makeText(getApplicationContext(), AllSongs.get(position),
                            Toast.LENGTH_SHORT).show();
                }
            });
        }
    
        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            // Inflate the menu; this adds items to the action bar if it is present.
            getMenuInflater().inflate(R.menu.searching_class, menu);
            return true;
        }
    
        public void AppendList(ArrayList<String> str) {
            setListAdapter(new bsAdapter(this));
        }
    
        @Override
        public boolean onOptionsItemSelected(MenuItem item) {
            // Handle action bar item clicks here. The action bar will
            // automatically handle clicks on the Home/Up button, so long
            // as you specify a parent activity in AndroidManifest.xml.
            int id = item.getItemId();
            if (id == R.id.action_settings) {
                return true;
            }
            return super.onOptionsItemSelected(item);
        }
    
        public static class bsAdapter extends BaseAdapter {
            static Activity cntx;
            static String search;
            String value;
    
            public bsAdapter(Activity context) {
                // TODO Auto-generated constructor stub
                this.cntx = context;
    
            }
    
            public int getCount() {
                // TODO Auto-generated method stub
                return AllSongs.size();
            }
    
            public Object getItem(int position) {
                // TODO Auto-generated method stub
                return AllSongs.get(position);
            }
    
            public long getItemId(int position) {
                // TODO Auto-generated method stub
                return AllSongs.size();
            }
    
            public void setDataSearch(String data) {
                System.out.println("recieved value" + data);
                this.search = data;
            }
    
            public String getData() {
                return this.search;
            }
    
            public View getView(final int position, View convertView,
                    ViewGroup parent) {
                View row = null;
                LayoutInflater inflater = cntx.getLayoutInflater();
                row = inflater.inflate(R.layout.listview_item, null);
                TextView tv = (TextView) row.findViewById(R.id.tv_artist_name);
                // tv.setText(AllSongs.get(position));
                System.out.println("search data value" + search);
    
                if (search != null) {
    
                    tv.setText(highlight(search, AllSongs.get(position)));
                } else if (search == null) {
                    tv.setText(AllSongs.get(position));
    
                }
    
                return row;
            }
    
            public CharSequence highlight(String search, String originalText) {
    
                String normalizedText = Normalizer
                        .normalize(originalText, Normalizer.Form.NFD)
                        .replaceAll("\\p{InCombiningDiacriticalMarks}+", "")
                        .toLowerCase();
    
                int start = normalizedText.indexOf(search);
    
                Spannable highlighted = new SpannableString(originalText);
                if (start < 0) {
                    // not found, nothing to to
                    return originalText;
                } else {
    
                    while (start >= 0) {
    
                        int spanStart = Math.min(start, originalText.length());
                        int spanEnd = Math.min(start + search.length(),
                                originalText.length());
    
                        highlighted.setSpan(new StyleSpan(
                                android.graphics.Typeface.BOLD), spanStart,
                                spanEnd, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
                        highlighted.setSpan(new ForegroundColorSpan(cntx
                                .getResources().getColor(R.color.red)), spanStart,
                                spanEnd, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
                        start = normalizedText.indexOf(search, spanEnd);
                    }
    
                    return highlighted;
                }
            }
        }
    
    0 讨论(0)
提交回复
热议问题