在 recyclerView 中突出显示过滤后的文本

2024-01-12

这是我的适配器类:

public class adapter_cgpa extends RecyclerView.Adapter<adapter_cgpa.Viewholder> implements Filterable {

ArrayList<POJO> cgpaArrayList;
ArrayList<POJO> cgpaArrayListcopy;
String filterPattern = "";


public adapter_cgpa(ArrayList<POJO> cgpaArrayList) {
    this.cgpaArrayList = cgpaArrayList;
    cgpaArrayListcopy = new ArrayList<>(cgpaArrayList);
}

@NonNull
@Override
public adapter_cgpa.Viewholder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {

    View listitem = LayoutInflater.from(parent.getContext()).inflate(R.layout.recycler_cgpa, parent, false);
    return new Viewholder(listitem);
}

@Override
public void onBindViewHolder(@NonNull adapter_cgpa.Viewholder holder, int position) {
    POJO cgpa = cgpaArrayList.get(position);

    if (!filterPattern.equals("")) {
        String tmpCname = cgpa.getCname();
        int startPos = tmpCname.toLowerCase(Locale.US).indexOf(filterPattern.toLowerCase(Locale.US));
        int endPos = startPos + filterPattern.length();
        if (startPos != -1) {
            Spannable spannable = new SpannableString(tmpCname);
            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);
            holder.cname.setText(spannable);
        } else {
            holder.cname.setText(cgpa.getCname());
        }
    } else {
        holder.cname.setText(cgpa.getCname());
    }

    holder.no_of_sems.setText(cgpa.getNo_of_sems());
    holder.cgpa.setText(cgpa.getCgpa());
    holder.percentage.setText(cgpa.getPercentage());
    holder.schemec.setText(cgpa.getSchemec());

}

@Override
public int getItemCount() {
    return cgpaArrayList.size();
}


@Override
public Filter getFilter() {
    return new Filter() {

        @Override
        protected FilterResults performFiltering(CharSequence constraint) {
            List<POJO> filteredList = new ArrayList<>();

            if (TextUtils.isEmpty(constraint)) {
                filterPattern="";
                filteredList.addAll(cgpaArrayListcopy);
            } else {
                filterPattern = constraint.toString().toLowerCase().trim();
                for (POJO item : cgpaArrayListcopy) {
                    if (item.getCname().toLowerCase().contains(filterPattern)) {
                        filteredList.add(item);
            //        } else {
            //            filteredList.remove(item);
                    }
                }
            }

            FilterResults results = new FilterResults();
            results.values = filteredList;
            return results;
        }

        @Override
        public void publishResults(CharSequence constraint, FilterResults results) {

            cgpaArrayList.clear();
            cgpaArrayList.addAll((List) results.values);
            notifyDataSetChanged();
        }

    };

}


public class Viewholder extends RecyclerView.ViewHolder {
    TextView cname, no_of_sems, cgpa, percentage, schemec;
    ImageButton btndelete2;

    public Viewholder(@NonNull View itemView) {
        super(itemView);
        cname = itemView.findViewById(R.id.name);
        no_of_sems = itemView.findViewById(R.id.no_of_sem);
        cgpa = itemView.findViewById(R.id.textView49);
        percentage = itemView.findViewById(R.id.textView55);
        schemec = itemView.findViewById(R.id.scheme2);
        btndelete2 = itemView.findViewById(R.id.btndelete2);

        btndelete2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                final AlertDialog.Builder alert = new AlertDialog.Builder(v.getContext());
                alert.setMessage("Are you sure you want to delete this?");

                alert.setNegativeButton("Yes", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int whichButton) {

                    }
                });
                alert.setPositiveButton("No", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int whichButton) {

                    }
                });
                final AlertDialog dialogs = alert.create();
                dialogs.show();
                dialogs.getButton(androidx.appcompat.app.AlertDialog.BUTTON_NEGATIVE).setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {

                        delete(getAdapterPosition());
                        dialogs.dismiss();

                    }
                });
                dialogs.getButton(androidx.appcompat.app.AlertDialog.BUTTON_POSITIVE).setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {

                        dialogs.dismiss();
                    }
                });
            }
        });

    }


    private void delete(int adapterPosition) {

        cgpaArrayList.remove(adapterPosition);
        notifyDataSetChanged();
        final String snc = cname.getText().toString();
        final String semrc = no_of_sems.getText().toString();
        final String schc = schemec.getText().toString();

        dbmanager db = new dbmanager(itemView.getContext());
        db.delete2(snc, semrc, schc);
    }
}

这是我的 cgpa_frag 片段:

public class cgpa_frag extends Fragment {

    RecyclerView recyclerview;
    adapter_cgpa ac;
    TextView tv_noContent2;

    ArrayList<POJO> cgpaArrayList = new ArrayList<>();

    public cgpa_frag() {
        // Required empty public constructor
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {

        setHasOptionsMenu(true);

        View view = inflater.inflate(R.layout.fragment_cgpa_frag, container, false);
        recyclerview = (RecyclerView) view.findViewById(R.id.rc2);
        tv_noContent2 = (TextView)view.findViewById(R.id.tv_noContent2);
        cgpaArrayList = new ArrayList<>();
        Fetchdata2();
        ac = new adapter_cgpa(cgpaArrayList);
        recyclerview.setLayoutManager(new LinearLayoutManager(getContext(), RecyclerView.VERTICAL, false));
        if(cgpaArrayList.isEmpty()){
            recyclerview.setVisibility(View.GONE);
            tv_noContent2.setVisibility(View.VISIBLE);
            tv_noContent2.setText("Look's like you have not saved any CGPA calculation.");

        }else{
            tv_noContent2.setVisibility(View.GONE);
            recyclerview.setVisibility(View.VISIBLE);
            recyclerview.setAdapter(ac);
        }

        return view;
    }

    private void Fetchdata2() {
        dbmanager db = new dbmanager(getContext());

        Cursor cursor = db.fetch_data2();

        if (cursor != null) {

            while (cursor.moveToNext()) {

                POJO pj = new POJO();
                pj.setCname(cursor.getString(0));
                pj.setNo_of_sems(cursor.getString(1));
                pj.setCgpa(cursor.getString(2));
                pj.setPercentage(cursor.getString(3));
                pj.setSchemec(cursor.getString(4));
                cgpaArrayList.add(pj);
            }
            // ac = new adapter_cgpa(cgpaArrayList);
        }
    }

    @Override
    public void onCreateOptionsMenu(@NonNull Menu menu, @NonNull MenuInflater inflater) {

        inflater.inflate(R.menu.search_menu, menu);

        MenuItem searchItem = menu.findItem(R.id.action_search);
        SearchView searchView = (SearchView) searchItem.getActionView();

        searchView.onActionViewExpanded();
        searchView.setIconifiedByDefault(false);
        searchView.setQueryHint("Search by name ... ");

        if(!searchView.isFocused()) {
            searchView.clearFocus();
        }

        searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
            @Override
            public boolean onQueryTextSubmit(String query) {
                return false;
            }

            @Override
            public boolean onQueryTextChange(String newText) {
                ac.getFilter().filter(newText, new Filter.FilterListener() {
                    @Override
                    public void onFilterComplete(int i) {
                        if(i == 0){
                            recyclerview.setVisibility(View.GONE);
                            tv_noContent2.setVisibility(View.VISIBLE);
                            tv_noContent2.setText("No matching results found");
                        }else{
                            tv_noContent2.setVisibility(View.GONE);
                            recyclerview.setVisibility(View.VISIBLE);
                        }
                    }
                });
                return false;
            }
        });
    }

如何从bindviewHolder中的getFilter方法访问filterPattern?我想知道如何从bindviewHolder中的getFilter方法访问filterPattern,以便我能够突出显示RecyclerView中的匹配文本模式。有人能帮我吗?提前致谢。


Add String filterPattern = ""; after ArrayList<POJO> cgpaArrayListcopy;, then 过滤模式可以在适配器的任何地方访问。

要突出显示过滤后的文本,请尝试以下代码:

@Override
public void onBindViewHolder(@NonNull adapter_cgpa.Viewholder holder, int position) {
    POJO cgpa = cgpaArrayList.get(position);

    if (!filterPattern.equals("")) {
        String tmpCname = cgpa.getCname();
        int startPos = tmpCname.toLowerCase(Locale.US).indexOf(filterPattern.toLowerCase(Locale.US));
        int endPos = startPos + filterPattern.length();
        if (startPos != -1) {
            Spannable spannable = new SpannableString(tmpCname);
            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);
            holder.cname.setText(spannable);
        } else {
            holder.cname.setText(cgpa.getCname());
        }
    } else {
        holder.cname.setText(cgpa.getCname());
    }

    holder.no_of_sems.setText(cgpa.getNo_of_sems());
    holder.cgpa.setText(cgpa.getCgpa());
    holder.percentage.setText(cgpa.getPercentage());
    holder.schemec.setText(cgpa.getSchemec());
}


        @Override
        protected FilterResults performFiltering(CharSequence constraint) {
            List<POJO> filteredList = new ArrayList<>();

            if (TextUtils.isEmpty(constraint)) {
                filterPattern = "";
                filteredList.addAll(cgpaArrayListcopy);
            } else {
                filterPattern = constraint.toString().toLowerCase().trim();
                for (POJO item : cgpaArrayListcopy) {
                    if (item.getCname().toLowerCase().contains(filterPattern)) {
                        filteredList.add(item);
                    //} else {
                    //    filteredList.remove(item);
                    }
                }
            }

            FilterResults results = new FilterResults();
            results.values = filteredList;
            results.count = filteredList.size();

            return results;
        }

希望有帮助!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 recyclerView 中突出显示过滤后的文本 的相关文章

  • 保存用户可以访问的 Flutter Android 应用程序中的文本文件

    我在 Flutter 中开发的 Android 应用程序的用户应该能够将一些数据保存 导出 到文本文件中 用户应该能够使用其他应用程序 包括文件管理器 在其 Android 设备上找到并访问此文件 我想 final directory aw
  • 带阴影的弯曲 Android 工具栏

    我需要为工具栏或卡片视图提供弯曲的底视图 我尝试过的 bg toolbar xml
  • android - EditText 打字速度很慢

    我的 EditText 在打字时响应速度很慢 这种滞后现象足以让我找到解决方案 我做了一些研究 发现了一个 SO 线程输入文本时 EditText 滞后 https stackoverflow com questions 6173591 a
  • android 谷歌+登录定制

    我正在创建一个 Android 应用程序 现在我正在实现社交网络登录 Facebook 按钮很好 但 google 按钮的语言与 Facebook 不同 另外 它只说 登录 我想让它说 用谷歌登录 我是 android 编程的新手 看到我需
  • 更改 AChartEngine 中的图例大小

    我想专门更改饼图的图例大小输出 我已经尝试了所有可以找到的 AChartEngine 方法 但没有一个只能更改图例文本大小 我必须重写 onDraw 函数吗 如果是这样 怎么办 要设置图例高度 请使用 renderer setLegendH
  • 在 Android 中将应用程序上下文保存到静态变量是否安全?

    我知道在 Android 上使用静态变量是相当危险的 特别是当您将它们引用到活动时 但是 如果我有一个扩展 Application 的类 我们称此类为 App 引用此类的实例是否安全 如果是这样 任何其他类对应用程序上下文进行任何类型的引用
  • 将标题设置为操作栏时出现空指针异常

    Error Caused by java lang NullPointerException Attempt to invoke virtual method void android app ActionBar setTitle java
  • OpenCV InRange 参数

    我在 Android 上使用 OpenCV 来实时查找特定颜色的圆圈 我的第一步是仅保留与我正在寻找的定义颜色相对应的像素 在本例中为红色或绿色 示例图像 https i stack imgur com CIozU jpg 为此 我正在使用
  • Flutter / FireStore:如何在 Flutter 中显示 Firestore 中的图像?

    我想将我在应用程序中使用的一些图像放入 Firestore 并从那里显示它们 而不是将它们作为资产捆绑在我的应用程序中 为了做到这一点 我想出了以下解决方案 对于我想要显示图像的项目 我创建了一个 Firebase 文档 其中有一个字段存储
  • 如何将单选按钮状态保存到已保存/共享首选项?

    我可以在保存的首选项中保存字符串 但很难保存单选按钮 public class PersonalDetailsf extends Activity private SharedPreferences sharedPreferences pr
  • Cordova 地理定位不适用于 Android

    我想在 Android 上使用地理定位 我用 Apache Cordova 编写应用程序 地理定位在 android 电脑模拟器和 android 手机上均不起作用 I try http cordova apache org docs en
  • 版本 5 上带有 getBackground().setAlpha 的按钮 - 棒棒糖无法正常工作

    我有这段代码 适用于自 API 14 以来的每个版本 但在 Android 5 0 Lollipop 上无法正常工作 以下是我希望按钮出现的方式 单击按钮1 buttonArrivals getBackground setAlpha 180
  • 如何从SurfaceView绘制到Canvas?

    我正在尝试做简单的画家 问题是Android看起来有三个独立的Canvas并给我它来顺序绘制 我用以下方式制作了用户界面SurfaceView 把霍尔德从中拿走 Override protected void onCreate Bundle
  • 模拟器:进程已完成,退出代码为 134(被信号 6:SIGABRT 中断)

    我最近刚刚开始在 Mac 上下载 Android Studio 版本 3 0 1 但收到以下错误 模拟器 进程已完成 退出代码为 134 被信号 6 SIGABRT 中断 我按照 Android Studio 教程操作并能够运行模拟器 但在
  • 如何在android sdk上使用PowerMock

    我想为我的 android 项目编写一些单元测试和仪器测试 然而 我遇到了一个困扰我一段时间的问题 我需要模拟静态方法并伪造返回值来测试项目 经过一些论坛的调查 唯一的方法是使用PowerMock来模拟静态方法 这是我的 gradle 的一
  • Jetpack Compose 部分或开放侧边框

    我正在尝试绘制部分或一侧开放的矩形圆形边框以实现此效果 玩了一下之后我得到了这个 这是通过以下方式完成的 RoundedCornerShape topStartPercent 50 bottomStartPercent 50 start R
  • ormlite 将日期读取为 'yyyy-MM-dd'

    我需要读取给我的 sqlite 数据库 因此我无法更改表中的日期格式 yyyy MM dd 当我尝试使用 ormlite 为我生成对象时 使用以下注释 DatabaseField columnName REVISION DATE dataT
  • WebView 在某些设备上如果不长按则不会滚动

    我有一个 WebView 设置如下 the web view mWebView WebView findViewById R id webView push the url on to the web view mWebView loadU
  • 基于BluetoothChat示例通过蓝牙套接字发送文件

    大家好 根据我之前问的一个问题 我已经能够将文件转换为其他字节数组 以便使用以下写入方法 public void sendFile Log d TAG sending data InputStream inputStream null Ur
  • 绘制大位图时 nSyncAndDrawFrame 速度极慢

    我想用多个大位图优化视差滚动视图 在我的 Nexus 5 上 一切都很顺利 Traceview 转储如下所示 doFrame 方法大约需要 18 毫秒才能完成 但是 当使用我的 Nexus 7 或 Android 6 模拟器 Genymot

随机推荐