简单的Android RecyclerView示例

简单的Android RecyclerView示例,android,android-recyclerview,Android,Android Recyclerview,我已经使用Android的RecyclerView多次列出了项目列表,但这是一个相当复杂的过程。正在浏览众多在线教程中的一个(和都很好),但我正在寻找一个简单的示例,我可以复制并粘贴它以快速启动和运行。仅需要以下功能: 垂直布局 每行有一个文本视图 响应单击事件 因为我多次希望这样,我最终决定回答下面的问题,以供我和你将来参考。下面是一个最简单的例子,看起来像下图 从一个空的活动开始。您将执行以下任务以添加RecyclerView。您所需要做的就是复制并粘贴每个部分中的代码。稍后,您可以自

我已经使用Android的
RecyclerView
多次列出了项目列表,但这是一个相当复杂的过程。正在浏览众多在线教程中的一个(和都很好),但我正在寻找一个简单的示例,我可以复制并粘贴它以快速启动和运行。仅需要以下功能:

  • 垂直布局
  • 每行有一个文本视图
  • 响应单击事件

因为我多次希望这样,我最终决定回答下面的问题,以供我和你将来参考。

下面是一个最简单的例子,看起来像下图

从一个空的活动开始。您将执行以下任务以添加RecyclerView。您所需要做的就是复制并粘贴每个部分中的代码。稍后,您可以自定义它以满足您的需要

  • 向gradle添加依赖项
  • 为活动和RecyclerView行添加xml布局文件
  • 制作RecyclerView适配器
  • 在活动中初始化RecyclerView
更新渐变依赖项 确保应用程序
gradle.build
文件中存在以下依赖项:

implementation 'com.android.support:appcompat-v7:28.0.0'
implementation 'com.android.support:recyclerview-v7:28.0.0'
您可以将版本号更新为任何版本。如果您仍在使用AndroidStudio 2.x,请使用
compile
而不是
implementation

创建活动布局 将
RecyclerView
添加到xml布局中

activity_main.xml

创建适配器
RecyclerView
需要一个适配器来用数据填充每行中的视图。创建一个新的java文件

myRecycleServiceAdapter.java

注释

  • 请注意,该活动实现了我们在适配器中定义的
    项ClickListener
    。这允许我们在
    onItemClick
    中处理行单击事件
完成了 就这样。您现在应该能够运行您的项目,并获得类似于顶部图像的内容

进行中 在行之间添加分隔符

compile 'com.android.support:appcompat-v7:25.3.1'
compile 'com.android.support:design:25.3.1'
compile 'com.android.support:multidex:1.0.1'
compile 'com.android.support:cardview-v7:25.3.1'
compile 'com.android.support:support-v4:25.3.1'
compile 'com.lguipeng.bubbleview:library:1.0.0'
compile 'com.larswerkman:HoloColorPicker:1.5'
compile 'com.mcxiaoke.volley:library-aar:1.0.0'
public class MByTopics {

    String id;
    String topicName;
    String catname;
    String MainTopicJson;
    ArrayList<SMByTopicCategory> child;
    ArrayList<SMByTopicSubCategory> questions;

    public void setId(String id){
        this.id=id;
    }
    public String getId(){
        return  id;
    }

    public void setCatname(String catname) {
        this.catname = catname;
    }

    public String getCatname() {
        return catname;
    }

    public void setTopicName(String topicName) {
        this.topicName = topicName;
    }
    public String getTopicName() {
        return topicName;
    }

    public void setChild(ArrayList<SMByTopicCategory> child) {
        this.child = child;
    }

    public String getMainTopicJson() {
        return MainTopicJson;
    }

    public void setMainTopicJson(String mainTopicJson) {
        MainTopicJson = mainTopicJson;
    }

    public ArrayList<SMByTopicCategory> getChild() {
        return child;
    }

    public void setQuestions(ArrayList<SMByTopicSubCategory> questions) {
        this.questions = questions;
    }

    public ArrayList<SMByTopicSubCategory> getQuestions() {
        return questions;
    }

    public ArrayList<MByTopics> getByTopicList() {
        ArrayList<MByTopics> mByTopicsArrayList = new ArrayList<>();

        for (int i=0;i<11;i++){
            MByTopics mQuestionBankCategory=new MByTopics();

            if (i==1 || i== 5|| i==9){
                mQuestionBankCategory.setTopicName("Microeconomics");
            }else  if (i==2 || i== 10|| i==6) {
                mQuestionBankCategory.setTopicName("Macroeconomics");
            }else {
                mQuestionBankCategory.setTopicName("Current Isssues");
            }

            mByTopicsArrayList.add(mQuestionBankCategory);
        }

        return mByTopicsArrayList;
    }

}
您可以像这样添加一个简单的分隔符

DividerItemDecoration dividerItemDecoration = new DividerItemDecoration(recyclerView.getContext(),
    layoutManager.getOrientation());
recyclerView.addItemDecoration(dividerItemDecoration);
如果您想要更复杂的内容,请参见以下答案:

单击更改行颜色

有关如何在单击行时更改背景色和添加涟漪效果的信息,请参见

更新行

compile 'com.android.support:appcompat-v7:25.3.1'
compile 'com.android.support:design:25.3.1'
compile 'com.android.support:multidex:1.0.1'
compile 'com.android.support:cardview-v7:25.3.1'
compile 'com.android.support:support-v4:25.3.1'
compile 'com.lguipeng.bubbleview:library:1.0.0'
compile 'com.larswerkman:HoloColorPicker:1.5'
compile 'com.mcxiaoke.volley:library-aar:1.0.0'
public class MByTopics {

    String id;
    String topicName;
    String catname;
    String MainTopicJson;
    ArrayList<SMByTopicCategory> child;
    ArrayList<SMByTopicSubCategory> questions;

    public void setId(String id){
        this.id=id;
    }
    public String getId(){
        return  id;
    }

    public void setCatname(String catname) {
        this.catname = catname;
    }

    public String getCatname() {
        return catname;
    }

    public void setTopicName(String topicName) {
        this.topicName = topicName;
    }
    public String getTopicName() {
        return topicName;
    }

    public void setChild(ArrayList<SMByTopicCategory> child) {
        this.child = child;
    }

    public String getMainTopicJson() {
        return MainTopicJson;
    }

    public void setMainTopicJson(String mainTopicJson) {
        MainTopicJson = mainTopicJson;
    }

    public ArrayList<SMByTopicCategory> getChild() {
        return child;
    }

    public void setQuestions(ArrayList<SMByTopicSubCategory> questions) {
        this.questions = questions;
    }

    public ArrayList<SMByTopicSubCategory> getQuestions() {
        return questions;
    }

    public ArrayList<MByTopics> getByTopicList() {
        ArrayList<MByTopics> mByTopicsArrayList = new ArrayList<>();

        for (int i=0;i<11;i++){
            MByTopics mQuestionBankCategory=new MByTopics();

            if (i==1 || i== 5|| i==9){
                mQuestionBankCategory.setTopicName("Microeconomics");
            }else  if (i==2 || i== 10|| i==6) {
                mQuestionBankCategory.setTopicName("Macroeconomics");
            }else {
                mQuestionBankCategory.setTopicName("Current Isssues");
            }

            mByTopicsArrayList.add(mQuestionBankCategory);
        }

        return mByTopicsArrayList;
    }

}
有关如何添加、删除和更新行的信息,请参见

进一步阅读
  • (stacktips教程)

  • 依赖关系

    compile 'com.android.support:appcompat-v7:25.3.1'
    compile 'com.android.support:design:25.3.1'
    compile 'com.android.support:multidex:1.0.1'
    compile 'com.android.support:cardview-v7:25.3.1'
    compile 'com.android.support:support-v4:25.3.1'
    compile 'com.lguipeng.bubbleview:library:1.0.0'
    compile 'com.larswerkman:HoloColorPicker:1.5'
    compile 'com.mcxiaoke.volley:library-aar:1.0.0'
    
    public class MByTopics {
    
        String id;
        String topicName;
        String catname;
        String MainTopicJson;
        ArrayList<SMByTopicCategory> child;
        ArrayList<SMByTopicSubCategory> questions;
    
        public void setId(String id){
            this.id=id;
        }
        public String getId(){
            return  id;
        }
    
        public void setCatname(String catname) {
            this.catname = catname;
        }
    
        public String getCatname() {
            return catname;
        }
    
        public void setTopicName(String topicName) {
            this.topicName = topicName;
        }
        public String getTopicName() {
            return topicName;
        }
    
        public void setChild(ArrayList<SMByTopicCategory> child) {
            this.child = child;
        }
    
        public String getMainTopicJson() {
            return MainTopicJson;
        }
    
        public void setMainTopicJson(String mainTopicJson) {
            MainTopicJson = mainTopicJson;
        }
    
        public ArrayList<SMByTopicCategory> getChild() {
            return child;
        }
    
        public void setQuestions(ArrayList<SMByTopicSubCategory> questions) {
            this.questions = questions;
        }
    
        public ArrayList<SMByTopicSubCategory> getQuestions() {
            return questions;
        }
    
        public ArrayList<MByTopics> getByTopicList() {
            ArrayList<MByTopics> mByTopicsArrayList = new ArrayList<>();
    
            for (int i=0;i<11;i++){
                MByTopics mQuestionBankCategory=new MByTopics();
    
                if (i==1 || i== 5|| i==9){
                    mQuestionBankCategory.setTopicName("Microeconomics");
                }else  if (i==2 || i== 10|| i==6) {
                    mQuestionBankCategory.setTopicName("Macroeconomics");
                }else {
                    mQuestionBankCategory.setTopicName("Current Isssues");
                }
    
                mByTopicsArrayList.add(mQuestionBankCategory);
            }
    
            return mByTopicsArrayList;
        }
    
    }
    
    单击项目的一个类

    import android.content.Context;
    import android.support.v7.widget.RecyclerView;
    import android.view.GestureDetector;
    import android.view.MotionEvent;
    import android.view.View;
    
    public class RecyclerItemClickListener implements RecyclerView.OnItemTouchListener {
        private OnItemClickListener mListener;
    
        public interface OnItemClickListener {
            public void onItemClick(View view, int position);
        }
    
        GestureDetector mGestureDetector;
    
        public RecyclerItemClickListener(Context context, OnItemClickListener listener) {
            mListener = listener;
            mGestureDetector = new GestureDetector(context, new GestureDetector.SimpleOnGestureListener() {
                @Override
                public boolean onSingleTapUp(MotionEvent e) {
                    return true;
                }
            });
        }
    
        @Override
        public boolean onInterceptTouchEvent(RecyclerView view, MotionEvent e) {
            View childView = view.findChildViewUnder(e.getX(), e.getY());
            if (childView != null && mListener != null && mGestureDetector.onTouchEvent(e)) {
                mListener.onItemClick(childView, view.getChildPosition(childView));
                return true;
            }
            return false;
        }
    
        @Override
        public void onTouchEvent(RecyclerView view, MotionEvent motionEvent) { }
    
        @Override
        public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {
    
        }
    
    
    }
    
    import android.app.Activity;
    import android.support.v7.widget.RecyclerView;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.TextView;
    import java.util.ArrayList;
    
    public class SAdpByTopics extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
            ArrayList<MByTopics> topicsArrayList=new ArrayList<>();
            Activity activity;
    
         public SAdpByTopics(ArrayList<MByTopics> topicsArrayList,Activity activity){
            this.topicsArrayList=topicsArrayList;
            this.activity=activity;
         }
    
         @Override
         public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            View itemeView= LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item_by_topic_list,parent,false);
            RecyclerView.ViewHolder holder=new Holder(itemeView);
            holder.setIsRecyclable(false);
            return holder;
         }
    
         @Override
         public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
             final Holder classHolder = (Holder) holder;
             try{
                 classHolder.txt_topic_name.setText(topicsArrayList.get(position).getCatname());
             }catch (Exception e){
                 e.printStackTrace();
             }
         }
    
         @Override
         public int getItemCount() {
            return topicsArrayList.size();
         }
    
    
    class Holder extends RecyclerView.ViewHolder implements View.OnClickListener {
        TextView txt_topic_name;
    
        public Holder(View itemView) {
            super(itemView);
            txt_topic_name = (TextView) itemView.findViewById(R.id.txt_topic_name);
        }
    
        @Override
        public void onClick(View v) {
    
        }
    }
    }
    
    二等回收视图

    import android.annotation.SuppressLint;
    import android.app.ProgressDialog;
    import android.content.BroadcastReceiver;
    import android.content.Context;
    import android.content.Intent;
    import android.content.IntentFilter;
    import android.net.Uri;
    import android.os.Bundle;
    import android.support.annotation.Nullable;
    import android.support.v4.app.Fragment;
    import android.support.v4.app.FragmentTransaction;
    import android.support.v4.content.LocalBroadcastManager;
    import android.support.v7.widget.LinearLayoutManager;
    import android.support.v7.widget.RecyclerView;
    import android.util.Log;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.Toast;
    
    import com.android.volley.DefaultRetryPolicy;
    import com.android.volley.Request;
    import com.android.volley.RequestQueue;
    import com.android.volley.Response;
    import com.android.volley.VolleyError;
    import com.android.volley.toolbox.StringRequest;
    import com.android.volley.toolbox.Volley;
    
    import org.json.JSONArray;
    import org.json.JSONException;
    import org.json.JSONObject;
    import java.util.ArrayList;
    
    public class SLByTopics extends Fragment {
    
    
        public static ArrayList<MByTopics> byTopicsMainArrayList=new ArrayList<>();
    
    
        TabRefreshReceiver tabRefreshReceiver;
        RecyclerView recyclerView;
        SAdpByTopics sAdpByTopics;
        public ArrayList<MByTopics> mByTopicsArrayList=new ArrayList<>();
        ProgressDialog progressDialog;
    
        public SLByTopics(){
        }
    
        @Override
        public void onCreate(@Nullable Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
        }
    
        @Override
        public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
            View view = inflater.inflate(R.layout.sl_fragment_by_topics, container, false);
    
            progressDialog = new ProgressDialog(getActivity());
            if (IsOnline.isNetworkAvailable(getActivity())) {
                getCategoryTree();
            } else{
                IsOnline.showNoInterNetMessage(getActivity());
            }
            tabRefreshReceiver = new TabRefreshReceiver();
           LocalBroadcastManager.getInstance(getContext()).registerReceiver(tabRefreshReceiver, new IntentFilter("BY_TOPICS"));
    
            setUpView(view);
            return view;
        }
    
        private void setUpView(View view) {
    
            recyclerView=(RecyclerView)view.findViewById(R.id.by_topics_list_recyclerView);
            LinearLayoutManager linearLayoutManager=new LinearLayoutManager(getActivity());
            linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);
            recyclerView.setLayoutManager(linearLayoutManager);
        }
    
        @Override
        public void onResume() {
            super.onResume();
    
            recyclerView.addOnItemTouchListener(new RecyclerItemClickListener(getActivity(), new RecyclerItemClickListener.OnItemClickListener() {
                @Override
                public void onItemClick(View view, final int position) {
    
                    if (mByTopicsArrayList.get(position).getChild().size()>0){
                        Intent intent = new Intent(getActivity(), SByTopicCategory.class);
                        intent.putExtra("selectedCategoryName",mByTopicsArrayList.get(position).getCatname());
                        intent.putExtra("jsonData",mByTopicsArrayList.get(position).getMainTopicJson());
                        startActivity(intent);
                        getActivity().overridePendingTransition(R.anim.activity_in, R.anim.activity_out);
                    }else {
                        Intent intent = new Intent(getActivity(), SByCategoryQuestionList.class);
                        intent.putExtra("selectedSubCategoryName",mByTopicsArrayList.get(position).getCatname());
                        intent.putExtra("catID",mByTopicsArrayList.get(position).getId());
                        startActivity(intent);
                        getActivity().overridePendingTransition(R.anim.activity_in, R.anim.activity_out);
                    }
                }
            }));
    
        }
    
        private class TabRefreshReceiver extends BroadcastReceiver {
            @Override
            public void onReceive(Context context, Intent intent) {
                try {
                    FragmentTransaction ft = getFragmentManager().beginTransaction();
                    ft.detach(SLByTopics.this).attach(SLByTopics.this).commit();
                    LocalBroadcastManager.getInstance(getContext()).unregisterReceiver(tabRefreshReceiver);
                } catch (Exception e) {
                    e.printStackTrace();
                }
    
            }
        }
    
        private void getCategoryTree() {
            progressDialog.setMessage("Please Wait...");
            progressDialog.setCancelable(false);
            progressDialog.show();
    
            StringRequest stringRequest = new StringRequest(Request.Method.POST, Const.HOSTNAME + Const.STUDENT_GET_CATEGORY_TREE,
                    new Response.Listener<String>() {
                        @SuppressLint("LongLogTag")
                        @Override
                        public void onResponse(String response) {
                            try {
                                JSONObject object = new JSONObject(response);
                                String status = object.getString("status");
                                int i = Integer.parseInt(status);
    
                                switch (i) {
    
                                    case 0:
                                        progressDialog.dismiss();
    //                                    Toast.makeText(getActivity(), "getCategorySuccess", Toast.LENGTH_SHORT).show();
                                        Log.e("getCategoryTree Response", "getCategoryTree Response : " + response);
    
                                        try {    
                                            byTopicsMainArrayList.clear();
                                            JSONArray info = object.getJSONArray("info");
                                            if (info.length() > 0) {
                                                for (i = 0; i < info.length(); i++) {
                                                    JSONObject data = info.getJSONObject(i);
                                                    MByTopics mByTopics = new MByTopics();
                                                    mByTopics.setId(data.getString("id"));
                                                    mByTopics.setCatname(data.getString("catname"));
                                                    mByTopics.setMainTopicJson(data.toString());
    
                                                    JSONArray topicChildren = data.getJSONArray("children");
                                                    ArrayList<SMByTopicCategory> byChildrenArrayList = new ArrayList<>();
    
                                                    for (int j = 0; j < topicChildren.length(); j++) {
                                                        JSONObject topicChildrenData = topicChildren.getJSONObject(j);
                                                        SMByTopicCategory smByTopicCategory = new SMByTopicCategory();
                                                        smByTopicCategory.setId(topicChildrenData.getString("id"));
                                                        smByTopicCategory.setCatname(topicChildrenData.getString("catname"));
                                                        smByTopicCategory.setChildTopicJson(topicChildrenData.toString());
    
                                                        JSONArray topicChildrenQuestion = topicChildrenData.getJSONArray("children");
                                                        ArrayList<SMByTopicSubCategory> byChildrenSubArrayList = new ArrayList<>();
    
                                                        for (int k = 0; k < topicChildrenQuestion.length(); k++) {
                                                            JSONObject topicChildrenSubData = topicChildrenQuestion.getJSONObject(k);
                                                            SMByTopicSubCategory smByTopicSubCategory = new SMByTopicSubCategory();
                                                            smByTopicSubCategory.setId(topicChildrenSubData.getString("id"));
                                                            smByTopicSubCategory.setCatname(topicChildrenSubData.getString("catname"));
                                                            smByTopicSubCategory.setChildSubTopicJson(topicChildrenSubData.toString());
    
                                                            byChildrenSubArrayList.add(smByTopicSubCategory);
                                                        }
    
                                                        smByTopicCategory.setQuestions(byChildrenSubArrayList);
    
                                                        byChildrenArrayList.add(smByTopicCategory);
                                                    }
                                                    mByTopics.setChild(byChildrenArrayList);
                                                    byTopicsMainArrayList.add(mByTopics);
                                                }
    
    
                                                mByTopicsArrayList.clear();
                                                mByTopicsArrayList=byTopicsMainArrayList;
                                                sAdpByTopics=new SAdpByTopics(mByTopicsArrayList,getActivity());
                                                recyclerView.setAdapter(sAdpByTopics);
                                                sAdpByTopics.notifyDataSetChanged();
    
                                            }
    
                                        }catch (Exception e){
                                            e.printStackTrace();
                                        }
                                        break;
    
                                    default:
                                        progressDialog.dismiss();
    //                                    Toast.makeText(getActivity(), "getCategoryError : " + response, Toast.LENGTH_SHORT).show();
                                        Log.e("getCategoryTree Not Response", "getCategoryTree Uploading Not Response : " + response);
                                }
    
                            } catch (JSONException e) {
                                e.printStackTrace();
                            }
                        }
                    },
                    new Response.ErrorListener() {
                        @Override
                        public void onErrorResponse(VolleyError error) {
                            progressDialog.dismiss();
                            Log.e("getCategoryTree Error :","getCategoryTree Error :"+error.getMessage());
    //                        Toast.makeText(getActivity(), error.getMessage(), Toast.LENGTH_LONG).show();
                        }
                    }){
    
            };/* {
                @Override
                protected Map<String, String> getParams() throws AuthFailureError {
    
                    Map<String, String> map = new HashMap<String, String>();
    //                map.put("uid", String.valueOf(ConfigManager.getUserId()));
                    return map;
                }
            };*/
    
            stringRequest.setRetryPolicy(new DefaultRetryPolicy(
                    0,
                    DefaultRetryPolicy.DEFAULT_MAX_RETRIES,
                    DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
    
            RequestQueue requestQueue = Volley.newRequestQueue(getActivity());
            requestQueue.add(stringRequest);
        }
    }
    
    导入android.annotation.SuppressLint;
    导入android.app.ProgressDialog;
    导入android.content.BroadcastReceiver;
    导入android.content.Context;
    导入android.content.Intent;
    导入android.content.IntentFilter;
    导入android.net.Uri;
    导入android.os.Bundle;
    导入android.support.annotation.Nullable;
    导入android.support.v4.app.Fragment;
    导入android.support.v4.app.FragmentTransaction;
    导入android.support.v4.content.LocalBroadcastManager;
    导入android.support.v7.widget.LinearLayoutManager;
    导入android.support.v7.widget.RecyclerView;
    导入android.util.Log;
    导入android.view.LayoutInflater;
    导入android.view.view;
    导入android.view.ViewGroup;
    导入android.widget.Toast;
    导入com.android.volley.DefaultRetryPolicy;
    导入com.android.volley.Request;
    导入com.android.volley.RequestQueue;
    导入com.android.volley.Response;
    导入com.android.volley.VolleyError;
    导入com.android.volley.toolbox.StringRequest;
    导入com.android.volley.toolbox.volley;
    导入org.json.JSONArray;
    导入org.json.JSONException;
    导入org.json.JSONObject;
    导入java.util.ArrayList;
    公共类SLByTopics扩展了片段{
    公共静态ArrayList byTopicsMainArrayList=新ArrayList();
    TabRefreshReceiver TabRefreshReceiver;
    回收视图回收视图;
    Sadpytopics Sadpytopics;
    public ArrayList mByTopicsArrayList=new ArrayList();
    进行对话进行对话;
    公共主题(){
    }
    @凌驾
    创建时的公共void(@Nullable Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    }
    @凌驾
    创建视图时的公共视图(LayoutFlater充气机、@Nullable ViewGroup容器、@Nullable Bundle savedInstanceState){
    视图=充气机。充气(R.layout.sl_片段按主题,容器,false);
    progressDialog=新建progressDialog(getActivity());
    if(IsOnline.isNetworkAvailable(getActivity())){
    getCategoryTree();
    }否则{
    showNoInterNetMessage(getActivity());
    }
    tabRefreshReceiver=新的tabRefreshReceiver();
    LocalBroadcastManager.getInstance(getContext()).registerReceiver(tabRefreshReceiver,new IntentFilter(“按主题”);
    设置视图(视图);
    返回视图;
    }
    专用void设置视图(视图){
    recyclerView=(recyclerView)view.findViewById(R.id.by\u topics\u list\u recyclerView);
    LinearLayoutManager LinearLayoutManager=新的LinearLayoutManager(getActivity());
    linearLayoutManager.setOrientation(linearLayoutManager.VERTICAL);
    recyclerView.setLayoutManager(linearLayoutManager);
    }
    @凌驾
    恢复时公开作废(){
    super.onResume();
    recyclerView.addOnItemTouchListener(新的RecyclerItemClickListener(getActivity(),新的RecyclerItemClickListener.OnItemClickListener()){
    @凌驾
    public void onItemClick(视图,最终整型位置){
    if(mByTopicsArrayList.get(position.getChild().size()>0){
    Intent Intent=新的Intent(getActivity(),SByTopicCategory.class);
    intent.putExtra(“selectedCategoryName”,mByTopicsArrayList.get(position.getCatname());
    意向。额外(“jsonData”,mByTopics
    
    implementation 'com.hereshem.lib:awesomelib:2.0.1'
    
    <com.hereshem.lib.recycler.MyRecyclerView
            android:id="@+id/recycler"
            app:layoutManager="LinearLayoutManager"
            android:layout_width="match_parent"
            android:layout_height="match_parent"/>
    
    public static class EVHolder extends MyViewHolder<Events> {
        TextView date, title, summary;
        public EVHolder(View v) {
            super(v);
            date = v.findViewById(R.id.date);
            title = v.findViewById(R.id.title);
            summary = v.findViewById(R.id.summary);
        }
        @Override
        public void bindView(Events c) {
            date.setText(c.date);
            title.setText(c.title);
            summary.setText(c.summary);
        }
    }
    
    List<Events> items = new ArrayList<>();
    MyRecyclerView recycler = findViewById(R.id.recycler);
    RecyclerViewAdapter adapter = new RecyclerViewAdapter(this, items, EVHolder.class, R.layout.row_event);
    recycler.setAdapter(adapter);
    
    recycler.setOnItemClickListener(new MyRecyclerView.OnItemClickListener() {
        @Override
        public void onItemClick(int position) {
            Toast.makeText(MainActivity.this, "Recycler Item Clicked " + position, Toast.LENGTH_SHORT).show();
        }
    });
    
    <?xml version="1.0" encoding="utf-8"?>
    <layout xmlns:android="http://schemas.android.com/apk/res/android"
            xmlns:app="http://schemas.android.com/apk/res-auto">
    
        <data>
    
            <variable
                name="listOne"
                type="java.util.List"/>
    
            <variable
                name="listTwo"
                type="java.util.List"/>
    
            <variable
                name="onItemClickListenerOne"
                type="com.ks.nestedrecyclerbindingexample.callbacks.OnItemClickListener"/>
    
            <variable
                name="onItemClickListenerTwo"
                type="com.ks.nestedrecyclerbindingexample.callbacks.OnItemClickListener"/>
    
        </data>
    
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="vertical">
    
            <android.support.v7.widget.RecyclerView
                rvItemLayout="@{@layout/row_one}"
                rvList="@{listOne}"
                rvOnItemClick="@{onItemClickListenerOne}"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                app:layoutManager="android.support.v7.widget.LinearLayoutManager"
                />
    
            <android.support.v7.widget.RecyclerView
                rvItemLayout="@{@layout/row_two}"
                rvList="@{listTwo}"
                rvOnItemClick="@{onItemClickListenerTwo}"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                app:layoutManager="android.support.v7.widget.LinearLayoutManager"
                />
    
        </LinearLayout>
    
    </layout>
    
    rvItemLayout="@{@layout/row_one}"
    rvList="@{listOne}"
    rvOnItemClick="@{onItemClickListenerOne}"
    
    public class BindingAdapters {
        @BindingAdapter(value = {"rvItemLayout", "rvList", "rvOnItemClick"}, requireAll = false)
        public static void setRvAdapter(RecyclerView recyclerView, int rvItemLayout, List rvList, @Nullable OnItemClickListener onItemClickListener) {
            if (rvItemLayout != 0 && rvList != null && rvList.size() > 0)
                recyclerView.setAdapter(new GeneralAdapter(rvItemLayout, rvList, onItemClickListener));
        }
    }
    
    public class HomeActivity extends AppCompatActivity {
        ActivityHomeBinding binding;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            binding = DataBindingUtil.setContentView(this, R.layout.activity_home);
            binding.setListOne(new ArrayList()); // pass your list or set list from response of API
            binding.setListTwo(new ArrayList());
            binding.setOnItemClickListenerOne(new OnItemClickListener() {
                @Override
                public void onItemClick(View view, Object object) {
                    if (object instanceof ModelParent) {
                        // TODO: your action here
                    }
                }
            });
            binding.setOnItemClickListenerTwo(new OnItemClickListener() {
                @Override
                public void onItemClick(View view, Object object) {
                    if (object instanceof ModelChild) {
                        // TODO: your action here  
                    }
                }
            });
        }
    }
    
    abstract class SimpleAbstractAdapter<T>(private var items: ArrayList<T> = arrayListOf()) : RecyclerView.Adapter<SimpleAbstractAdapter.VH>() {
       protected var listener: OnViewHolderListener<T>? = null
       private val filter = ArrayFilter()
       private val lock = Any()
       protected abstract fun getLayout(): Int
       protected abstract fun bindView(item: T, viewHolder: VH)
       protected abstract fun getDiffCallback(): DiffCallback<T>?
       private var onFilterObjectCallback: OnFilterObjectCallback? = null
       private var constraint: CharSequence? = ""
    
    override fun onBindViewHolder(vh: VH, position: Int) {
        getItem(position)?.let { bindView(it, vh) }
    }
    
    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): VH {
        return VH(parent, getLayout())
    }
    
    override fun getItemCount(): Int = items.size
    
    protected abstract class DiffCallback<T> : DiffUtil.Callback() {
        private val mOldItems = ArrayList<T>()
        private val mNewItems = ArrayList<T>()
    
        fun setItems(oldItems: List<T>, newItems: List<T>) {
            mOldItems.clear()
            mOldItems.addAll(oldItems)
            mNewItems.clear()
            mNewItems.addAll(newItems)
        }
    
        override fun getOldListSize(): Int {
            return mOldItems.size
        }
    
        override fun getNewListSize(): Int {
            return mNewItems.size
        }
    
        override fun areItemsTheSame(oldItemPosition: Int, newItemPosition: Int): Boolean {
            return areItemsTheSame(
                    mOldItems[oldItemPosition],
                    mNewItems[newItemPosition]
            )
        }
    
        abstract fun areItemsTheSame(oldItem: T, newItem: T): Boolean
    
        override fun areContentsTheSame(oldItemPosition: Int, newItemPosition: Int): Boolean {
            return areContentsTheSame(
                    mOldItems[oldItemPosition],
                    mNewItems[newItemPosition]
            )
        }
    
        abstract fun areContentsTheSame(oldItem: T, newItem: T): Boolean
    }
    
    class VH(parent: ViewGroup, @LayoutRes layout: Int) : RecyclerView.ViewHolder(LayoutInflater.from(parent.context).inflate(layout, parent, false))
    
    interface OnViewHolderListener<T> {
        fun onItemClick(position: Int, item: T)
    }
    
    fun getItem(position: Int): T? {
        return items.getOrNull(position)
    }
    
    fun getItems(): ArrayList<T> {
        return items
    }
    
    fun setViewHolderListener(listener: OnViewHolderListener<T>) {
        this.listener = listener
    }
    
    fun addAll(list: List<T>) {
        val diffCallback = getDiffCallback()
        when {
            diffCallback != null && !items.isEmpty() -> {
                diffCallback.setItems(items, list)
                val diffResult = DiffUtil.calculateDiff(diffCallback)
                items.clear()
                items.addAll(list)
                diffResult.dispatchUpdatesTo(this)
            }
            diffCallback == null && !items.isEmpty() -> {
                items.clear()
                items.addAll(list)
                notifyDataSetChanged()
            }
            else -> {
                items.addAll(list)
                notifyDataSetChanged()
            }
        }
    }
    
    fun add(item: T) {
        items.add(item)
        notifyDataSetChanged()
    }
    
    fun add(position:Int, item: T) {
        items.add(position,item)
        notifyItemInserted(position)
    }
    
    fun remove(position: Int) {
        items.removeAt(position)
        notifyItemRemoved(position)
    }
    
    fun remove(item: T) {
        items.remove(item)
        notifyDataSetChanged()
    }
    
    fun clear(notify: Boolean=false) {
        items.clear()
        if (notify) {
            notifyDataSetChanged()
        }
    }
    
    fun setFilter(filter: SimpleAdapterFilter<T>): ArrayFilter {
        return this.filter.setFilter(filter)
    }
    
    interface SimpleAdapterFilter<T> {
        fun onFilterItem(contains: CharSequence, item: T): Boolean
    }
    
    fun convertResultToString(resultValue: Any): CharSequence {
        return filter.convertResultToString(resultValue)
    }
    
    fun filter(constraint: CharSequence) {
        this.constraint = constraint
        filter.filter(constraint)
    }
    
    fun filter(constraint: CharSequence, listener: Filter.FilterListener) {
        this.constraint = constraint
        filter.filter(constraint, listener)
    }
    
    fun getFilter(): Filter {
        return filter
    }
    
    interface OnFilterObjectCallback {
        fun handle(countFilterObject: Int)
    }
    
    fun setOnFilterObjectCallback(objectCallback: OnFilterObjectCallback) {
        onFilterObjectCallback = objectCallback
    }
    
    inner class ArrayFilter : Filter() {
        private var original: ArrayList<T> = arrayListOf()
        private var filter: SimpleAdapterFilter<T> = DefaultFilter()
        private var list: ArrayList<T> = arrayListOf()
        private var values: ArrayList<T> = arrayListOf()
    
    
        fun setFilter(filter: SimpleAdapterFilter<T>): ArrayFilter {
            original = items
            this.filter = filter
            return this
        }
    
        override fun performFiltering(constraint: CharSequence?): Filter.FilterResults {
            val results = Filter.FilterResults()
            if (constraint == null || constraint.isBlank()) {
                synchronized(lock) {
                    list = original
                }
                results.values = list
                results.count = list.size
            } else {
                synchronized(lock) {
                    values = original
                }
                val result = ArrayList<T>()
                for (value in values) {
                    if (constraint!=null && constraint.trim().isNotEmpty() && value != null) {
                        if (filter.onFilterItem(constraint, value)) {
                            result.add(value)
                        }
                    } else {
                        value?.let { result.add(it) }
                    }
                }
                results.values = result
                results.count = result.size
            }
            return results
        }
    
        override fun publishResults(constraint: CharSequence, results: Filter.FilterResults) {
            items = results.values as? ArrayList<T> ?: arrayListOf()
            notifyDataSetChanged()
            onFilterObjectCallback?.handle(results.count)
        }
    
    }
    
    class DefaultFilter<T> : SimpleAdapterFilter<T> {
        override fun onFilterItem(contains: CharSequence, item: T): Boolean {
            val valueText = item.toString().toLowerCase()
            if (valueText.startsWith(contains.toString())) {
                return true
            } else {
                val words = valueText.split(" ".toRegex()).dropLastWhile { it.isEmpty() }.toTypedArray()
                for (word in words) {
                    if (word.contains(contains)) {
                        return true
                    }
                }
            }
            return false
        }
      }
    }
    
    import android.annotation.SuppressLint
      import kotlinx.android.synthetic.main.task_item_layout.view.*
    
    class TasksAdapter(private val listener:TasksListener? = null) : SimpleAbstractAdapter<Task>() {
    override fun getLayout(): Int {
        return R.layout.task_item_layout
    }
    
    override fun getDiffCallback(): DiffCallback<Task>? {
        return object : DiffCallback<Task>() {
            override fun areItemsTheSame(oldItem: Task, newItem: Task): Boolean {
                return oldItem.id == newItem.id
            }
    
            override fun areContentsTheSame(oldItem: Task, newItem: Task): Boolean {
                return oldItem.items == newItem.items
            }
        }
    }
    
    @SuppressLint("SetTextI18n")
    override fun bindView(item: Task, viewHolder: VH) {
        viewHolder.itemView.apply {
            val position = viewHolder.adapterPosition
            val customer = item.customer
            val customerName = if (customer != null) customer.name else ""
            tvTaskCommentTitle.text = customerName + ", #" + item.id
            tvCommentContent.text = item.taskAddress
            ivCall.setOnClickListener {
                listener?.onCallClick(position, item)
            }
            setOnClickListener {
                listener?.onItemClick(position, item)
            }
        }
    }
    
     interface TasksListener : SimpleAbstractAdapter.OnViewHolderListener<Task> {
        fun onCallClick(position: Int, item: Task)
     }
    }
    
    mAdapter = TasksAdapter(object : TasksAdapter.TasksListener {
                override fun onCallClick(position: Int, item:Task) {
                }
    
                override fun onItemClick(position: Int, item:Task) {
    
                }
            })
    rvTasks.adapter = mAdapter
    
    mAdapter?.addAll(tasks)
    
    mAdapter?.setFilter(object : SimpleAbstractAdapter.SimpleAdapterFilter<MoveTask> {
                override fun onFilterItem(contains: CharSequence, item:Task): Boolean {
                    return contains.toString().toLowerCase().contains(item.id?.toLowerCase().toString())
                }
        })
    
    mAdapter?.filter("test")
    
      implementation 'com.google.android.material:material:1.4.0-alpha02'
        // RecyclerView
        implementation "androidx.recyclerview:recyclerview:1.2.0"
    
       <androidx.recyclerview.widget.RecyclerView
                android:id="@+id/wifiList"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
               /> 
    
    <?xml version="1.0" encoding="utf-8"?>
    <androidx.cardview.widget.CardView
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
        <LinearLayout
            android:padding="5dp"
            android:layout_width="match_parent"
            android:orientation="vertical"
            android:layout_height="wrap_content">
    
            <androidx.appcompat.widget.AppCompatTextView
                android:id="@+id/ssid"
                android:text="@string/app_name"
                android:layout_width="match_parent"
                android:textSize="17sp"
                android:layout_height="wrap_content" />
            
        </LinearLayout>
    
    </androidx.cardview.widget.CardView>
    
     class WifiAdapter(private val wifiList: ArrayList<ScanResult>) : RecyclerView.Adapter<WifiAdapter.ViewHolder>() {
    
         // holder class to hold reference
        inner class ViewHolder(view: View) : RecyclerView.ViewHolder(view) {
            //get view reference
            var ssid: TextView = view.findViewById(R.id.ssid) as TextView
        }
    
         override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
             // create view holder to hold reference
             return ViewHolder( LayoutInflater.from(parent.context).inflate(R.layout.list_item, parent, false))
         }
    
        override fun onBindViewHolder(holder: ViewHolder, position: Int) {
            //set values
            holder.ssid.text =  wifiList[position].SSID
        }
    
        override fun getItemCount(): Int {
            return wifiList.size
        }
          // update your data
         fun updateData(scanResult: ArrayList<ScanResult>) {
             wifiList.clear()
             notifyDataSetChanged()
             wifiList.addAll(scanResult)
             notifyDataSetChanged()
    
         }
     }
    
    import android.content.Context;
    import androidx.recyclerview.widget.RecyclerView
    import androidx.recyclerview.widget.RecyclerView.OnItemTouchListener
    import android.view.GestureDetector;
    import android.view.MotionEvent;
    import android.view.View;
    
    public class RecyclerTouchListener implements RecyclerView.OnItemTouchListener {
    
        public interface ClickListener {
            void onClick(View view, int position);
    
            void onLongClick(View view, RecyclerView recyclerView, int position);
    
        }
        private GestureDetector gestureDetector;
        private ClickListener clickListener;
    
        public RecyclerTouchListener(Context context, final RecyclerView recyclerView, final ClickListener clickListener) {
            this.clickListener = clickListener;
            gestureDetector = new GestureDetector(context, new GestureDetector.SimpleOnGestureListener() {
                @Override
                public boolean onSingleTapUp(MotionEvent e) {
                    return true;
                }
    
                @Override
                public void onLongPress(MotionEvent e) {
                    View child = recyclerView.findChildViewUnder(e.getX(), e.getY());
                    if (child != null && clickListener != null) {
                        clickListener.onLongClick(child,recyclerView,  recyclerView.getChildPosition(child));
                    }
                }
            });
        }
    
    
        @Override
        public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) {
            View child = rv.findChildViewUnder(e.getX(), e.getY());
            if (child != null && clickListener != null && gestureDetector.onTouchEvent(e)) {
                clickListener.onClick(child, rv.getChildPosition(child));
            }
            return false;
        }
    
        @Override
        public void onTouchEvent(RecyclerView rv, MotionEvent e) {
    
        }
    
        @Override
        public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {
    
        }
    
        wifiAdapter = WifiAdapter(ArrayList())
    
        wifiList.apply {
            // vertical layout
            layoutManager = LinearLayoutManager(applicationContext)
            // set adapter
            adapter = wifiAdapter
    
            // Touch handling
            wifiList.addOnItemTouchListener(RecyclerTouchListener(applicationContext, wifiList, object : RecyclerTouchListener.ClickListener {
                override fun onClick(view: View?, position: Int) {
                    Toast.makeText(applicationContext, "RV OnCLickj " + position, Toast.LENGTH_SHORT).show()
                }
    
                override fun onLongClick(view: View, recyclerView: RecyclerView, position: Int) {
                    Toast.makeText(applicationContext, "RV OnLongCLickj " + position, Toast.LENGTH_SHORT).show()
                }
            }
            ))
        }
    
    wifiAdapter.updateData(mScanResults as ArrayList<ScanResult>)
    
    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="46dp">
    
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/textview"
            android:text="TextView"
            android:textSize="16dp" />
    
    </LinearLayout>
    
    val items = mutableListOf<String>()
    
    inner class ItemHolder(view: View): RecyclerView.ViewHolder(view) {
        var textField: TextView = view.findViewById(android.R.id.text1) as TextView
    }
    
    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        rvitems.layoutManager = LinearLayoutManager(context)
        rvitems.adapter = object : RecyclerView.Adapter<ItemHolder>() {
    
            override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemHolder {
                return ItemHolder(LayoutInflater.from(parent.context).inflate(android.R.layout.simple_list_item_1, parent, false))
            }
    
            override fun getItemCount(): Int {
                return items.size
            }
    
            override fun onBindViewHolder(holder: ItemHolder, position: Int) {
                holder.textField.text = items[position]
                holder.textField.setOnClickListener {
                    Toast.makeText(context, "Clicked $position", Toast.LENGTH_SHORT).show()
                }
            }
        }
    }
    
    implementation 'androidx.recyclerview:recyclerview:1.1.0'
    
         public class UserModel implements Serializable {
    
        private String userName;
    
    
        public UserModel(String userName) {
            this.userName = userName;
        }
    
        public String getUserName() {
            return userName;
        }
    
        public void setUserName(String userName) {
            this.userName = userName;
        }
       }
    
    public class UsersAdapter extends RecyclerView.Adapter<UsersAdapter.UsersAdapterVh> implements Filterable {
    
        private List<UserModel> userModelList;
        private List<UserModel> getUserModelListFiltered;
        private Context context;
        private SelectedUser selectedUser;
    
        public UsersAdapter(List<UserModel> userModelList,SelectedUser selectedUser) {
            this.userModelList = userModelList;
            this.getUserModelListFiltered = userModelList;
            this.selectedUser = selectedUser;
        }
    
        @NonNull
        @Override
        public UsersAdapter.UsersAdapterVh onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
            context = parent.getContext();
    
            return new UsersAdapterVh(LayoutInflater.from(context).inflate(R.layout.row_users,null));
        }
    
        @Override
        public void onBindViewHolder(@NonNull UsersAdapter.UsersAdapterVh holder, int position) {
    
            UserModel userModel = userModelList.get(position);
    
            String username = userModel.getUserName();
            String prefix = userModel.getUserName().substring(0,1);
    
            holder.tvUsername.setText(username);
            holder.tvPrefix.setText(prefix);
    
        }
    
        @Override
        public int getItemCount() {
            return userModelList.size();
        }
    
        @Override
        public Filter getFilter() {
    
            Filter filter = new Filter() {
                @Override
                protected FilterResults performFiltering(CharSequence charSequence) {
                    FilterResults filterResults = new FilterResults();
    
                    if(charSequence == null | charSequence.length() == 0){
                        filterResults.count = getUserModelListFiltered.size();
                        filterResults.values = getUserModelListFiltered;
    
                    }else{
                        String searchChr = charSequence.toString().toLowerCase();
    
                        List<UserModel> resultData = new ArrayList<>();
    
                        for(UserModel userModel: getUserModelListFiltered){
                            if(userModel.getUserName().toLowerCase().contains(searchChr)){
                                resultData.add(userModel);
                            }
                        }
                        filterResults.count = resultData.size();
                        filterResults.values = resultData;
    
                    }
    
                    return filterResults;
                }
    
                @Override
                protected void publishResults(CharSequence charSequence, FilterResults filterResults) {
    
                    userModelList = (List<UserModel>) filterResults.values;
                    notifyDataSetChanged();
    
                }
            };
            return filter;
        }
    
    
        public interface SelectedUser{
    
            void selectedUser(UserModel userModel);
    
        }
    
        public class UsersAdapterVh extends RecyclerView.ViewHolder {
    
            TextView tvPrefix;
            TextView tvUsername;
            ImageView imIcon;
            public UsersAdapterVh(@NonNull View itemView) {
                super(itemView);
                tvPrefix = itemView.findViewById(R.id.prefix);
                tvUsername = itemView.findViewById(R.id.username);
                imIcon = itemView.findViewById(R.id.imageView);
    
                itemView.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                        selectedUser.selectedUser(userModelList.get(getAdapterPosition()));
                    }
                });
    
    
            }
        }
    }
    
        <?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">
    
        <RelativeLayout
            android:layout_width="match_parent"
            android:padding="10dp"
            android:layout_height="wrap_content">
    
            <RelativeLayout
                android:layout_width="50dp"
                android:background="@drawable/users_bg"
                android:layout_height="50dp">
                <TextView
                    android:id="@+id/prefix"
                    android:layout_width="wrap_content"
                    android:textSize="16sp"
                    android:textColor="@color/headerColor"
                    android:text="T"
                    android:layout_centerInParent="true"
                    android:layout_height="wrap_content"/>
    
            </RelativeLayout>
            <TextView
                android:id="@+id/username"
                android:layout_width="wrap_content"
                android:textSize="16sp"
                android:textColor="@color/headerColor"
                android:text="username"
                android:layout_marginStart="90dp"
                android:layout_centerVertical="true"
                android:layout_height="wrap_content"/>
            <ImageView
                android:layout_width="wrap_content"
                android:id="@+id/imageView"
                android:layout_margin="10dp"
                android:layout_alignParentEnd="true"
                android:src="@drawable/ic_navigate_next_black_24dp"
                android:layout_height="wrap_content"/>
        </RelativeLayout>
    
    </LinearLayout>
    
    Toolbar toolbar;
    RecyclerView recyclerView;
    
    List<UserModel> userModelList = new ArrayList<>();
    
    String[] names = {"Richard","Alice","Hannah","David"};
    
    UsersAdapter usersAdapter;
    
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    
        recyclerView = findViewById(R.id.recyclerview);
        toolbar = findViewById(R.id.toolbar);
    
        this.setSupportActionBar(toolbar);
        this.getSupportActionBar().setTitle("");
    
        recyclerView.setLayoutManager(new LinearLayoutManager(this));
        recyclerView.addItemDecoration(new DividerItemDecoration(this,DividerItemDecoration.VERTICAL));
    
        for(String s:names){
            UserModel userModel = new UserModel(s);
    
            userModelList.add(userModel);
        }
    
        usersAdapter = new UsersAdapter(userModelList,this);
    
        recyclerView.setAdapter(usersAdapter);
    
    }
    
    class CustomAdapter: RecyclerView.Adapter<CustomAdapter.ViewHolder>() {
        var data =  listOf<String>()
            set(value) {
                field = value
                notifyDataSetChanged()
            }
        override fun getItemCount() =data.size
    
        override fun onBindViewHolder(holder: ViewHolder, position: Int) {
            holder.txt.text= data[position]
        }
        override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
            return ViewHolder(
                LayoutInflater.from(parent.context).inflate(R.layout.item_view, parent, false)
            )
        }
    
    
        class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView){
            val txt: TextView = itemView.findViewById(R.id.item_text_view)
        }
    }
    
    val view = findViewById<RecyclerView>(R.id.recycler_view)                                              
    val adapter = CustomAdapter()                                                                          
    val data = listOf("text1", "text2", "text3")
    adapter.data = data                                                                             
    view.layoutManager = LinearLayoutManager(this, RecyclerView.VERTICAL, false)
    view.adapter = adapter