【问题标题】:Data positioning in a TableLayout - Android StudioTableLayout 中的数据定位 - Android Studio
【发布时间】:2016-10-16 10:24:29
【问题描述】:

我有两个活动(A 和 B),活动 A 要求输入文本(字符串),活动 B 将该字符串存储在表中。我希望实现的目标:每次我在表中添加一个新字符串时,前一个字符串向下移动一行,新字符串取代旧字符串。我还希望每次返回活动 A 时都将表格布局保存在活动 B 中。我将如何实现这一目标?

【问题讨论】:

  • 在适配器开头插入的 RecyclerView 怎么样?你有动态数据,所以最好使用适配器
  • 感谢您的回复@cricket_007。我不太清楚你的意思是什么?
  • 不幸的是,我在 Android Studio 中找不到您所说的 RecyclerView。你会碰巧有这样一个过程的示例代码吗? @cricket_007
  • @cricket_007 我在布局 XML 文件中搜索视图。谢谢你的帮助。有没有更简单的方法来实现这一目标?
  • 您最多只添加 3 行吗?

标签: android string android-layout android-tablelayout


【解决方案1】:

更新 - 输入活动

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 或数据库中,无论什么。您使用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 一些包含TextViewTableRow 的XML 文件)。

当你完成TableRow tr 的构建后,你就可以

tl.addView(tr, new TableLayout.LayoutParams(
    TableLayout.LayoutParams.FILL_PARENT, 
    TableLayout.LayoutParams.WRAP_CONTENT));

因此,做我上面引用的事情。

【讨论】:

  • 感谢您的回复和建议,我会尝试一下,看看效果如何。每个 TableRow 中的 TableLayout 和 EditText 都是在 XML 文件中创建的。他们的 ID 为:diagnostics1、diagnosis2 和 diagnostic3,但我现在意识到这样做是错误的。
  • 你愿意告诉我如何在 SharedPreferences 中正确存储字符串列表吗?不幸的是,我在代码中使用的方法似乎不起作用。
  • 我可能会使用 JSON 表示。 stackoverflow.com/a/27872280/2308683 其他解决方案在那个帖子中,不过
  • 不幸的是我不能使用 JSON 表示,因为我的应用程序必须完全离线运行并且不能使用外部库。 @cricket_007
  • JSON 离线。我认为您对使用 JSON 传输数据的 REST API 感到困惑。您也不需要使用外部库。 JsonArray 是一个内置的 Android 类。 Gson 只是让 List 对象转换为 JsonArray 变得非常容易,不过,仅此而已
猜你喜欢
  • 2017-07-20
  • 2020-05-15
  • 1970-01-01
  • 2016-06-12
  • 2021-08-30
  • 2012-09-06
  • 1970-01-01
  • 1970-01-01
  • 2012-08-19
相关资源
最近更新 更多