Android. Сохранить данные из GridView в JSON

309
14 мая 2017, 23:12

Всем привет. Первый день тут, поэтому буду максимально конкретным. Создаю приложение для Android. В нём есть две основные активности.

1. В первой активности пользователь видит два поля и кнопку. В полях указывает интервал цифр ОТ и ДО, по нажатию кнопки через цикл активность создаёт JSON и заносит значение в базу данных (реализовано!!).

2. JSON имеет такой вид, например, если пользователь ввёл 51 и 260:

[
{"id":51,"status":0},
{"id":52,"status":0},
...
{"id":260,"status":0}
]

При этом: id - введённый и отображаемый номер, status - это обозначение цвета бекграунда в GridView (0 - коричневый, 1 - зелёный, 2 - оранжевый) (реализовано!!).

3. В другой активности этот JSON достаётся из базы SQLite, парсится и отображается в GridView в виде "плиток" (реализовано!!).

4. В этой же активности у пользователя есть возможность по одному тапу на плитку задать ей зелёный цвет, ещё по одному тапу - оранжевый. Третий же тап вернёт начальный цвет - коричневый. Таким образом идёт своеобразное выделение необходимых элементов (реализовано!!).

Требуется

Сейчас упёрся в проблему как сохранить эти выделения элементов обратно в JSON, уже с новыми статусами, чтобы в дальнейшем обновить эти данные в базе. Подскажите, пожалуйста, как это реализовать?

Логика

Пользователь добавляет произвольное количество плиток по умолчанию одинакового статуса (цвета). Затем редактирует их статус нажатием и сохраняет изменения (можно после каждого тапа, но лучше одним нажатием на кнопку).

Из этой активности данные сохраняются в базу

package ru.gamletus.mytest;
import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import org.json.JSONArray;
import org.json.JSONObject;
import org.json.JSONException;
// добавляет записи из формы в базу данных
public class DB_Main extends AppCompatActivity implements View.OnClickListener
    {
    Button btnAdd;
    EditText etFirst, etLast;
    DB_Helper dbHelper;
    @Override
    protected void onCreate(Bundle savedInstanceState)
        {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.db_main);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        btnAdd = (Button) findViewById(R.id.btnAdd);
        btnAdd.setOnClickListener(this);
        etFirst = (EditText) findViewById(R.id.etFirst);
        etLast = (EditText) findViewById(R.id.etLast);
        dbHelper = new DB_Helper(this);
        }
    @Override
    public void onClick(View v)
        {
        SQLiteDatabase database = dbHelper.getWritableDatabase();
        ContentValues contentValues = new ContentValues();
        int first = Integer.parseInt(etFirst.getText().toString());
        int last = Integer.parseInt(etLast.getText().toString());
        JSONArray listMain = new JSONArray();
        JSONObject obj;
        try {
            for (int i = first; i <= last; i++)
                {
                obj = new JSONObject();
                obj.put("id", i);
                obj.put("status", 0);
                listMain.put(obj);
                }
            }
        catch (JSONException e)
            {
            e.printStackTrace();
            }
        String jsonString = listMain.toString();
        contentValues.put(DB_Helper.NUMBER_FIRST, first);
        contentValues.put(DB_Helper.NUMBER_LAST, last);
        contentValues.put(DB_Helper.COLLECTION_LIST, jsonString);
        database.insert(DB_Helper.DATABASE_TABLE, null, contentValues);
        dbHelper.close();
        }
    }

В этой активности извлекаются данные из базы по ID записи и парсится JSON

package ru.gamletus.mytest;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.GridView;
import android.widget.TextView;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.ArrayList;
// построение плиток по данным из базы
public class Squares_Dynamic_Base extends AppCompatActivity
    {
    int ID;
    int Names_Two_String;
    int Names_Tre_String;
    String Names_Foo_String;
    int numberArray;
    int statusArray;
    int statusClick;
    int statusColor;
    DB_Helper databaseHelper;
    SQLiteDatabase db;
    Cursor userCursor;
    GridView gridView;
    MyCustomAdapter myAdapter;
    ArrayList<GridObject> myObjects;
    @Override
    public void onCreate(Bundle savedInstanceState)
        {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.squares_dynamic_base);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        // получение ID из активности для извлечения требуемой записи
        Intent intent = getIntent();
        ID = Integer.parseInt(intent.getStringExtra("id_for_base"));
        databaseHelper = new DB_Helper(getApplicationContext());
        db = databaseHelper.getReadableDatabase();
        userCursor = db.rawQuery("SELECT * FROM `" + DB_Helper.DATABASE_TABLE + "` WHERE `_id` = '" + ID + "'", null);
        userCursor.moveToFirst();
        Names_Two_String = userCursor.getInt(userCursor.getColumnIndex("number_first")); // номер первой цифры (в коде не используется)
        Names_Tre_String = userCursor.getInt(userCursor.getColumnIndex("number_last")); // номер последней цифры (в коде не используется)
        Names_Foo_String = userCursor.getString(userCursor.getColumnIndex("collection_list")); // JSON со всеми номерами и статусами
        myObjects = new ArrayList<>();
        String str = Names_Foo_String;
        JSONArray jsonarray;
        try {
            jsonarray = new JSONArray(str);
            for (int i = 0; i <= jsonarray.length(); i++)
                {
                JSONObject obj = jsonarray.getJSONObject(i);
                numberArray = obj.getInt("id");
                statusArray = obj.getInt("status");
                myObjects.add(new GridObject(numberArray, statusArray));
                }
            }
        catch (JSONException e)
            {
            e.printStackTrace();
            }
        gridView = (GridView) findViewById(R.id.gvMainB);
        myAdapter = new MyCustomAdapter(this);
        gridView.setAdapter(myAdapter);
        gridView.setOnItemClickListener(new AdapterView.OnItemClickListener()
            {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id)
                {
                switch (myObjects.get(position).getState())
                    {
                    case 0:
                        statusClick = 1;
                    break;
                    case 1:
                        statusClick = 2;
                    break;
                    case 2:
                        statusClick = 0;
                    break;
                    }
                myObjects.get(position).setState(statusClick);
                myAdapter.notifyDataSetChanged();
                }
            });
        }
    private class ViewHolder
        {
        TextView text;
        }
    private class MyCustomAdapter extends BaseAdapter
        {
        private LayoutInflater mInflater;
        private MyCustomAdapter(Context context)
            {
            mInflater = LayoutInflater.from(context);
            }
        @Override
        public View getView(int position, View convertView, ViewGroup parent)
            {
            GridObject object = myObjects.get(position);
            ViewHolder holder;
            if (convertView == null)
                {
                convertView = mInflater.inflate(R.layout.squares_dynamic_base_content_text, null);
                holder = new ViewHolder();
                holder.text = (TextView) convertView.findViewById(R.id.tvTextB);
                convertView.setTag(holder);
                }
            else
                {
                holder = (ViewHolder) convertView.getTag();
                }
            holder.text.setText(String.valueOf(object.getName()));
            switch (object.getState())
                {
                case 0:
                    statusColor = 0xFFAF9A8F; // коричневый
                break;
                case 1:
                    statusColor = 0xFF336600; // зелёный
                break;
                case 2:
                    statusColor = 0xFFCC6600; // оранжевый
                break;
                }
            convertView.setBackgroundColor(statusColor);
            return convertView;
            }
        @Override
        public int getCount()
            {
            return myObjects.size();
            }
        @Override
        public Object getItem(int position)
            {
            return position;
            }
        @Override
        public long getItemId(int position)
            {
            return position;
            }
        }
    }

Объект для предыдущей активности

package ru.gamletus.mytest;
public class GridObject
    {
    private int name;
    private int state;
    public GridObject(int name, int state)
        {
        super();
        this.name = name;
        this.state = state;
        }
    public int getName()
        {
        return name;
        }
    public void setName(int name)
        {
        this.name = name;
        }
    public int getState()
        {
        return state;
        }
    public void setState(int state)
        {
        this.state = state;
        }
    }

Лайот для активности, в которой отображаются плитки это в принципе обычный GridView с TextView. Если требуется, то тоже выложу.

Answer 1
  1. Работать с JSON надо либами. Например гугловым Gson пользоваться.
  2. В этом случае вы будете работать не с голым JSON, но с построенными на его основе Java-объектами.
  3. С помощью этой же либы можно из изменённых данных получить актуальный JSON для записи.

Кратко:

  1. Создайте модели данных. В вашем случае две вот так:
public class Data {
    List<Field> fields;
    public static class Field {
        public int id;
        public int status;
    }
}
  1. Во второй активити получите JSON из БД и преобразуйте в Data так:
Gson gson = new GsonBuilder().create();
Data data = gson.fromJson(jsonString, Data.class);
  1. При нажатиях на кнопки меняйте значения в модели данных, т.е. в переменной data как-то так:
data.fields.get(0).status = 2;
  1. Когда надо будет получить JSON со всеми изменениями, то получайте его так:
Gson gson = new GsonBuilder().create();
String updatedJson = gson.toJson(data);
READ ALSO
Java Массив Class[]

Java Массив Class[]

Собственно, есть класс, у которого есть поле вида

294
Помогите сделать метод и его вызвать

Помогите сделать метод и его вызвать

Здравствуйте, я новичок в java, не могли бы вы мне помочь можно ли из этого кода сделать метод и потом вызывать его, а так он очень уж громоздкий,...

253
Как можно при помощи Jsoup перемещаться по сайту не открывая новый Connection?

Как можно при помощи Jsoup перемещаться по сайту не открывая новый Connection?

У меня задача распарсить форум, я открываю соединение:

269
Как сделать карту оффлайн?

Как сделать карту оффлайн?

Есть приложение с googlemapApiВсе окей но хочу чтоб карта была оффлайн чтоб не подргружалась

200