根据列值在 Android activity 的 ListView 中填充来自 SQLite 的不同值

Populate different values from SQLite in ListView of Android activity based on Column value

我必须显示一个 ListView,每个视图将根据类型具有不同的值。所有这些值都需要从单个数据库 table 填充。如果我在 Table 中有 10 列,那么在 ListView 中,某些行将包含来自几列的值,而其他行将包含来自一些不同列的值,这取决于相同 table 的类型列的值。有些数据是通用的。视图将混合所有这些不同的行。

我编写了 SimpleCursorAdapter 来获取所有列值,并在 setViewBinder() 中根据类型为不同的 TextView 设置值。但不知何故,在展示中,它是空白的。在调试器中,我可以看到正确填充和设置的值。

有什么办法可以解决这个问题吗?或者任何替代方法来实现相同的目标?

请注意,只有在运行时,查询数据库后,我才能获得特定行的类型值。

下面是代码。

public void onActivityCreated(@Nullable Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);

    dbHelper = new BilloDatabaseHelper(getActivity());
    db = dbHelper.getReadableDatabase();

    Bundle args = getArguments();
    long billId = args.getLong(IntentConstant.SOMEID.name());

    ListView listView = (ListView) getActivity().findViewById(R.id.itemListView);

    cursor = db.query("ITEM_DETAILS",
            new String[]{"_id", "COLUMN1", "TYPE", "COLUMN2", "COLUMN3", "COLUMN4", "COLUMN5", "COLUMN6", "COLUMN7", "COLUMN8", "COLUMN9", "COLUMN10", "COLUMN11", "COLUMN12"},
            "SOME_ID = ?",           //Where clause
            new String[]{Long.toString(billId)},
            null,           //Group by
            null,
            null
    );

    SimpleCursorAdapter listAdapter = new SimpleCursorAdapter(getActivity(),
            R.layout.item_list_view,
            cursor,
            new String[]{"COLUMN1", "TYPE", "COLUMN2", "COLUMN3", "COLUMN4", "COLUMN5", "COLUMN6", "COLUMN7", "COLUMN8", "COLUMN9", "COLUMN10", "COLUMN11", "COLUMN12"},
            new int[]{R.id.COLUMN1, R.id.TYPE, R.id.COLUMN2, R.id.COLUMN3, R.id.COLUMN4, R.id.COLUMN5, R.id.COLUMN6, R.id.COLUMN7, R.id.COLUMN8, R.id.COLUMN9, R.id.COLUMN10, R.id.COLUMN9, R.id.COLUMN10},
            0);

    final int[] TYPE = {0};

    listAdapter.setViewBinder(new SimpleCursorAdapter.ViewBinder() {

        @Override
        public boolean setViewValue(View view, Cursor cursor, int columnIndex) {

            if(columnIndex == 2){
                TYPE[0] = cursor.getInt(cursor.getColumnIndex("TYPE"));

            }else if(columnIndex == 4){
               if(TYPE[0] == 1) {
                    String val = cursor.getString(cursor.getColumnIndex("COLUMN3"));
                    TextView COLUMN3 = (TextView) view.findViewById(R.id.COLUMN3);
                    COLUMN3.setText(val);

                   return true;
                }

            }else if(columnIndex == 9){
                if(TYPE[0] == 1) {
                    long date = cursor.getLong(cursor.getColumnIndex("COLUMN8"));

                    TextView dayText = (TextView) view.findViewById(R.id.COLUMN8);
                    dayText.setText(DateUtility.getDDMMYYYYDate(date));

                    return true;
                }


            }else if(columnIndex == 10){
                if(TYPE[0] == 1) {
                    long date = cursor.getLong(cursor.getColumnIndex("COLUMN9"));

                    TextView dayText = (TextView) view.findViewById(R.id.COLUMN9);
                    dayText.setText(DateUtility.getDDMMYYYYDate(date));

                    return true;
                }
            }else if(columnIndex == 11){
                if(TYPE[0] == 2) {
                    String sizeVal = cursor.getString(cursor.getColumnIndex("COLUMN10"));

                    TextView size = (TextView) view.findViewById(R.id.COLUMN9);
                    size.setText(sizeVal);

                    return true;
                }

            }else if(columnIndex == 12){
                if(TYPE[0] == 2) {
                    String fitVal = cursor.getString(cursor.getColumnIndex("COLUMN11"));

                    TextView fit = (TextView) view.findViewById(R.id.COLUMN10);
                    fit.setText(fitVal);

                    return true;
                }
            }
            return false;
        }
    });

    listView.setAdapter(listAdapter);

}

对于列的值 COLUMN9 和 COLUMN10,R.id.COLUMN9 和 R.id.COLUMN10 的值不可见。即使对于类型 1,它们也设置为空白。对于类型 2,具有列 COLUMN11 和 COLUMN12,它们在屏幕上可见。

这是变通解决方案。我将游标数据转换为 JSONObject 列表,并将该 JSONObject 列表传递给基于类型的新 ListAdapter,我可以轻松地修改和更新 TextView 值。