0

**I want to know how to click the items in childRecyclerview show different fragment, I think we should try to modify childAdapter, I am searching for a long time on net. But no use. Please help or try to give some ideas how to achieve this. hear is my code **

//workflow fragment

public class WorkflowFragment extends Fragment {

    private Context mContext;
    private String[] workflowHeading;
    private String[] workflowContent;
    private int[] imageResourceId;



    private RecyclerView recyclerview;   
    private List<Workflow> workflowList;  
    private WorkflowAdapter workflowAdapter;
    private View view;


    public static WorkflowFragment newInstance(String param1, String param2) {
        WorkflowFragment fragment = new WorkflowFragment();
        return fragment;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        mContext = getActivity();
        setHasOptionsMenu(true);
        super.onCreate(savedInstanceState);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        if(view==null) {
            view = inflater.inflate(R.layout.fragment_workflow, container, false);
        }
        return view;
    }

    @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        dataInitialize();

        recyclerview = view.findViewById(R.id.workflow_recyclerview);  
        recyclerview.setLayoutManager(new LinearLayoutManager(getContext()));   
        recyclerview.setHasFixedSize(true);
        workflowAdapter =new WorkflowAdapter(getContext(),workflowList);   
        recyclerview.setAdapter(workflowAdapter);    
        workflowAdapter.notifyDataSetChanged();      

    }

    private void dataInitialize() {

        //list1
        List<String> nestedList1 = new ArrayList<>();  
        nestedList1.add("A");
        nestedList1.add("B");
        nestedList1.add("C");
        nestedList1.add("D");
        nestedList1.add("E");
        nestedList1.add("F");
        nestedList1.add("G");

        //list2
        List<String>nestedList2 = new ArrayList<>();
        nestedList2.add("H");
        nestedList2.add("I");
        nestedList2.add("G");
        nestedList2.add("K");

        //list3
        List<String>nestedList3 = new ArrayList<>();
        nestedList3.add("L");
        nestedList3.add("M");
        nestedList3.add("N");
        nestedList3.add("P");
        nestedList3.add("P");
        nestedList3.add("Q");
        nestedList3.add("R");
        nestedList3.add("S");

        //list4
        List<String>nestedList4 = new ArrayList<>();
        nestedList4.add("T");
        nestedList4.add("U");
        nestedList4.add("V");
        nestedList4.add("W");

        //list5
        List<String>nestedList5 = new ArrayList<>();
        nestedList5.add("X");

        //list6
        List<String>nestedList6 = new ArrayList<>();
        nestedList6.add("Y");
        nestedList6.add("Z");


      
        workflowList = new ArrayList<>();      
        workflowList.add(new Workflow("1",nestedList1));
        workflowList.add(new Workflow("2",nestedList2));
        workflowList.add(new Workflow("3",nestedList3));
        workflowList.add(new Workflow("4",nestedList4));
        workflowList.add(new Workflow("5",nestedList5));
        workflowList.add(new Workflow("6",nestedList6));
    }


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

        inflater.inflate(R.menu.menu_item,menu);
        MenuItem searchItem = menu.findItem(R.id.search_action);


        if(searchItem!=null){
            SearchView searchView = (SearchView) searchItem.getActionView();  //here stop working
            searchView.setMaxWidth(Integer.MAX_VALUE); 
            searchView.setQueryHint("Search Here!");  
            searchView.setIconified(false);  
            searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
                @Override
                public boolean onQueryTextSubmit(String query) {

                    workflowAdapter.getFilter().filter(query);
                    return false;
                }

                @Override
                public boolean onQueryTextChange(String newText) {
notifyItemChanged()
                    workflowAdapter.getFilter().filter(newText);
                    return false;
                }
            });
        }
        super.onCreateOptionsMenu(menu, inflater);
    }
    
}

//ParentAdapter

public class WorkflowAdapter extends RecyclerView.Adapter<WorkflowAdapter.WorkflowViewHolder> implements Filterable{

    Context context;               
    List<Workflow> worflowArrayList;
    List<Workflow> worflowArrayListFull;      
    private List<String>nestedlist = new ArrayList<>();  


    public WorkflowAdapter(Context context, List<Workflow> worflowArrayList) {
        this.context = context;
        this.worflowArrayListFull = worflowArrayList;
        this.worflowArrayList = new ArrayList<>(worflowArrayListFull);  
    }

    @NonNull
    @Override
    public WorkflowViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View v = LayoutInflater.from(context).inflate(R.layout.general_list_item,parent,false);
        return new WorkflowViewHolder(v);
    }

    @Override
    public void onBindViewHolder(@NonNull WorkflowViewHolder holder, int parentPosition) {
        //-get element from your dataset at this position
        //-replace the contents of the view with that element
        Workflow workflow = worflowArrayList.get(parentPosition);
        holder.tvHeading.setText(workflow.getItemText());    
        //holder.titleImage.setImageResource(model.titleImage);

        boolean isExpandable = workflow.isExpandable();
        holder.expandableLayout.setVisibility(isExpandable ? View.VISIBLE:View.GONE);

        if(isExpandable){
            holder.mArrowImage.setImageResource(R.drawable.ic_baseline_arrow_upward_24);
        }else{
            holder.mArrowImage.setImageResource(R.drawable.ic_baseline_arrow_downward_24);
        }
        NestedAdapter childAdapter = new NestedAdapter(nestedlist);
        holder.nestedRecyclerView.setLayoutManager(new LinearLayoutManager(holder.itemView.getContext()));
        holder.nestedRecyclerView.setHasFixedSize(true);
        holder.nestedRecyclerView.setAdapter(childAdapter);

        holder.linearLayout.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                switch(holder.getAdapterPosition()){
                    case 1:
                        Toast.makeText(holder.itemView.getContext(), "Item 11 clicked. ", Toast.LENGTH_SHORT).show();
                            break;
                }

                workflow.setExpandable(!workflow.isExpandable());
                nestedlist = workflow.getNestedList();
                notifyItemChanged(holder.getAdapterPosition());
            }
        });
    }

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

    @Override
    public Filter getFilter() {
        return workflowFilter;
    }

    private final Filter workflowFilter = new Filter(){

        @Override
        protected FilterResults performFiltering(CharSequence constraint) {
            ArrayList<Workflow> filteredWorkflowList = new ArrayList<>();

            if (constraint == null || constraint.length() == 0){

                filteredWorkflowList.addAll(worflowArrayListFull);

            }else{

                String filterPattern = constraint.toString().toLowerCase().trim();

                for (Workflow workflow: worflowArrayListFull){
                    if(workflow.itemText.toLowerCase().contains(filterPattern))  
                        filteredWorkflowList.add(workflow);
                }
            }
            FilterResults results = new FilterResults();
            results.values = filteredWorkflowList;
            results.count = filteredWorkflowList.size();
            return results;
        }

        @Override
        protected void publishResults(CharSequence constraint, FilterResults results) {
            worflowArrayList.clear();
            worflowArrayList.addAll((ArrayList)results.values);
            notifyDataSetChanged();
        }
    };

    public static class WorkflowViewHolder extends RecyclerView.ViewHolder{
        private TextView tvHeading; 
        private LinearLayout linearLayout;
        private RelativeLayout expandableLayout;
        private ImageView mArrowImage;
        private RecyclerView nestedRecyclerView;

        public WorkflowViewHolder(@NonNull View itemView) {
            super(itemView);

            linearLayout=itemView.findViewById(R.id.linear_layout);
            expandableLayout=itemView.findViewById(R.id.expandable_layout);
            tvHeading = itemView.findViewById(R.id.tvHeading);
            mArrowImage=itemView.findViewById(R.id.arro_imageview);
            nestedRecyclerView = itemView.findViewById(R.id.child_rv);
        }
    }
}

//childAdapter

public class NestedAdapter extends RecyclerView.Adapter<com.larntech.myassistant_java.workflow.NestedAdapter.NestedViewHolder> {
    private List<String> childItemList;  /

    public NestedAdapter(List<String> childItemList){
        
        this.childItemList = childItemList;
    }
    @NonNull
    @Override
    public com.larntech.myassistant_java.workflow.NestedAdapter.NestedViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.nested_item,parent,false);
        return new com.larntech.myassistant_java.workflow.NestedAdapter.NestedViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull com.larntech.myassistant_java.workflow.NestedAdapter.NestedViewHolder holder, int childPosition) {
        holder.mTv.setText(childItemList.get(childPosition));  
        

        holder.itemView.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View view) {
                switch(holder.getAdapterPosition()){
                    case 0:
                        DemoFragment demoFragment =new DemoFragment();
                        AppCompatActivity activity=(AppCompatActivity) view.getContext();
                        activity.getSupportFragmentManager().beginTransaction().replace(R.id.fragment_workflow,demoFragment).addToBackStack(null).commit();

                        break;
                    case 1:
                        FragmentTwo fragmentTwo =new FragmentTwo();
                        AppCompatActivity activity2=(AppCompatActivity) view.getContext();
                        activity2.getSupportFragmentManager().beginTransaction().replace(R.id.fragment_workflow,fragmentTwo).addToBackStack(null).commit();
                        break;
                    case 2:
                        Toast.makeText(holder.itemView.getContext(), "Item clicked. ", Toast.LENGTH_SHORT).show();
                        break;
                }
            }
        });
    }

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

    public class NestedViewHolder extends RecyclerView.ViewHolder{
        private TextView mTv;  

        public NestedViewHolder(@NonNull View itemView) {
            super(itemView);
            mTv=itemView.findViewById(R.id.nestedItemTv);  

        }
    }
}
Lei You
  • 1
  • 1
  • 1
    Don't use `getAdapterPosition()`. It is deprecated because in a case of nested adapters it gives wrong position. Use either `getBindingAdapterPosition` or use `position` from `onBindViewHolder`. – TheLibrarian Oct 20 '22 at 08:14

0 Answers0