当数据来自服务器时,如何在android中更新Array.xml的值

时间:2015-10-01 09:19:26

标签: java android arrays xml

我希望以编程方式从服务器更新我的array.xml。

我的MainActivity.java: -

public class MainActivity extends AppCompatActivity  {

//private static String TAG = MainActivity.class.getSimpleName();

private Toolbar mToolbar;
ExpandableListAdapter listAdapter;
ExpandableListView expListView;
List<String> listDataHeader;
int arraylistvalue = 0;
ArrayList<String> arraylist1,arraylist2,arraylist3,arrayList4,arrayList5;
int cnt = 0;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    mToolbar = (Toolbar) findViewById(R.id.toolbar);

    setSupportActionBar(mToolbar);
    getSupportActionBar().setDisplayShowHomeEnabled(true);

    List<String> listDataHeader = new ArrayList<>();
    String[] mItemHeaders = getResources().getStringArray(R.array.items_array_expandable_level_one);

    Collections.addAll(listDataHeader, mItemHeaders);
    ExpandableListView mExpandableListView = (ExpandableListView) findViewById(R.id.lvExp);
    if (mExpandableListView != null) {
        ParentLevelAdapter parentLevelAdapter = new ParentLevelAdapter(this, listDataHeader);
        mExpandableListView.setAdapter(parentLevelAdapter);
    }


    arraylist1  = new ArrayList<String>();
    arraylist2  = new ArrayList<String>();
    arraylist3  = new ArrayList<String>();
    arrayList4 =  new ArrayList<String>();
    arrayList5 =  new ArrayList<String>();
    new ProductsAsynTask().execute("http://opencart.codeniques.com/shopping/?route=feed/web_api/menu&key=test123$");


}
public class ProductsAsynTask extends AsyncTask<String,Void,Void>{

    ProgressDialog dialog;

    protected void onPreExecute(){
        super.onPreExecute();
        Log.d("In onPreExceute","");
        dialog = new ProgressDialog(MainActivity.this);
        dialog.setMessage("Loading, Please wait");
        dialog.setTitle("Connecting server");
        dialog.show();
        dialog.setCancelable(false);
    }

    protected Void doInBackground(String... param){
        try{
            Log.d("In doInBackground","");

            HttpClient client= new DefaultHttpClient();
            HttpPost post = new HttpPost(param[0]);
            HttpResponse response = client.execute(post);

            int status = response.getStatusLine().getStatusCode();

            if(status == 200){
                Log.d("Status",""+status);

                HttpEntity entity = response.getEntity();
                String data = EntityUtils.toString(entity);

                JSONObject jsonObject = new JSONObject(data);
                JSONArray jArray = jsonObject.getJSONArray("categories");

                for(int i = 0;i < jArray.length();i++){
                    cnt++;
                    Log.d("value of array",jArray.length()+"");
                    Log.d("Value of i",""+i);

                    JSONObject jsonObject1 = jArray.getJSONObject(i);




                    arraylist1.add(jsonObject1.getString("name"));
                    //data1 = jsonObject1.getString("name");
                    //      Log.d("hello ",data1);

                    JSONArray jsonArray = jsonObject1.getJSONArray("children");
                    //           JSONObject jsonObject2 = jsonObject1.getJSONObject("children");

                    for(int j=0;j<jsonArray.length();j++){

                        JSONObject jsonObject2 = jsonArray.getJSONObject(j);

                        arraylist2.add(jsonObject2.getString("name"));
                        //  data2 = jsonObject2.getString("name");
                        JSONArray jsonArray1 = jsonObject2.getJSONArray("children_lv3");

                        for(int k=0;k<jsonArray1.length();k++){
                            JSONObject jsonObject3 = jsonArray1.getJSONObject(k);

                            arraylist3.add(jsonObject3.getString("name"));
                            arrayList4.add(jsonObject3.getString("href"));
                           /*  data3 = jsonObject3.getString("name");
                             data4 = jsonObject3.getString("href");   */
                        }
                        arrayList5.add(jsonObject2.getString("href"));
                        // data5 = jsonObject2.getString("href");
                    }
                }

            }
        }catch(IOException e){
            Log.e("Error IOException :",e.getMessage());
        }catch (JSONException e){
            Log.e("Error JSONException",e.getMessage());
        }
        return null;
    }

    protected void onPostExecute(Void aVoid) {
        super.onPostExecute(aVoid);
        dialog.dismiss();
  /*      expListView = (ExpandableListView) findViewById(R.id.lvExp);
        expListView.setAdapter(new ParentLevel());*/
        Log.d("Counter value",""+cnt);
    }
}

public class ParentLevel extends BaseExpandableListAdapter
{

    @Override
    public Object getChild(int arg0, int arg1)
    {
        return arg1;
    }

    @Override
    public long getChildId(int groupPosition, int childPosition)
    {
        return childPosition;
    }

    @Override
    public View getChildView(int groupPosition, int childPosition,
                             boolean isLastChild, View convertView, ViewGroup parent)
    {
        CustExpListview SecondLevelexplv = new CustExpListview(MainActivity.this);
        SecondLevelexplv.setAdapter(new SecondLevelAdapter());
        SecondLevelexplv.setGroupIndicator(null);
        return SecondLevelexplv;
    }

    @Override
    public int getChildrenCount(int groupPosition)
    {
        return 3;
    }

    @Override
    public Object getGroup(int groupPosition)
    {
        return groupPosition;
    }

    @Override
    public int getGroupCount()
    {
        int columr = arraylist1.size();
        return columr;
    }

    @Override
    public long getGroupId(int groupPosition)
    {
        return groupPosition;
    }


    @Override
    public View getGroupView(int groupPosition, boolean isExpanded,
                             View convertView, ViewGroup parent)
    {
        TextView tv = new TextView(MainActivity.this);
            tv.setText("");
            tv.setBackgroundColor(Color.BLUE);
            tv.setPadding(10, 7, 7, 7);
        return tv;
    }

    @Override
    public boolean hasStableIds()
    {
        return true;
    }

    @Override
    public boolean isChildSelectable(int groupPosition, int childPosition)
    {
        return true;
    }
}

public class CustExpListview extends ExpandableListView
{

    int intGroupPosition, intChildPosition, intGroupid;

    public CustExpListview(Context context)
    {
        super(context);
    }

    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)
    {
        widthMeasureSpec = MeasureSpec.makeMeasureSpec(960, MeasureSpec.AT_MOST);
        heightMeasureSpec = MeasureSpec.makeMeasureSpec(600, MeasureSpec.AT_MOST);
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    }
}

public class SecondLevelAdapter extends BaseExpandableListAdapter
{

    @Override
    public Object getChild(int groupPosition, int childPosition)
    {
        return childPosition;
    }

    @Override
    public long getChildId(int groupPosition, int childPosition)
    {
        return childPosition;
    }

    @Override
    public View getChildView(int groupPosition, int childPosition,
                             boolean isLastChild, View convertView, ViewGroup parent)
    {
        TextView tv = new TextView(MainActivity.this);
        tv.setText("child");
        tv.setPadding(15, 5, 5, 5);
        tv.setBackgroundColor(Color.YELLOW);
        tv.setLayoutParams(new ListView.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
        return tv;
    }

    @Override
    public int getChildrenCount(int groupPosition)
    {
        return 5;
    }

    @Override
    public Object getGroup(int groupPosition)
    {
        return groupPosition;
    }

    @Override
    public int getGroupCount()
    {
        return 1;
    }

    @Override
    public long getGroupId(int groupPosition)
    {
        return groupPosition;
    }

    @Override
    public View getGroupView(int groupPosition, boolean isExpanded,
                             View convertView, ViewGroup parent)
    {
        TextView tv = new TextView(MainActivity.this);
        tv.setText("-->Second Level");
        tv.setPadding(12, 7, 7, 7);
        tv.setBackgroundColor(Color.RED);

        return tv;
    }

    @Override
    public boolean hasStableIds() {
        // TODO Auto-generated method stub
        return true;
    }

    @Override
    public boolean isChildSelectable(int groupPosition, int childPosition) {
        // TODO Auto-generated method stub
        return true;
    }

}



@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.menu_main, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle action bar item clicks here. The action bar will
    // automatically handle clicks on the Home/Up button, so long
    // as you specify a parent activity in AndroidManifest.xml.
    int id = item.getItemId();

    //noinspection SimplifiableIfStatement
    if (id == R.id.action_settings) {
        return true;
    }

    if(id == R.id.action_search){
        Toast.makeText(getApplicationContext(), "Search action is selected!", Toast.LENGTH_SHORT).show();
        return true;
    }

    return super.onOptionsItemSelected(item);
}

}

我的array.xml在这里: -

<resources>
<string-array name="items_array_expandable_level_one">
    <item>Level 1.1</item>
    <item>Level 1.2</item>
    <item>Level 1.3</item>
</string-array>
<string-array name="items_array_expandable_level_one_one_child">
    <item>Level 1.1.1</item>
    <item>Level 1.1.2</item>
</string-array>
<string-array name="items_array_expandable_level_one_two_child">
    <item>Level 1.2.1</item>
</string-array>
<string-array name="items_array_expandable_other_child">
    <item>Second Level 01</item>
    <item>Second Level 02</item>
    <item>Second Level 03</item>
</string-array>
<string-array name="items_array_expandable_level_three">
    <item>Child Level 01</item>
    <item>Child Level 02</item>
</string-array>

如何在数据到来时更新我的​​列表。请帮助我,我是android开发的新手。提前谢谢!

2 个答案:

答案 0 :(得分:0)

很遗憾,您无法在运行时修改资源。您可能需要考虑将xml存储在某处并在需要值而不是android上的资源时查询它。

您可以将xml存储在设备上,使用AssetManager创建一种访问这些文件的方法,然后创建一个Resources对象,使其与您已经使用的方式相同。

答案 1 :(得分:0)

存储在应用程序中的资源是在编译期间生成的,在运行时期间是read-only。你无法修改它们。

您可以尝试使用SQlite数据库来存储信息。第一次运行应用程序时,它将从XML Array获取数据并存储在数据库中。下次从服务器更新时,您只需添加/修改数据库即可。