Как обновить элемент внутреннего адаптера в android вложенном виде ресайклера - PullRequest
0 голосов
/ 03 августа 2020

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

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

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

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

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

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

Amar.

1 Ответ

0 голосов
/ 03 августа 2020

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

  panelAdapter.notifyDataSetChanged();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...