无法从Json填充的数组更新动态按钮

时间:2016-08-04 00:33:57

标签: java android arrays dynamic

****工作代码已发布****

我正在尝试更新文本将从ArrayList动态编程的按钮。正在从mySQL中检索数据。我可以获取数据并用我需要的数据填充数组(familyMemberArray)。但是由于某些原因,在收集信息时,程序不会在生成数组信息之后继续实现“趋势”数组或其余的布局编程。

我需要首先制定数据,以便知道数组有多大来创建必要的按钮数量。如果我调用一个基本的String数组,它就可以很好地填充按钮。我记得在一个uni项目上被困在这个问题上并最终放弃了,因为我无法让它工作,时间在流逝。请把我从痛苦中解脱出来

  public class TrendingMealsFragment extends Fragment {

        private TableRow tr;

        //SQLite Database
        private static final String SELECT_SQL = "SELECT * FROM family_account";
        private SQLiteDatabase db;
        private Cursor c;
        private static final String DATABASE_NAME = "FamVsFam.db";

           //  Logging
        private final String TAG = this.getClass().getName();

        private static final String EXTRA_CHALLENGE_ID = "boo.famvsfam.challenge_id";
        //Results
        private JSONArray resultFamilyMember;
        private String dbID;
        public static final String JSON_ARRAY = "result";
        private List<String> familyMemberArray;

        ArrayAdapter<String> adapter;
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);

            openDatabase();

            setHasOptionsMenu(true);

            c = db.rawQuery(SELECT_SQL, null);
            c.moveToFirst();
            getRecords();

        }

        protected void openDatabase() {

            db = getActivity().openOrCreateDatabase(DATABASE_NAME, android.content.Context.MODE_PRIVATE, null);       // db = SQLiteDatabase.openOrCreateDatabase("FamVsFam", Context.MODE_PRIVATE, null);
        }

        protected void getRecords() {
            dbID = c.getString(0);
        }


        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                 Bundle savedInstanceState) {

            getData();

            /** Declaring an ArrayAdapter to set items to ListView */
            familyMemberArray = new ArrayList<>();
            //Menu
            setHasOptionsMenu(true);
            ActionBar actionBar = ((AppCompatActivity) getActivity()).getSupportActionBar();
            actionBar.setDisplayHomeAsUpEnabled(true);

            View view = inflater.inflate(R.layout.activity_resturants, container, false);
            AppCompatActivity activity = (AppCompatActivity) getActivity();
            activity.getSupportActionBar();

            /**
             ArrayList<String> trending1 = new ArrayList<String>() {
             {
             add("one");
             add("two");
             add("three");
             add("four");
             add("five");
             add("six");
             add("seven");
             add("eight");
             add("nine");
             add("ten");
             add("eleven");
             }
             };*/

            ArrayList<String> trending = new ArrayList<String>() {
                {

                    for(int i = 0; i < familyMemberArray.size() ; i++){

                    add(familyMemberArray.get(i));

                }}
            };

            // LAYOUT SETTING 1
            RelativeLayout root = new RelativeLayout(getActivity());
            //  root.setId(Integer.parseInt(MEAL_SELECTION_ID));
            LayoutParams param1 = new LayoutParams(
                    LayoutParams.MATCH_PARENT,
                    LayoutParams.MATCH_PARENT);

            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
                root.setFitsSystemWindows(true);
            }
            root.setLayoutParams(param1);

            //LAYOUT SETTINGS 2 - TOP BANNER - WITH PAGE HEADING
            RelativeLayout rLayout1 = new RelativeLayout(getActivity());
            LayoutParams param2 = new LayoutParams(
                    LayoutParams.MATCH_PARENT,
                    LayoutParams.MATCH_PARENT);
            float topBannerDim = getResources().getDimension(R.dimen.top_banner);
            param2.height = (int) topBannerDim;
            param2.addRule(RelativeLayout.BELOW, root.getId());
            int ele = (int) getResources().getDimension(R.dimen.elevation);
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                rLayout1.setElevation(ele);
            }
            rLayout1.setBackgroundColor(Color.parseColor("#EEEBAA"));
            rLayout1.setLayoutParams(param2);

            //TEXT VIEW
            TextView text1 = new TextView(getActivity());
            text1.setText(R.string.diet_req);
            LayoutParams param3 = new LayoutParams(
                    LayoutParams.WRAP_CONTENT,
                    LayoutParams.WRAP_CONTENT);
            param3.addRule(RelativeLayout.CENTER_VERTICAL, RelativeLayout.TRUE);
            text1.setTextColor(Color.parseColor("#8A1F1D"));
            text1.setTypeface(Typeface.DEFAULT_BOLD);
            text1.setLayoutParams(param3);

            //LAYOUT SETTINGS 4
            RelativeLayout rLayout4 = new RelativeLayout(getActivity());
            LayoutParams param5 = new LayoutParams(
                    LayoutParams.MATCH_PARENT,
                    LayoutParams.MATCH_PARENT);
            topBannerDim = getResources().getDimension(R.dimen.top_banner);
            param5.height = (int) topBannerDim;
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
                param5.addRule(RelativeLayout.ALIGN_PARENT_LEFT, RelativeLayout.ALIGN_START);
            }
            param5.addRule(RelativeLayout.BELOW, rLayout1.getId());
            rLayout4.setId(R.id.id_relative_4);
            rLayout4.setBackgroundColor(Color.parseColor("#EEEBAA"));
            rLayout4.setLayoutParams(param5);

            //LAYOUT SETTINGS 5
            TableLayout rLayout5 = new TableLayout(getActivity());
            rLayout5.setOrientation(TableLayout.VERTICAL);
            LayoutParams param7 = new LayoutParams(
                    LayoutParams.MATCH_PARENT,
                    LayoutParams.MATCH_PARENT);
            param7.addRule(RelativeLayout.BELOW, rLayout4.getId());
            rLayout5.setBackgroundColor(Color.parseColor("#EEEBAA"));

            rLayout5.setLayoutParams(param7);
            // List<ToggleButton> togButtStore = new ArrayList<ToggleButton>();

            int i = 0;
            while (i < trending.size()) {
                if (i % 3 == 0) {
                    tr = new TableRow(getActivity());
                    rLayout5.addView(tr);
                }
                ToggleButton toggleBtn = new ToggleButton(getActivity());
                toggleBtn.setText(trending.get(i));
                toggleBtn.setId(i);
                toggleBtn.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
                    @Override
                    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                        if (isChecked) {
                            Context context = getActivity().getApplicationContext();

                            CharSequence text = "Hello toast!";
                            int duration = Toast.LENGTH_SHORT;
                            Toast toast = Toast.makeText(context, text, duration);
                            toast.show();
                        } else {
                            // The toggle is disabled
                        }
                    }
                });
                tr.addView(toggleBtn);
                i++;
            }

            //LAYOUT SETTINGS 6
            FrameLayout youBeenFramed = new FrameLayout(getActivity());
            LayoutParams param8 = new LayoutParams(
                    LayoutParams.MATCH_PARENT,
                    LayoutParams.WRAP_CONTENT);
            param8.addRule(RelativeLayout.BELOW, rLayout5.getId());
            youBeenFramed.setBackgroundColor(Color.parseColor("#EEEBAA"));

            root.addView(youBeenFramed);
            root.addView(rLayout1);
            rLayout1.addView(text1);
            root.addView(rLayout4);
            root.addView(rLayout5);
            getActivity().setContentView(root);



            return view;
        }

        public void getData() {
            //// TODO: 03/08/2016 Progress Dialogs : on getting data
    //        final ProgressDialog loading = ProgressDialog.show(getActivity(), "Loading Data", "Please wait...", false, false);

            StringRequest strReq = new StringRequest(Request.Method.POST,
                    PHPConfigURLS.URL_ALL_FAMILY_MEMBERS, new Response.Listener<String>() {

                @Override
                public void onResponse(String response) {

                    Log.d(TAG, "Login Response: " + response.toString());
                    JSONObject j = null;

                    try {

                        //   loading.dismiss();
                        //Parsing the fetched Json String to JSON Object
                        j = new JSONObject(response);
                        //Storing the Array of JSON String to our JSON Array
                        resultFamilyMember = j.getJSONArray(JSON_ARRAY);
                        //Calling method getStudents to get the students from the JSON Array
                        getDBFamilyName(resultFamilyMember);

                    } catch (JSONException e) {
                        // JSON error
                        e.printStackTrace();
                    }
                }
            }, new Response.ErrorListener() {

                @Override
                public void onErrorResponse(VolleyError error) {

                }
            }) {
                @Override
                protected Map<String, String> getParams() {

                    String id = dbID;
                    // Posting params to register url
                    Map<String, String> params = new HashMap<String, String>();
                    params.put("id", id);
                    // params.put("email", email);
                    //  params.put("password", password);

                    return params;
                }
            };

            RequestQueue requestQueue = Volley.newRequestQueue(getActivity());

            //Adding request to the queue
            requestQueue.add(strReq);
        }

        private void getDBFamilyName(JSONArray j) {

            //Traversing through all the items in the json array
            for (int i = 0; i < j.length(); i++) {

                FamilyAccount familyMember = new FamilyAccount();

                try {
                    //Getting json object
                    JSONObject json = j.getJSONObject(i);

                    familyMember = new FamilyAccount();
                    familyMember.setName(json.getString("name"));
                    familyMember.setID(json.getInt("id"));

                } catch (JSONException e) {
                    e.printStackTrace();
                }
                //Adding the title of the challenge to array list
                familyMemberArray.add(familyMember.getName());
            }

        }

    }

提前致谢

2 个答案:

答案 0 :(得分:1)

  

由于某种原因,在收集信息时,程序不会在生成数组信息后继续实现“趋势”数组或其余的布局编程。

这是因为当您在请求完成时调用此布局时,布局不会“动态”更新。

familyMemberArray.add(familyMember.getName());

您必须清除视图,并重新添加所有视图,或者将所有视图生成代码“提取”到它自己的方法中,您可以使用ArrayList的参数调用它。

基本上,// LAYOUT SETTING 1return view(不包含)之间的所有内容都需要移动到public void generateView(ArrayList<String> familyMemberArray)方法中,如果需要,该方法可以选择性地返回生成的根视图。

然后,在getFamilyName()的末尾,在循环外部,使用您的ArrayList调用该方法。

  

我需要首先制定数据,以便知道数组有多大来创建必要的按钮数量。

我不确定我知道你在做什么。除非你的意思是

while (i < trending.size()) {

相反,trending是与familyMemberArray完全不同的列表引用,因此它也不会更新。虽然,它包含完全相同的数据?

ArrayList<String> trending = new ArrayList<String>() {
    {
        for(int i = 0; i < familyMemberArray.size() ; i++){
            add(familyMemberArray.get(i));
    }}
};

考虑到ArrayList构造函数已经提供了该功能

,那段代码看起来有点奇怪
ArrayList<String> trending = new ArrayList<String>(familyMemberArray);

答案 1 :(得分:0)

*****工作代码******贷记给cricket_007

<强>字段

public class TrendingMealsFragment extends Fragment {
    //  Logging
    private final String TAG = this.getClass().getName();

    //Results
    private JSONArray resultFamilyMember;
    public static final String JSON_ARRAY = "result";
    private ArrayList<String> familyMemberArray;

    //Layout
    private TableRow tr;

<强> OnCreateView()

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {

    View view = inflater.inflate(R.layout.activity_resturants, container, false);
    generateView(familyMemberArray);
    getData();
    return view;
}

<强>的GetData()

public void getData() {

    StringRequest strReq = new StringRequest(Request.Method.POST,
            PHPConfigURLS.URL_ALL_FAMILY_MEMBERS, new Response.Listener<String>() {

        @Override
        public void onResponse(String response) {

            Log.d(TAG, "Login Response: " + response.toString());
            JSONObject j = null;

            try {
                //Parsing the fetched Json String to JSON Object
                j = new JSONObject(response);
                //Storing the Array of JSON String to our JSON Array
                resultFamilyMember = j.getJSONArray(JSON_ARRAY);
                //Calling method getStudents to get the students from the JSON Array
                getDBFamilyName(resultFamilyMember);

            } catch (JSONException e) {
                e.printStackTrace();
            }
        }
    }, new Response.ErrorListener() {

        @Override
        public void onErrorResponse(VolleyError error) {

        }
    }) {
        @Override
        protected Map<String, String> getParams() {

            String id = dbID;
            Map<String, String> params = new HashMap<String, String>();
            params.put("id", id);
            return params;
        }
    };
    RequestQueue requestQueue = Volley.newRequestQueue(getActivity());
    //Adding request to the queue
    requestQueue.add(strReq);
}

<强> getDBFamilyName()

 private void getDBFamilyName(JSONArray j) {

        //Traversing through all the items in the json array
        for (int i = 0; i < j.length(); i++) {

            FamilyAccount familyMember = new FamilyAccount();

            try {
                //Getting json object
                JSONObject json = j.getJSONObject(i);
                familyMember = new FamilyAccount();
                familyMember.setName(json.getString("name"));
                familyMember.setID(json.getInt("id"));

            } catch (JSONException e) {
                e.printStackTrace();
            }
            //Adding the title of the challenge to array list
            familyMemberArray.add(familyMember.getName());
            generateView(familyMemberArray);

        }
    }

<强> generateView()

    public View generateView(ArrayList<String> familyMemberArray) {
...
rLayout5.setLayoutParams(param7);
    //Create Buttons

            int i = 0;
            while (i < familyMemberArray.size()) {
                if (i % 3 == 0) {
                    tr = new TableRow(getActivity());
                    rLayout5.addView(tr);
                }


                ToggleButton toggleBtn = new ToggleButton(getActivity());
                toggleBtn.setText(familyMemberArray.get(i));
                toggleBtn.setId(i);
                toggleBtn.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
                    @Override
                    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                        if (isChecked) {
                            Context context = getActivity().getApplicationContext();

                            CharSequence text = "Hello toast!";
                            int duration = Toast.LENGTH_SHORT;
                            Toast toast = Toast.makeText(context, text, duration);
                            toast.show();
                        } else {
                            // The toggle is disabled
                        }
                    }
                });
                tr.addView(toggleBtn);
                i++;
            }
...
 root.addView(rLayout5);
        getActivity().setContentView(root);

        return root;
}
}