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

时间:2020-08-03 06:26:56

标签: android nestedrecyclerview

我想更新内部适配器项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);

      }
} 

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

如何在内部适配器android嵌套回收器视图中更新特定项目。任何人都可以指导我如何处理特定项目。还有另一件事观察到内部适配器仅返回数组列表的最后位置。项目在数组列表的最后位置更新良好。尝试更新位置数组列表项的其余部分时,未更新。

预先感谢。

阿马尔。

1 个答案:

答案 0 :(得分:0)

在外部适配器中,每当有数据更改需要通知时。试试这个代码

  panelAdapter.notifyDataSetChanged();