Всем привет. Первый день тут, поэтому буду максимально конкретным. Создаю приложение для 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. Если требуется, то тоже выложу.
JSON
надо либами. Например гугловым Gson
пользоваться.JSON
, но с построенными на его основе Java
-объектами.JSON
для записи.Кратко:
public class Data {
List<Field> fields;
public static class Field {
public int id;
public int status;
}
}
JSON
из БД и преобразуйте в Data
так:Gson gson = new GsonBuilder().create();
Data data = gson.fromJson(jsonString, Data.class);
data
как-то так:data.fields.get(0).status = 2;
Gson gson = new GsonBuilder().create();
String updatedJson = gson.toJson(data);
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Какие существуют виды рекламных бордов и как выбрать подходящий?
Здравствуйте, я новичок в java, не могли бы вы мне помочь можно ли из этого кода сделать метод и потом вызывать его, а так он очень уж громоздкий,...
У меня задача распарсить форум, я открываю соединение:
Есть приложение с googlemapApiВсе окей но хочу чтоб карта была оффлайн чтоб не подргружалась