2015-03-12 3 views
0

У меня есть listview и вы хотите найти текст из него. Я сделал это успешно, но теперь я хочу найти элемент и выделить искомый текст в списке. Это моя функция фильтра в ListViewAdapter:Выделите искомый текст в пользовательском списке адаптеров

public void filter(String charText) { 

    charText = charText.toLowerCase(Locale.getDefault()); 
    worldpopulationlist.clear(); 
    if (charText.length() == 0) { 
     worldpopulationlist.addAll(arraylist); 
    } 
    else 
    { 
     for (WorldPopulation wp : arraylist) 
     { 
      // Find charText in wp 
      int startPos = wp.getCountry().toLowerCase(
        Locale.getDefault()).indexOf(charText.toLowerCase(Locale.getDefault())); 
      int endPos = startPos + charText.length(); 
      if (startPos != -1) 
      { 
        Spannable spannable = new SpannableString(wp.getCountry()); 
        ColorStateList blueColor = new ColorStateList(new int[][] { new int[] {}}, new int[] { Color.BLUE }); 
        TextAppearanceSpan highlightSpan = new TextAppearanceSpan(null, Typeface.BOLD, -1, blueColor, null); 

        spannable.setSpan(highlightSpan, startPos, endPos, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); 
        // countryTextView.setText(spannable); 
        worldpopulationlist.add(wp); 

      } 

     } 
    } 
    notifyDataSetChanged(); 

} 

Я гугле, и я знаю, что Spannable используется для этой цели, но ее не работает. Пожалуйста, помогите мне и скажите мне, нужен ли вам какой-либо другой связанный код.

РЕДАКТИРОВАТЬ:

В учебнике я следовал был из here. Я использовал тот же код с несколькими незначительными изменениями. Я просто хочу выделить искомый текст в виде списка (только один элемент, например, страна в этом случае).

+0

Вы не устанавливая 'spannable' в любом виде. Он просто создан, но нигде не используется. –

+0

Я устал откладывать это на вид, но вид, который я получил, был пуст, когда я его распечатал. Это то, что я попытался 'окончательный держатель ViewHolder = новый ViewHolder();' 'Вид вид = inflater.inflate (R.layout.listview_item, нуль),' ' holder.country = (TextView) view.findViewById (R.id.country); ' ' holder.country.setText (spannable); ' – Sibtain

+0

Обновите свой ответ с помощью вашего текущего кода, и я обязательно посмотрю на него. –

ответ

9

Ну, я загрузил образец проекта и, наконец, пришел со следующим. Адаптируйте код к вашим потребностям.

В вашем методе фильтра, хранить строку, используемую для выполнения фильтрации:

// Filter Class 
public void filter(String searchString) { 
    this.searchString = searchString; 
    ... 
    // Filtering stuff as normal. 
} 

Вы должны объявить строку члена для ее хранения:

public class ListViewAdapter extends BaseAdapter { 
    ...  
    String searchString = ""; 
    ... 

И в getView вы выделяете поиск срок:

public View getView(final int position, View view, ViewGroup parent) { 
    ... 
    // Set the results into TextViews 
    WorldPopulation item = worldpopulationlist.get(position); 
    holder.rank.setText(item.getRank()); 
    holder.country.setText(item.getCountry()); 
    holder.population.setText(item.getPopulation()); 

    // Find charText in wp 
    String country = item.getCountry().toLowerCase(Locale.getDefault()); 
    if (country.contains(searchString)) { 
     Log.e("test", country + " contains: " + searchString); 
     int startPos = country.indexOf(searchString); 
     int endPos = startPos + searchString.length(); 

     Spannable spanText = Spannable.Factory.getInstance().newSpannable(holder.country.getText()); // <- EDITED: Use the original string, as `country` has been converted to lowercase. 
     spanText.setSpan(new ForegroundColorSpan(Color.RED), startPos, endPos, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); 

     holder.country.setText(spanText, TextView.BufferType.SPANNABLE); 
    } 
    ... 
} 

Надеюсь, что это поможет.

0

Вы можете сделать так ..

public class ListViewAdapter extends BaseAdapter { 

    // Declare Variables 
    Context mContext; 
    LayoutInflater inflater; 
    String searchstring=""; 
    private List<WorldPopulation> worldpopulationlist = null; 
    private ArrayList<WorldPopulation> arraylist; 

    public ListViewAdapter(Context context, List<WorldPopulation> worldpopulationlist) { 
     mContext = context; 
     this.worldpopulationlist = worldpopulationlist; 
     inflater = LayoutInflater.from(mContext); 
     this.arraylist = new ArrayList<WorldPopulation>(); 
     this.arraylist.addAll(worldpopulationlist); 
    } 

    public class ViewHolder { 
     TextView rank; 
    } 

    @Override 
    public int getCount() { 
     return worldpopulationlist.size(); 
    } 

    @Override 
    public WorldPopulation getItem(int position) { 
     return worldpopulationlist.get(position); 
    } 

    @Override 
    public long getItemId(int position) { 
     return position; 
    } 

    public View getView(final int position, View view, ViewGroup parent) { 
     final ViewHolder holder; 
     if (view == null) { 
      holder = new ViewHolder(); 
      view = inflater.inflate(R.layout.listview_item, null); 
      // Locate the TextViews in listview_item.xml 
      holder.rank = (TextView) view.findViewById(R.id.ranklabel); 

      view.setTag(holder); 
     } else { 
      holder = (ViewHolder) view.getTag(); 
     } 
     // Set the results into TextViews 

     String faqsearchstr=worldpopulationlist.get(position).getRank().toLowerCase(Locale.getDefault()); 

     if (faqsearchstr.contains(searchstring)) { 
       Log.e("test", faqsearchstr + " contains: " + searchstring); 
       System.out.println("if search text"+faqsearchstr); 
       int startPos = faqsearchstr.indexOf(searchstring); 
       int endPos = startPos + searchstring.length(); 

       Spannable spanText = Spannable.Factory.getInstance().newSpannable(worldpopulationlist.get(position).getRank()); // <- EDITED: Use the original string, as `country` has been converted to lowercase. 
       spanText.setSpan(new ForegroundColorSpan(Color.GREEN), startPos, endPos, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); 

       holder.rank.setText(spanText, TextView.BufferType.SPANNABLE); 
      } 
     else 
     { 
      System.out.println("else search text"+faqsearchstr); 
      holder.rank.setText(worldpopulationlist.get(position).getRank()); 
     } 


     // Listen for ListView Item Click 
     view.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View arg0) { 
       // Send single item click data to SingleItemView Class 
       Intent intent = new Intent(mContext, QuestionActivity.class); 
       // Pass all data rank 
      // intent.putExtra("rank",(worldpopulationlist.get(position).getRank())); 
       intent.putExtra("QuestionsIntent",((worldpopulationlist.get(position).getFaqpopulatedData()))); 

       System.out.println("questionsss.."+(worldpopulationlist.get(position).getFaqpopulatedData())); 
       // Start SingleItemView Class 
       mContext.startActivity(intent); 
      } 
     }); 

     return view; 
    } 

    // Filter Class 
    public void filter(String charText) { 
     this.searchstring=charText; 
     charText = charText.toLowerCase(Locale.getDefault()); 
     worldpopulationlist.clear(); 
     if (charText.length() == 0) { 
      System.out.println("inside filter if"); 
      worldpopulationlist.addAll(arraylist); 
     } 
     else 
     { 
      for (WorldPopulation wp : arraylist) 
      { 
       if (wp.getRank().toLowerCase(Locale.getDefault()).contains(charText)) 
       { 
        System.out.println("inside filter else"); 
        worldpopulationlist.add(wp); 
       } 
      } 
     } 
     notifyDataSetChanged(); 
    } 
} 
0

Используйте следующий код для выделения искомого текста из поиска/редактирования текста

вход фильтруется имя и mTextview ваш взгляд текст, который вам хотите выделить этот метод после установки значения в текстовое представление.

private void highlightString(String input, TextView mTextView) { 
    SpannableString spannableString = new SpannableString(mTextView.getText()); 
    ForegroundColorSpan[] backgroundSpans = spannableString.getSpans(0, spannableString.length(), ForegroundColorSpan.class); 

    for (ForegroundColorSpan span : backgroundSpans) { 
     spannableString.removeSpan(span); 
    } 

    int indexOfKeyword = spannableString.toString().indexOf(input); 

    while (indexOfKeyword > 0) { 
     spannableString.setSpan(new ForegroundColorSpan(Color.GREEN), indexOfKeyword, indexOfKeyword + input.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); 

     indexOfKeyword = spannableString.toString().indexOf(input, indexOfKeyword + input.length()); 
    } 

    mTextView.setText(spannableString); 
}