У меня есть два действия (A и B), активность A запрашивает ввод текста (строка), а активность B хранит эту строку в таблице. То, что я хочу достичь: каждый раз, когда я добавляю новую строку в таблицу, предыдущая строка перемещается вниз по одной строке, а новая строка занимает старую строку. Я также хочу сохранить макет таблицы в действии B каждый раз, когда я вернусь к действию A. Как я могу это сделать?Позиционирование данных в TableLayout - Android Studio
ответ
Обновлено - Входной активность
public class MainActivity extends AppCompatActivity {
public static String PREFS_NAME = "prefs";
public static String VALUES_KEY = "vals";
EditText editText;
SharedPreferences prefs;
@Override
protected void onStart() {
super.onStart();
prefs = getSharedPreferences(PREFS_NAME, MODE_PRIVATE);
}
private void addValue(Object s) {
prefs.edit()
.putString(VALUES_KEY, String.valueOf(s))
.apply();
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.layout_edit_btn);
editText = (EditText) findViewById(R.id.editText);
findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String s = editText.getText().toString();
JSONArray arr = new JSONArray();
// Just for testing
if (s.equals("clear")) {
addValue(arr);
Toast.makeText(MainActivity.this, "prefs cleared", Toast.LENGTH_SHORT).show();
return;
}
String jsonString = prefs.getString(VALUES_KEY, arr.toString());
// Store a JSON array
try {
arr = new JSONArray(jsonString);
arr.put(s);
addValue(arr);
} catch (JSONException e) {
e.printStackTrace();
}
// Go to next activity
startActivity(new Intent(MainActivity.this, TableLayoutActivity.class));
}
});
}
}
Второй вид деятельности - Имеет таблицу
public class TableLayoutActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_tablelayout);
SharedPreferences prefs = getSharedPreferences(MainActivity.PREFS_NAME, MODE_PRIVATE);
TableLayout tl = (TableLayout) findViewById(R.id.table);
// Get the array out of preferences
JSONArray arr = new JSONArray();
String jsonString = prefs.getString(MainActivity.VALUES_KEY, arr.toString());
LayoutInflater inflater = LayoutInflater.from(this);
try {
arr = new JSONArray(jsonString);
// Loop backwards over list, adding rows
for (int i = arr.length() - 1; i >= 0; --i) {
View rowView = inflater.inflate(R.layout.table_row, tl, false);
TextView rowText = (TextView) rowView.findViewById(android.R.id.text1);
rowText.setText(i + ": " + arr.getString(i));
tl.addView(rowView,
TableLayout.LayoutParams.MATCH_PARENT,
TableLayout.LayoutParams.WRAP_CONTENT);
}
} catch (JSONException e) {
e.printStackTrace();
}
}
}
Оригинал ответа
каждый раз, когда я добавить новую строку в таблице, предыдущая строка перемещается вниз по одной строке, а новая строка занимает старую строку
Я не вижу TableLayout или TableRow в вашем вопросе. Есть три постоянные строки, но порядок, который вы хотите отобразить, кажется неясным.
Но вот подход ... Вы сохраняете список строк в SharedPreferences или базе данных, что угодно. Вы передаете этот список строк в Activity с помощью TableLayout tl = (TableLayout) findViewById(R.id.tableLayout)
.
Оттуда вы можете просто петля назад for (int i = list.size(); i >=0; i--)
, получить String s = list.get(i);
, а затем генерировать TableRow tr = new TableRow()
который вы добавите некоторые TextView
что вы имеете setText(s)
на нем. (Или inflate
некоторый XML-файл, содержащий как TextView
, так и TableRow
).
Когда вы закончите строительство TableRow tr
, то вы можете
tl.addView(tr, new TableLayout.LayoutParams(
TableLayout.LayoutParams.FILL_PARENT,
TableLayout.LayoutParams.WRAP_CONTENT));
Таким образом, делая то, что я процитировал выше.
Спасибо за ваш ответ и совет, я попробую его и посмотрю, как я пойду. TableLayout и EditText внутри каждого TableRow были созданы в XML-файле. У них есть идентификатор: диагноз1, диагноз2 и диагноз3, но теперь я понимаю, что это неправильный путь. – Erz
Не могли бы вы также показать мне, как правильно хранить список строк в SharedPreferences? Метод, который я использовал в моем коде, к сожалению, не работает. – Erz
Я бы, вероятно, использовал представление JSON. http://stackoverflow.com/a/27872280/2308683 Другие решения находятся в этом сообщении, хотя –
Как насчет RecyclerView, который вставлен в начале адаптера? У вас есть динамические данные, поэтому лучше всего использовать адаптер –
Спасибо за ваш ответ @ cricket_007. Я не слишком уверен, что вы подразумеваете под этим? – Erz
К сожалению, я не могу найти RecyclerView, о котором вы говорите в Android Studio. У вас будет пример кода такого процесса? @ cricket_007 – Erz