ORMLite RunTimeException - 如何从之前的 Activity 传递对象类型

ORMLite RunTimeException - how pass Object type from previous Activity

我有几个 class 几个 table。每个 class 都有相同的字段。在第一个 activity 我选择我想使用的 table,然后转到另一个 activity。我在那里创建 RuntimeExceptionDao<Biceps, String> bicepsDao = dao.getBicepsRunTimeDao(); 二头肌是一个 table 的名称。然后我为人体的每个部分创建这个 dao,然后我执行相同的过程,取决于 table,它看起来像这样

switch (partia) {
            case "biceps": {

                RuntimeExceptionDao<Biceps, String> bicepsDao = dao.getBicepsRunTimeDao();

                List<Biceps> list = bicepsDao.queryForAll();

                final ArrayAdapter<Biceps> arrayAdapter = new ArrayAdapter<Biceps>(this, android.R.layout.simple_list_item_1, list);
                listView.setAdapter(arrayAdapter);

                arrayAdapter.notifyDataSetChanged();

                listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                    @Override
                    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

                        Biceps item = arrayAdapter.getItem(position);
                        String idCwiczenia = item.getId();

                        Intent myIntent = new Intent(Cwiczenia.this, DodajSerie.class);
                        myIntent.putExtra("id", idCwiczenia);
                        Cwiczenia.this.startActivity(myIntent);

                    }
                });
            }
            break;
            case "triceps": {

                RuntimeExceptionDao<Triceps, String> tricepsDao = dao.getTricepsRunTimeDao();

                List<Triceps> list = tricepsDao.queryForAll();

                final ArrayAdapter<Triceps> arrayAdapter = new ArrayAdapter<Triceps>(this, android.R.layout.simple_list_item_1, list);
                listView.setAdapter(arrayAdapter);

                arrayAdapter.notifyDataSetChanged();

                listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                    @Override
                    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

                        Triceps item = arrayAdapter.getItem(position);
                        String idCwiczenia = item.getId();

                        Intent myIntent = new Intent(Cwiczenia.this, DodajSerie.class);
                        myIntent.putExtra("id", idCwiczenia);
                        Cwiczenia.this.startActivity(myIntent);

                    }
                });
            }
            break;

所以,代码看起来很像,我认为它反对 "Don't repeat yourself"。

我的问题:是否可以创建 RuntimeExceptionDao 并传递之前 Activity 的对象类型?建一个List,建一个ArrayList也是应该的

使用 String getId() 函数创建接口 Exercises 并在您的所有练习中实现它 类(BicepsTriceps 等)。

然后将 dao.getBicepsRunTimeDao()dao.getTricepsRunTimeDao() 替换为一些更通用的函数:

public <T extends Exercises> RuntimeExceptionDao<T, String> getDao(Class<T> classt) {
    return RuntimeExceptionDao.createDao(connectionSource, classt);
}

然后你可以创建

private <T extends Exercises> void initializeList(Class<T> classt) {
    RuntimeExceptionDao<T, String> dao = dao.getDao(classt);
    List<T> list = dao.queryForAll();

    final ArrayAdapter<T> arrayAdapter = new ArrayAdapter<T>(this, android.R.layout.simple_list_item_1, list);
    listView.setAdapter(arrayAdapter);

    listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            T item = arrayAdapter.getItem(position);
            String idCwiczenia = item.getId();

            Intent myIntent = new Intent(Cwiczenia.this, DodajSerie.class);
            myIntent.putExtra("id", idCwiczenia);
            Cwiczenia.this.startActivity(myIntent);
        }
     });
}

你可以这样使用这个函数:

switch (partia) {
    case "biceps":
        initializeList(Biceps.class);
    break;
    case "triceps":
        initializeList(Triceps.class);
    break;
}

您也可以从第一个 activity Class<T> 对象传递(它是可序列化的,因此您可以将它放在 Bundle 中)以避免使用 switch-case。