0

I would like to update panel wise items in inner adapter item android recyclerview. When we pass the data dynamically.Data displaying is working fine. When we go to update the inner adapter item, it's not getting updated. But last item was getting update fine.

Activity.

public class PannelCreation extends AppCompatActivity {
 
  RecyclerView userPanelRecycler;
  List<String> roomPanels = new ArrayList<>();
 List<JSONObject> roomItemObject = new ArrayList<JSONObject>();

 protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_pannel_creation);
        userPanelRecycler = findViewById(R.id.user_panel_recycler);

        for(int i=0; i<=5;i++){

           roomPanels.add("Panels "+i)
        }
    
        PanelAdapter panelAdapter = new PanelAdapter(getApplicationContext(),roomPanels);
        userPanelRecycler.setLayoutManager(new LinearLayoutManager(this));
        userPanelRecycler.setHasFixedSize(true);
        userPanelRecycler.setAdapter(panelAdapter);

      }
} 

// OuterAdapter

class PanelAdapter extends RecyclerView.Adapter<PanelAdapter.ViewHolder>{
        Context context;
        List<String> roomPanelList;
        RecyclerView.RecycledViewPool recycledViewPool;
        List<ItemData> itemDataList = new ArrayList<>();

    public PanelAdapter(Context context, List<String> roomPanels) {
            this.context = context;
            this.roomPanelList = roomPanels;
            recycledViewPool = new RecyclerView.RecycledViewPool();
        }
        @NonNull
        @Override
        public PanelAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
            View view =  LayoutInflater.from(context).inflate(R.layout.panel_wise_layout,parent,false);
            ViewHolder viewHolder = new ViewHolder(view);
            viewHolder.itemsRecycler.setRecycledViewPool(recycledViewPool);
            return viewHolder;
        }
        @Override
        public void onBindViewHolder(@NonNull PanelAdapter.ViewHolder holder, int position) {
          holder.userPanelName.setText(roomPanelList.get(position));
          String cur_panelName = roomPanelList.get(position);
            itemsAdapter = new ItemsAdapter(context);
            holder.itemsRecycler.setLayoutManager(new GridLayoutManager(context,3));
            holder. itemsRecycler.setHasFixedSize(true);
            holder.itemsRecycler.setAdapter(itemsAdapter);
            holder.itemsRecycler.setNestedScrollingEnabled(false);
        
          try {
               roomItemObject.clear();
               JSONArray metaArray = new JSONArray(metaData);
               int count = 0;
               for(int i = 0;i<metaArray.length();i++){
                   JSONObject object = metaArray.getJSONObject(i);
                   String name = object.getString("name");
                   String[] rNum = name.split("_");
                   if(rNum[0].equalsIgnoreCase(roomNumber)){
                       roomItemObject.add(object);
                   }
                   count = count+1;
               }
               if(count == metaArray.length()){
                   int count1 = 0;
                   itemDataList.clear();

         for(int i =0; i < roomItemObject.size();i++){

         JSONObject itemObject1 = roomItemObject.get(i);
                       String groupNames = itemObject1.getString("groupNames");
                       String types = itemObject1.getString("type");
             String metaValue = itemObject1.getString("metadata");
                           JSONObject panelObject = new JSONObject(metaValue);
                           String panel_name = panelObject.getString("panelName");
                           JSONObject valueObject = new JSONObject(panel_name);
                           String value = valueObject.getString("value");

                           if(value.equalsIgnoreCase(cur_panelName)){

                               String labels = itemObject1.getString("label");
                               String names = itemObject1.getString("name");
                               String state = itemObject1.getString("state");
                               String groupName = itemObject1.getString("groupNames");
                               String tags = itemObject1.getString("tags");

                               ItemData itemData = new ItemData();
                               itemData.setLabelName(labels);
                               itemData.setState(state);
                               itemData.setItemName(names);
                               itemData.setTags(tags);
                               itemData.setTypes(types);
                               itemData.setGroup(groupName);

                               itemDataList.add(itemData);
                               itemsAdapter.addItems(itemDataList);
                               itemsAdapter.notifyDataSetChanged();
                           }
        }

        }

    }catch (JSONException e){
               e.printStackTrace();
          }
       
      }

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

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

    @Override
        public int getItemViewType(int position) {
            return position;
        }

        public class ViewHolder extends RecyclerView.ViewHolder{
            RecyclerView itemsRecycler;
            TextView userPanelName;
            Button deletePanel;


            public ViewHolder(@NonNull View itemView) {
                super(itemView);
                itemsRecycler = itemView.findViewById(R.id.panel_item_recycler);
                userPanelName = itemView.findViewById(R.id.test_panel_name);
                deletePanel = itemView.findViewById(R.id.delete_panel);
            }
        }
}

//Inner Adapter

 class ItemsAdapter extends RecyclerView.Adapter<ItemsAdapter.ItemHolder>{
        Context mContext;
        List<ItemData> innerItemDataList = new ArrayList<>();
        List<JSONObject> itemObjectList = new ArrayList<JSONObject>();
        List<JSONObject> recObjectList = new ArrayList<>();
        ItemData itemData;

     public ItemsAdapter(Context context) {
            this.mContext = context;
            this.itemData = new ItemData();
        }
        public void addItems(List<ItemData> itemData){
            this.innerItemDataList.clear();
            this.innerItemDataList.addAll(itemData);
            notifyDataSetChanged();
        }

        @NonNull
        @Override
        public ItemsAdapter.ItemHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
            View itemView = LayoutInflater.from(mContext).inflate(R.layout.panel_wise_item,parent,false);
            return new ItemHolder(itemView);
        }

        @Override
        public void onBindViewHolder(@NonNull ItemHolder holder, int position) {

             itemData = innerItemDataList.get(position);
      if(itemData != null){

                holder.itemNames.setText(itemData.getLabelName());
    }
       @Override
        public int getItemCount() {
            return innerItemDataList.size();
        }

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

        @Override
        public int getItemViewType(int position) {
            return position;
        }

        public class ItemHolder extends RecyclerView.ViewHolder {
            TextView itemNames;
            LinearLayout itemLayout;
            ImageView itemImg;
            public ItemHolder(@NonNull View itemView) {
                super(itemView);
                itemNames = itemView.findViewById(R.id.panel_item_name);
                itemLayout = itemView.findViewById(R.id.panel_light_linear);
                itemImg = itemView.findViewById(R.id.panel_item_img);
            }
        }
     public void updateItem(String itemName,String state){
        for(int j=0;j<innerItemDataList.size();j++){
                    if(itemName.equalsIgnoreCase(innerItemDataList.get(j).getItemName())){
                      innerItemDataList.get(j).setState(state);
                      notifyDataSetChanged();
                    }
                }
    }

}

//Inner adapter data model class

public class ItemData {
    String labelName;
    String itemName;
    String state;
    String group;
    String tags;
    String types;

    public String getTypes() {
        return types;
    }

    public void setTypes(String types) {
        this.types = types;
    }

    public String getTags() {
        return tags;
    }

    public void setTags(String tags) {
        this.tags = tags;
    }

    public String getLabelName() {
        return labelName;
    }

    public void setLabelName(String labelName) {
        this.labelName = labelName;
    }

    public String getItemName() {
        return itemName;
    }

    public void setItemName(String itemName) {
        this.itemName = itemName;
    }

    public String getState() {
        return state;
    }

    public void setState(String state) {
        this.state = state;
    }

    public String getGroup() {
        return group;
    }

    public void setGroup(String group) {
        this.group = group;
    }
}

How to update specific item in inner adapter android nested recycler view.Can anyone guide me how to deal with update specific item. One more thing have observed inner adapter returns last position of array list only. Items are updating fine in last position of array list. When trying to updating the rest of position array list items, not getting updated.

Thanks in Advance.

Amar.

amar544
  • 43
  • 9

1 Answers1

-1

In outer adapter when ever data changes need to notify. Try this code

  panelAdapter.notifyDataSetChanged();
Mr_vmh
  • 171
  • 1
  • 9
  • I did too this. it's not working. My intention is showing data panel wise. ex: like panel 1 contains 4 items and panel 2 contains 6 items. When I was update panel 1 items not getting updated. panel 2 items getting updated fine. – amar544 Aug 03 '20 at 07:36
  • Make use of data.set(updateIndex, newValue); adapter.notifyItemChanged(updateIndex); – Mr_vmh Aug 03 '20 at 08:00
  • When i try to update item name and state. I was getting only panel2 array list. so panel2 items working fine.Then how to get panel1 array list. – amar544 Aug 03 '20 at 08:47
  • In UpdateItem(). use notifyDataSetChanged(); after for loop. Try this. – Mr_vmh Aug 03 '20 at 09:32
  • ItemAdapter returns only panel2 list. Items adapter not holing panel1 list. When try to loop itemadapter returns list showing only pane2 list. – amar544 Aug 03 '20 at 10:24