方法removeSpan()
意味着是相反的操作setSpan()
,所以你应该向它们传递相同的对象。为了实现这一目标,请使ForegroundColorSpan
的一个领域ViewHolder
(见下文)
public void onBindViewHolder(final MyViewHolder itemHolder, int position) {
String todoHighlight = mListItems.get(position).getTodo();
itemHolder.cardBlankText2.setText(todoHighlight);
// Set up the logic for the highlighted text
int todoStartPos = todoHighlight.indexOf(searchString);
int todoEndPos = todoStartPos + searchString.length();
// ... skipped some lines ...
Spannable spanString2 = Spannable.Factory.getInstance().newSpannable(
itemHolder.cardBlankText2.getText());
if (todoStartPos != -1 && searchString.length() > 0 && todoHighlight.contains(searchString)) {
spanString2.setSpan(itemHolder.getForegroundColorSpan(), todoStartPos, todoEndPos,
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
itemHolder.cardBlankText2.setText(spanString2);
}
else if (searchString.length() == 0) {
spanString2.removeSpan(itemHolder.getForegroundColorSpan());
itemHolder.cardBlankText2.setText(spanString2);
}
}
视图持有者:
class MyViewHolder extends RecyclerView.ViewHolder{
private ForegroundColorSpan foregroundColorSpan = new ForegroundColorSpan(Color.RED);
public MyViewHolder(View itemView){
super(itemView);
}
public ForegroundColorSpan getForegroundColorSpan(){
return foregroundColorSpan;
}
}
EDIT远程调试很困难,所以让我们以另一种方式进行,MCVE 风格:请使用以下代码,运行它,如果它有效(例如“根据搜索文本突出显示更改”),那么您就更进一步了道路。
public class Activity8_RecyclerViewGrid extends AppCompatActivity
{
private int counter = 0;
private static String[] searchTexts = new String[]{"rem", "ia", "", "ol" };
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity8__recycler_view);
RecyclerView rcv = (RecyclerView)findViewById(R.id.recyclerView);
rcv.setLayoutManager(new GridLayoutManager(this, 2));
final MyAdapter adapter = new MyAdapter(allMyWords());
rcv.setAdapter(adapter);
final TextView tvSearchText = (TextView)findViewById(R.id.tvSearchText);
Button btnFilter = (Button)findViewById(R.id.btnFilter);
btnFilter.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View view)
{
String searchString = searchTexts[counter%4];
adapter.setFilter(Activity7_GridViewStuff.allMyBooks(), searchString);
tvSearchText.setText(searchString);
counter++;
}
});
}
public static ArrayList<String> allMyWords()
{
String[] theLoremArray = null;
String LOREM_STRING = "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.";
String[] sTemp = LOREM_STRING.split(" ");
StringBuilder sb = new StringBuilder();
theLoremArray = new String[sTemp.length/3];
for (int i = 0; i < (sTemp.length - sTemp.length%3); i++)
{
sb.append(sTemp[i]).append(" ");
if (i%3 == 2)
{
theLoremArray[i/3] = sb.toString();
// Log.d(TAG, "mLoremArray [" + i / 3 + "] = " + sb.toString());
sb.delete(0, sb.length());
}
}
ArrayList<String> words = new ArrayList<>();
for (int i = 0; i < theLoremArray.length; i++)
{
words.add( theLoremArray[i]);
}
return words;
}
class MyAdapter extends RecyclerView.Adapter<MyHolder>{
private List<String> data;
private String searchString = "";
MyAdapter(List<String> data){
this.data = data;
}
public void setFilter(List<String> listItems, String searchString){
// data = new ArrayList<>();
// data.addAll(listItems);
this.searchString = searchString;
notifyDataSetChanged();
}
@Override
public MyHolder onCreateViewHolder(ViewGroup parent, int viewType)
{
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.activity8_grid_cell, null);
return new MyHolder(v);
}
@Override
public void onBindViewHolder(final MyHolder holder, int position)
{
holder.text.setText(data.get(position));
String todoHighlight = data.get(position);
// Set up the logic for the highlighted text
int todoStartPos = todoHighlight.indexOf(searchString);
int todoEndPos = todoStartPos + searchString.length();
Spannable spanString2 = Spannable.Factory.getInstance().newSpannable(holder.text.getText());
if(todoStartPos != -1 && searchString.length() > 0 && todoHighlight.contains(searchString)){
spanString2.setSpan(holder.getForegroundColorSpan(), todoStartPos, todoEndPos, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
}
else if (searchString.length() == 0){
spanString2.removeSpan(holder.getForegroundColorSpan());
}
holder.text.setText(spanString2);
}
@Override
public int getItemCount()
{
return data.size();
}
}
class MyHolder extends RecyclerView.ViewHolder{
private ForegroundColorSpan foregroundColorSpan = new ForegroundColorSpan(Color.CYAN);
TextView text;
public MyHolder(View itemView){
super(itemView);
text = (TextView) itemView.findViewById(R.id.lorem_text);
}
public ForegroundColorSpan getForegroundColorSpan(){
return foregroundColorSpan;
}
}
}
Activity8_recycler_view.xml
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.samples.Activity8_RecyclerViewGrid">
<TextView
android:id="@+id/tvSearchText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="16dp"
android:textAppearance="@style/Base.TextAppearance.AppCompat.Title"
android:textColor="#ff0000" />
<Button android:id="@+id/btnFilter"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:text="SET NEW FILTER"
android:layout_gravity="center_horizontal" />
<android.support.v7.widget.RecyclerView
android:id="@+id/recyclerView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginTop="80dp">
</android.support.v7.widget.RecyclerView>
</FrameLayout>
Activity8_grid_cell.xml
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/lorem_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_marginEnd="16dp"
android:textAppearance="?android:attr/textAppearanceLarge" />
</FrameLayout>