Как заполнить Expandable ListView данными из БД?

285
08 мая 2018, 01:38

История такая - есть фрагмент (app.fragment) куда встроен Expandable ListView, на данный момент группы и элементы списков заполнены с помощью строковых ресурсов (хочется так и оставить, чтобы потом была возможность сделать перевод). Имеется БД SQLite3, как реализовать открытие информации из БД при клике на определенный элемент списка (то есть 1-ый элемент БД должен соответствовать 1-му элементу списка и т.д.)?

Код Фрагмента:

public class Fragment_Hormones extends Fragment {
    ExpandableListAdapter_hormones listAdapter;
    ExpandableListView expListView;
    List<String> listDataHeader;
    HashMap<String, List<String>> listDataChild;
    //Переменная для работы с БД
    private DatabaseHelper_hormones mDBHelper;
    private SQLiteDatabase mDb;

    private static final String ARG_PARAM1 = "param1";
    private static final String ARG_PARAM2 = "param2";
    // TODO: Rename and change types of parameters
    private String mParam1;
    private String mParam2;
    private OnFragmentInteractionListener mListener;
    public Fragment_Hormones() {
        // Required empty public constructor
    }
    /**
     * Use this factory method to create a new instance of
     * this fragment using the provided parameters.
     *
     * @param param1 Parameter 1.
     * @param param2 Parameter 2.
     * @return A new instance of fragment Fragment_Hormones.
     */
    // TODO: Rename and change types and number of parameters
    public static Fragment_Hormones newInstance(String param1, String param2) {
        Fragment_Hormones fragment = new Fragment_Hormones();
        Bundle args = new Bundle();
        args.putString(ARG_PARAM1, param1);
        args.putString(ARG_PARAM2, param2);
        fragment.setArguments(args);
        return fragment;
    }
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (getArguments() != null) {
            mParam1 = getArguments().getString(ARG_PARAM1);
            mParam2 = getArguments().getString(ARG_PARAM2);
        }
    }
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment__hormones, container, false);

        // БД hormones
        mDBHelper = new DatabaseHelper_hormones(getActivity());
        try {
            mDBHelper.updateDataBase();
        } catch (IOException mIOException) {
            throw new Error("UnableToUpdateDatabase");
        }
        try {
            mDb = mDBHelper.getWritableDatabase();
        } catch (SQLException mSQLException) {
            throw mSQLException;
        }
        // get the listview
        expListView = (ExpandableListView) view.findViewById(R.id.ListView_hormones);
        // preparing list data
        prepareListData();
        listAdapter = new ExpandableListAdapter_hormones(this.getActivity(), listDataHeader, listDataChild);
        // setting list adapter
        expListView.setAdapter(listAdapter);
        return view;
    }
private void prepareListData() {
        listDataHeader = new ArrayList<String>();
        listDataChild = new HashMap<String, List<String>>();
        // Добавить в заглавие значения из строковых ресурсов
        Resources res = getResources();
        String gipofis = res.getString(R.string.gp_gipofis);
        listDataHeader.add(gipofis);

        // Добавить в раздел Гипофиз
        String gp_gipofis01 = res.getString(R.string.gp_gipofis1);
        String gp_gipofis02 = res.getString(R.string.gp_gipofis2);
        List<String> gp_gipofis = new ArrayList<String>();
        gp_gipofis.add(gp_gipofis01);
        gp_gipofis.add(gp_gipofis02);
        // Header, Childdata
listDataChild.put(listDataHeader.get(0),  gp_gipofis);    
    }

Код Адаптера Expandable ListView:

public class ExpandableListAdapter_hormones extends BaseExpandableListAdapter {
    private Context _context;
    private List<String> _listDataHeader; // header titles
    // child data in format of header title, child title
    private HashMap<String, List<String>> _listDataChild;
    public ExpandableListAdapter_hormones(Context context, List<String> listDataHeader,
                                 HashMap<String, List<String>> listChildData) {
        this._context = context;
        this._listDataHeader = listDataHeader;
        this._listDataChild = listChildData;
    }
    @Override
    public Object getChild(int groupPosition, int childPosititon) {
        return this._listDataChild.get(this._listDataHeader.get(groupPosition))
                .get(childPosititon);
    }
    @Override
    public long getChildId(int groupPosition, int childPosition) {
        return childPosition;
    }
    @Override
    public View getChildView(int groupPosition, final int childPosition,
                             boolean isLastChild, View convertView, ViewGroup parent) {
        final String childText = (String) getChild(groupPosition, childPosition);
        if (convertView == null) {
            LayoutInflater infalInflater = (LayoutInflater) this._context
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = infalInflater.inflate(R.layout.list_item, null);
        }
        TextView txtListChild = (TextView) convertView
                .findViewById(R.id.lblListItem);
        txtListChild.setText(childText);
        return convertView;
    }
    @Override
    public int getChildrenCount(int groupPosition) {
        return this._listDataChild.get(this._listDataHeader.get(groupPosition))
                .size();
    }
    @Override
    public Object getGroup(int groupPosition) {
        return this._listDataHeader.get(groupPosition);
    }
    @Override
    public int getGroupCount() {
        return this._listDataHeader.size();
    }
    @Override
    public long getGroupId(int groupPosition) {
        return groupPosition;
    }
    @Override
    public View getGroupView(int groupPosition, boolean isExpanded,
                             View convertView, ViewGroup parent) {
        String headerTitle = (String) getGroup(groupPosition);
        if (convertView == null) {
            LayoutInflater infalInflater = (LayoutInflater) this._context
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = infalInflater.inflate(R.layout.list_group, null);
        }
        TextView lblListHeader = (TextView) convertView
                .findViewById(R.id.lblListHeader);
        lblListHeader.setTypeface(null, Typeface.BOLD);
        lblListHeader.setText(headerTitle);
        return convertView;
    }
    @Override
    public boolean hasStableIds() {
        return false;
    }
    @Override
    public boolean isChildSelectable(int groupPosition, int childPosition) {
        return true;
    }
}

Код адаптера БД:

public class DatabaseHelper_hormones extends SQLiteOpenHelper {
    private static String DB_NAME = "hormones.db";
    private static String DB_PATH = "";
    private static final int DB_VERSION = 1;
    private SQLiteDatabase mDataBase;
    private final Context mContext;
    private boolean mNeedUpdate = false;
    public DatabaseHelper_hormones(Context context) {
        super(context, DB_NAME, null, DB_VERSION);
        if (android.os.Build.VERSION.SDK_INT >= 23)
            DB_PATH = context.getApplicationInfo().dataDir + "/databases/";
        else
            DB_PATH = "/data/data/" + context.getPackageName() + "/databases/";
        this.mContext = context;
        copyDataBase();
        this.getReadableDatabase();
    }
    public void updateDataBase() throws IOException {
        if (mNeedUpdate) {
            File dbFile = new File(DB_PATH + DB_NAME);
            if (dbFile.exists())
                dbFile.delete();
            copyDataBase();
            mNeedUpdate = false;
        }
    }
    private boolean checkDataBase() {
        File dbFile = new File(DB_PATH + DB_NAME);
        return dbFile.exists();
    }
    private void copyDataBase() {
        if (!checkDataBase()) {
            this.getReadableDatabase();
            this.close();
            try {
                copyDBFile();
            } catch (IOException mIOException) {
                throw new Error("ErrorCopyingDataBase");
            }
        }
    }
    private void copyDBFile() throws IOException {
        InputStream mInput = mContext.getAssets().open(DB_NAME);
        //InputStream mInput = mContext.getResources().openRawResource(R.raw.info);
        OutputStream mOutput = new FileOutputStream(DB_PATH + DB_NAME);
        byte[] mBuffer = new byte[1024];
        int mLength;
        while ((mLength = mInput.read(mBuffer)) > 0)
            mOutput.write(mBuffer, 0, mLength);
        mOutput.flush();
        mOutput.close();
        mInput.close();
    }
    public boolean openDataBase() throws SQLException {
        mDataBase = SQLiteDatabase.openDatabase(DB_PATH + DB_NAME, null, SQLiteDatabase.CREATE_IF_NECESSARY);
        return mDataBase != null;
    }
    @Override
    public synchronized void close() {
        if (mDataBase != null)
            mDataBase.close();
        super.close();
    }
    @Override
    public void onCreate(SQLiteDatabase db) {
    }
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        if (newVersion > oldVersion)
            mNeedUpdate = true;
    }
}
READ ALSO
Ошибки &ldquo;String cannot be converted to int&rdquo; и &ldquo;not a statement&rdquo;

Ошибки “String cannot be converted to int” и “not a statement”

ЗдравстуйтеПомогите исправить ошибки на строках 125(String cannot be converted to int) и 126(not a statement)

229
Не работает android studio без файла javax.activation-1.2.0.pom

Не работает android studio без файла javax.activation-1.2.0.pom

Не работает android studio без файла javaxactivation-1

241
Wait-notify relock. Обеспечит ли happens-before между потоками?

Wait-notify relock. Обеспечит ли happens-before между потоками?

Как известно, освобождение монитора и последующий захват этого же монитора другим потоком соотносятся как happens-before, те

232
Проблема с рефлексией в .jar файле

Проблема с рефлексией в .jar файле

у меня следующая проблема: созданный проект и intellij находит все классы в проекте посредством рефлексии, но при собирании проекта вjar файл рефлексия...

208