简体   繁体   English

如何在 android 嵌套回收器视图中更新内部适配器项

[英]How to update inner adapter item in android nested recycler view

I would like to update panel wise items in inner adapter item android recyclerview.我想更新内部适配器项目 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.当我们 go 更新内部适配器项时,它没有更新。 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 //内适配器数据 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.如何更新内部适配器 android 嵌套回收器视图中的特定项目。谁能指导我如何处理更新特定项目。 One more thing have observed inner adapter returns last position of array list only.另一件事观察到内部适配器仅返回数组列表的最后一个 position。 Items are updating fine in last position of array list.数组列表的最后一个 position 中的项目正在更新。 When trying to updating the rest of position array list items, not getting updated.尝试更新 position 数组列表项的 rest 时,未得到更新。

Thanks in Advance.提前致谢。

Amar.阿马尔。

In outer adapter when ever data changes need to notify.在外部适配器中,当数据更改需要通知时。 Try this code试试这个代码

  panelAdapter.notifyDataSetChanged();

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM