首页 > 解决方案 > 如何在可扩展的 RecyclerView 中获取所选项目

问题描述

我是 android 开发的新手,我开始研究可扩展的 RecyclerView。现在我的问题是我的子(子模块)列表是从可扩展 RecyclerView 上的选定父级(模块)动态填充的。我尝试使用 for 循环,但打开时只填充最后一个子列表。我只是想知道是否有一种方法可以实现项目单击侦听器以仅返回单个选定的模块。

这是我的适配器:

public class ReportAdapter extends ExpandableRecyclerViewAdapter<ModuleViewHolder, DoiViewHolder> {
Context context;

public ReportAdapter(List<? extends ExpandableGroup> groups, Context context) {
    super(groups);
    this.context = context;

}

@Override
public ModuleViewHolder onCreateGroupViewHolder(ViewGroup parent, int viewType) {
    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item_module,parent,false);

    return new ModuleViewHolder(view);
}

@Override
public DoiViewHolder onCreateChildViewHolder(ViewGroup parent, int viewType) {
    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item_doi,parent,false);

    return new DoiViewHolder(view);
}

@Override
public void onBindChildViewHolder(DoiViewHolder holder, int flatPosition, ExpandableGroup group, int childIndex) {
    ModuleDoi moduleDoi =(ModuleDoi) group.getItems().get(childIndex);

    holder.setDoiName(moduleDoi.getName());

}

@Override
public void onBindGroupViewHolder(ModuleViewHolder holder, int flatPosition, ExpandableGroup group) {
holder.setModuleName(group.getTitle());

}

}

这是我的父母持有人:

public class ModuleViewHolder extends GroupViewHolder implements View.OnClickListener{
TextView moduleName ;

public ModuleViewHolder(View itemView) {
    super(itemView);
moduleName = (TextView) itemView.findViewById(R.id.module_name);


}

  public void  setModuleName(String  name){

    moduleName.setText(name);
 }


 }

这是我的 Childs 持有人(子模块)

public class DoiViewHolder extends ChildViewHolder  {
TextView doiName;
public DoiViewHolder(View itemView) {
    super(itemView);
    doiName = (TextView) itemView.findViewById(R.id.module_doi_name);

}
public void setDoiName(String name){
    doiName.setText(name);
}

}

这是我设置适配器的地方。我正在使用 moduleDoiList = fetchModuleMenus(APPID, MODULENAME); 从 json 文件中获取子模块列表。在这种情况下,app id 是一个常量,MODULENAME 是从 Modules Array 列表中获取的。

   JSONArray jsonArray = jsonObject.getJSONArray("RESPONSE");
                            moduleDoiList = new ArrayList<>();
                            appModulesList = new ArrayList<>();

                            for (int i = 0; i < jsonArray.length(); i++) {
                                JSONObject eachModuleObject = jsonArray.getJSONObject(i);
                                MODULES modules = new MODULES(eachModuleObject.getString("MODULENAME"),
                                        eachModuleObject.getString("MODULEID"));
                                ModulesList.add(modules);
                                for(int j = 0; j<ModulesList.size(); j++) {
                                    String moduleTitle = ModulesList.get(i).getModuleName();
                                    String MODULENAME = ModulesList.get(i).getModuleName();


                                    moduleDoiList = fetchModuleMenus(APPID, MODULENAME);
                                    appModulesList.add(new AppModules(moduleTitle, moduleDoiList));
                                }
                            }


                            reportAdapter = new ReportAdapter(appModulesList, POIDocsReportsActivity.this);
                            reportAdapter.notifyDataSetChanged();

                            rv.setAdapter(reportAdapter);

这是我的 fetchModulesMenu 方法:

  public List<ModuleDoi> fetchModuleMenus(final String appId, final String moduleId) {
    moduleDoiList = new ArrayList<>();
    Thread thread = new Thread() {
        Handler handler = new Handler();
        ProgressDialog progressDialog;
        boolean error;

        @Override
        public void run() {

            handler.post(new Runnable() {
                @Override
                public void run() {
                    progressDialog = new ProgressDialog(POIDocsReportsActivity.this, R.style.Theme_AppCompat_DayNight_Dialog_Alert);
                    progressDialog.setMessage("Please wait...");
                    progressDialog.setCancelable(false);
                    progressDialog.show();
                }
            });

            String url = AppConfig.SERVER_URL + "load_module_menus.php";
            HashMap hashMap = new HashMap();

            hashMap.put("APPID", appId);

            hashMap.put("MODULEID", moduleId);
            JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(Request.Method.POST,url, new JSONObject(hashMap), new Response.Listener<JSONObject>() {
                @Override
                public void onResponse(JSONObject response) {
                    try {
                        progressDialog.dismiss();
                        JSONObject jsonObject = new JSONObject(response.toString());
                        error = jsonObject.getBoolean("ERROR");
                        if (error){
                            Toast.makeText(POIDocsReportsActivity.this, "MENUS NOT FOUND ", Toast.LENGTH_LONG).show();
                        }
                        else{
                            JSONArray jsonArray = jsonObject.getJSONArray("RESPONSE");
                            for (int i = 0; i < jsonArray.length(); i++){
                                JSONObject eachMenu = jsonArray.getJSONObject(i);
                                ModuleDoi moduleDoi = new ModuleDoi(eachMenu.getString("POINAME"), eachMenu.getString("POICODE"));
                                moduleDoiList.add(moduleDoi);
                            }
                        }
                    } catch (JSONException e) {
                        e.printStackTrace();
                        Toast.makeText(POIDocsReportsActivity.this, "CONNECTION ERROR ", Toast.LENGTH_LONG).show();
                    }

                }
            }, new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError error) {
                    progressDialog.dismiss();
                    Toast.makeText(POIDocsReportsActivity.this, "NO RESPONSE", Toast.LENGTH_LONG).show();
                }
            });
            AppController.getInstance().addToRequestQueue(jsonObjectRequest);
        }


    };
    thread.run();

   return  moduleDoiList;

   }

我正在使用Thoughtbot自定义可扩展回收站视图

标签: javaandroidandroid-recyclerview

解决方案


推荐阅读