Как обновить элемент внутреннего адаптера в представлении вложенного ресайклера Android

Я хотел бы обновить элементы панели во внутреннем элементе адаптера android recyclerview. Когда мы передаем данные динамически. Отображение данных работает нормально. Когда мы идем обновлять элемент внутреннего адаптера, он не обновляется. Но последний элемент обновлялся нормально.

Мероприятия.

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);

      }
} 

// Внешний адаптер

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);
            }
        }
}

//Внутренний адаптер

 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();
                    }
                }
    }

}

//Класс модели данных внутреннего адаптера

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;
    }
}

Как обновить определенный элемент во внутреннем адаптере Android, вложенном в вид ресайклера. Может ли кто-нибудь помочь мне, как справиться с обновлением определенного элемента. Еще одна вещь, которую наблюдал внутренний адаптер, возвращает только последнюю позицию списка массивов. Элементы обновляются нормально в последней позиции списка массивов. При попытке обновить остальные элементы списка массива позиций не обновляются.

Заранее спасибо.

Амар.


person amar544    schedule 03.08.2020    source источник


Ответы (1)


Во внешнем адаптере при изменении данных необходимо уведомлять. Попробуйте этот код

  panelAdapter.notifyDataSetChanged();
person Mr_vmh    schedule 03.08.2020
comment
Я тоже это сделал. это не работает. Мое намерение - показать панель данных мудро. пример: например, панель 1 содержит 4 элемента, а панель 2 содержит 6 элементов. Когда я обновлял панель 1, элементы не обновлялись. Элементы панели 2 обновляются нормально. - person amar544; 03.08.2020
comment
Используйте data.set(updateIndex, newValue); адаптер.notifyItemChanged(updateIndex); - person Mr_vmh; 03.08.2020
comment
Когда я пытаюсь обновить имя и состояние элемента. Я получал только список массивов panel2. поэтому элементы панели2 работают нормально. Тогда как получить список массивов панели1. - person amar544; 03.08.2020
comment
В элементе обновления(). использовать notifyDataSetChanged(); после цикла. Попробуй это. - person Mr_vmh; 03.08.2020
comment
ItemAdapter возвращает только список panel2. Адаптер элементов не содержит список панелей 1. При попытке зациклить itemadapter возвращает список, показывающий только список pane2. - person amar544; 03.08.2020