1. 程式人生 > >Android 自定義Listview 如何繫結Sqlite資料庫資料

Android 自定義Listview 如何繫結Sqlite資料庫資料

首先我們需要有個載入的檔案,這個佈局檔案裡面的bills.xml,這個佈局裡面有個Listview控制元件。

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
                android:layout_width="fill_parent"
                android:layout_height="fill_parent"
                android:orientation
="vertical" android:background="#FFFFFF">
<LinearLayout android:layout_width="fill_parent" android:layout_height="50dp" android:id="@+id/linearLayout3" android:orientation="horizontal" android:layout_alignParentTop="true" android:layout_alignParentLeft
="true" android:layout_alignParentStart="false" android:background="#444eb9" android:weightSum="1" android:gravity="center_vertical">
<ImageView android:layout_width="80dp" android:layout_height="30dp" android:id="@+id/imageviewBack"
android:src="@drawable/back" android:background="#444eb9"/>
<TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="賬單" android:id="@+id/textView2" android:layout_gravity="center_vertical" android:background="#444eb9" android:layout_marginLeft="80dp" android:textColor="#FFFFFF" android:textStyle="bold" android:editable="false" android:enabled="false" android:hint="size" android:textIsSelectable="false" android:textSize="20dp"/> </LinearLayout> <ListView android:id="@+id/list_bills" android:layout_width="wrap_content" android:layout_height="wrap_content" android:divider="#ffffff" android:dividerHeight="1dip" android:layout_below="@+id/linearLayout3" android:layout_alignParentLeft="true" android:layout_alignParentStart="true" android:background="#fbf5f5"/> </RelativeLayout>

接下來就是自定義的listview的佈局檔案billsitem.xml:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
                android:layout_width="match_parent"
                android:layout_height="fill_parent"
                android:orientation="vertical"
    >

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceSmall"
        android:text="no data"
        android:id="@+id/texttime"
        android:layout_alignParentTop="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:layout_marginRight="28dp"
        android:layout_marginTop="20dp"
        android:layout_marginLeft="20dp"
        android:gravity="center"/>

    <ImageView
        android:layout_width="55dp"
        android:layout_height="55dp"
        android:id="@+id/imagetype"
        android:layout_alignParentTop="true"
        android:layout_toRightOf="@+id/texttime"
        android:padding="10dp"/>

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceSmall"
        android:text="no data"
        android:id="@+id/textfee"
        android:layout_marginLeft="61dp"
        android:layout_marginStart="61dp"
        android:layout_alignParentTop="true"
        android:layout_alignLeft="@+id/textremarks"
        android:layout_alignStart="@+id/textremarks"
        android:layout_marginTop="10dp"
        android:gravity="center"/>

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Large Text"
        android:id="@+id/textremarks"
        android:layout_alignBottom="@+id/imagetype"
        android:layout_toRightOf="@+id/imagetype"
        android:layout_toEndOf="@+id/imagetype"
        android:layout_marginLeft="34dp"
        android:layout_marginStart="34dp"
        android:gravity="center"/>
</RelativeLayout>

接下來就是Android裡面的activity了,這接上程式碼:

package com.bank;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.util.Log;
import android.view.ContextMenu;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.SimpleAdapter;

import java.util.ArrayList;
import java.util.HashMap;

/**
 * Created by zhouchenglin on 2016/4/1.
 */
public class BillsActivity extends Activity implements View.OnClickListener {

        //列舉資料的ListView
        private ListView mlistbills;
        // 介面卡
        private SimpleAdapter mlistbillsAdapter;
        //資料庫
        private MySQLiteHelper mMysql;
        private SQLiteDatabase mDataBase;
        private ImageView imageviewback;

        // 儲存資料的陣列列表
        ArrayList<HashMap<String, Object>> listData = new ArrayList<HashMap<String, Object>>();

        public void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.bills);

                mlistbills = (ListView) this.findViewById(R.id.list_bills);
                imageviewback = (ImageView) this.findViewById(R.id.imageviewBack);
                imageviewback.setOnClickListener(this);

                GetData();
                mlistbillsAdapter = new SimpleAdapter(
                        this,
                        listData,
                        R.layout.billsitem,
                        new String[]{"Time", "Type", "Fee", "Remarks"},
                        new int[]{R.id.texttime, R.id.imagetype, R.id.textfee, R.id.textremarks}
                );
                //賦予資料
                mlistbills.setAdapter(mlistbillsAdapter);

                //響應
                mlistbills.setOnCreateContextMenuListener(listviewLongPress);
        }

        //從資料庫獲得介面卡資料

        public void GetData() {
                mMysql = new MySQLiteHelper(this, "finance.db", null, 1);
                mDataBase = mMysql.getReadableDatabase();

                Cursor cursor = mDataBase.rawQuery("select * from finance", null);
                cursor.moveToFirst();
                int columnsSize = cursor.getColumnCount();
                int number = 0;
                while (number < cursor.getCount()) {

                        //  cursor.move(i);
                        HashMap<String, Object> map = new HashMap<String, Object>();
                        String budget = cursor.getString(cursor.getColumnIndex("Budget"));
                        map.put("ID", cursor.getString(cursor.getColumnIndex("ID")));
                        map.put("Fee", cursor.getDouble(cursor.getColumnIndex("Fee")));
                        map.put("Time", cursor.getString(cursor.getColumnIndex("Time")));
                        if (budget.equals("收入"))
                                map.put("Fee", "+" + cursor.getString(cursor.getColumnIndex("Fee")));
                        else
                                map.put("Fee", "-" + cursor.getString(cursor.getColumnIndex("Fee")));
                        map.put("Remarks", cursor.getString(cursor.getColumnIndex("Remarks")));

                        if ((cursor.getString(cursor.getColumnIndex("Type"))).equals("衣")) {
                                map.put("Type", R.drawable.cloth);
                        } else if ((cursor.getString(cursor.getColumnIndex("Type"))).equals("食")) {
                                map.put("Type", R.drawable.chart);
                        } else if ((cursor.getString(cursor.getColumnIndex("Type"))).equals("住")) {
                                map.put("Type", R.drawable.zhu);
                        } else if ((cursor.getString(cursor.getColumnIndex("Type"))).equals("行")) {
                                map.put("Type", R.drawable.getmoney);
                        } else if ((cursor.getString(cursor.getColumnIndex("Type"))).equals("其他")) {
                                map.put("Type", R.drawable.getmoney);
                        }

                        cursor.moveToNext();
                        listData.add(map);
                        number++;
                        System.out.println(listData);
                }

                cursor.close();
                mDataBase.close();
                mMysql.close();
        }

        @Override
        public void onClick(View view) {
                switch (view.getId()) {
                        case R.id.imageviewBack:
                                this.finish();
                                break;
                        default:
                                break;
                }

        }

        // 長按事件響應
        View.OnCreateContextMenuListener listviewLongPress = new View.OnCreateContextMenuListener() {
                @Override
                public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
                        // TODO Auto-generated method stub
                        final AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) menuInfo;
                        new AlertDialog.Builder(BillsActivity.this)
                    /* 彈出視窗的最上頭文字 */
                                .setTitle("刪除當前資料")
                    /* 設定彈出視窗的圖式 */
                                .setIcon(android.R.drawable.ic_dialog_info)
                    /* 設定彈出視窗的資訊 */
                                .setMessage("確定刪除當前記錄")
                                .setPositiveButton("是",
                                        new DialogInterface.OnClickListener() {
                                                public void onClick(
                                                        DialogInterface dialoginterface, int i) {
                                                        // 獲取位置索引
                                                        int mListPos = info.position;
                                                        // 獲取對應HashMap資料內容
                                                        HashMap<String, Object> map = listData.get(mListPos);
                                                        // 獲取id
                                                        int id = Integer.valueOf((map.get("ID").toString()));

                                                        // 獲取陣列具體值後,可以對資料進行相關的操作,例如更新資料
                                                        String[] whereArgs = new String[]{String.valueOf(id)};
                                                        //獲取當前資料庫
                                                        mMysql = new MySQLiteHelper(BillsActivity.this, "finance.db", null, 1);
                                                        mDataBase = mMysql.getReadableDatabase();
                                                        try {
                                                                mDataBase.delete("Finance", "ID=?", whereArgs);
                                                                listData.remove(mListPos);
                                                                mlistbillsAdapter.notifyDataSetChanged();
                                                        } catch (Exception e) {
                                                                Log.e("刪除出錯了", "error");
                                                        } finally {
                                                                mDataBase.close();
                                                                mMysql.close();
                                                        }
                                                }
                                        }
                                ).setNegativeButton(
                                "否",
                                new DialogInterface.OnClickListener() {
                                        public void onClick(DialogInterface dialoginterface, int i) {
                                        }
                                }
                        ).show();
                }
        };
}


對於資料裡面的操作,我前面的文章有講,這個實現的流程就是先獲得資料,在將資料介面卡的資料反映到控制元件上去。主要是要將對應關係搞清楚,控制元件的型別和內容。
後面的響應事件,常按listview就會彈出對話方塊,進行刪除操作。其他的R.drawable.XX表示的是圖片資源,可以自行新增.

相關推薦

Android 定義Listview 如何Sqlite資料庫資料

首先我們需要有個載入的檔案,這個佈局檔案裡面的bills.xml,這個佈局裡面有個Listview控制元件。 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns

Android 定義ListView只顯示第一條資料的問題

最近,要在應用中做一個功能,查詢SQLite資料庫中的記錄,用列表進行展示。 關於選擇哪種佈局,因為考慮到介面上要增加一些篩選條件,介面會稍顯複雜,所以就沒有繼承ListFragment,而是繼承了Fragment,並且用了自定義的ListView: <?xml ve

[Cocos2dx] C++定義到Lua

Cocos2dx通過工程裡面的tools/toLua工具生成註冊C++函式到lua的函式cpp檔案  bindings-generator指令碼的工作機制  不用編寫.pkg和.h檔案了,直接定義一個ini檔案,註冊到Lua環境裡的模組名是什麼,就行了。

【封裝】Android定義ListView

ListView中的Item介面 <!-- view_fileitem --> <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.an

SpringMVC框架(1)之(1.3 定義引數

一、自定義引數繫結-屬性編輯器(不推薦) 問題:① 4.1 itemsList.jsp 中增加顯示 “訂購日期” 屬性;② JSP頁面中日期拿到的是字串,而提交到Controller中POJO類ItemsCustom 屬性物件的日期欄位要變成Date型別,即字串轉換成日期型別,無法自動轉

Angular Forms - 定義 ngModel 值的方式

在 Angular 應用中,我們有兩種方式來實現表單繫結——“模板驅動表單”與“響應式表單”。這兩種方式通常能夠很好的處理大部分的情況,但是對於一些特殊的表單控制元件,例如input[type=datetime]、input[type=file],我們需要重寫預設的表單繫結方式,讓我們繫結的變數不再僅僅只是一

Android 定義Listview 與巢狀ScrollView

本文講實現一個自定義列表的Android程式,程式將實現一個使用自定義的介面卡(Adapter)繫結資料,通過ontextView.setTag繫結資料有按鈕的ListView。  系統顯示列表(ListView)時,首先會例項化一個介面卡,本文將例項化一個自定義的介面卡。實現自

SpringMVC定義引數器【日期型別】

前提:由於日期型別有很多種格式,springmvc無法將字串轉換成日期型別,所以需要我們根據業務需求自定義引數繫結! 第一步:自定義引數繫結器---根據介面卡引數繫結器的編碼要求規範開發bean package com.cyn.ssm.converter; impor

ASP.NET MVC 下定義模型,去除字串型別前後的空格

直接貼程式碼了: SkyModelBinder.cs using System.ComponentModel; using System.Linq; using System.Web.Mvc; namespace MvcSample.Extensions { public cl

Spring MVC 之 定義List

Spring MVC對於普通物件可以很容易的進行資料繫結,但是對於複雜物件比如說集合就支援得不太友好。對於普通物件Spring通過在請求引數裡面引數名稱與定義的接收物件的屬性名稱一致就可以進行資料綁定了。比如: 定義的實體物件為: import lo

SpringBoot中定義引數(以Date日期為例)

有時候前臺傳過來一個日期型別,後臺接收就比較麻煩,這種時候就是用SpringMVC中的轉換器,轉換器在SpringMVC中是非常重要的,SpringMVC內部也實現了很多轉換器:實現自己的日期轉換器註冊測試看看:結果:轉化成功!

WPF定義treeview事件SelectedItemChanged

1、設定事件繫結到函式TreeUAAddressSpace_SelectedItemChanged  this.treeBrowseUASpace.SelectedItemChanged += new System.Windows.RoutedPropertyChanged

使用listviewsqlite中的資料

我想在我的安卓專案中實現一個這樣的功能,讀取sqlite資料庫中的資料並顯示到某個頁面的listview控制元件中。 首先,我建立了一個Service類,來實現對資料庫的各種操作,然後在這個類中新增對資料庫操作的增刪改查方法。具體程式碼如下: import java.uti

Vue基礎精講 —— Vue的元件之元件的定義、繼承、定義雙向、高階屬性

Vue元件基礎定義 import Vue from 'vue' const compoent = { props: { active: { // type: Boolean, // required: true, valid

android 定義ListView實現下拉重新整理、分頁載入、點選事件——定義控制元件學習(七)

package com.example.administrator.customerpulldownrefreshandpageload; import android.content.Context; import android.os.Handler; import android.os.Message

WPF中DataGrid使用定義資料

本文用一個簡單的例子進行演示,顯示一個人的姓名和年齡。其中,年齡大於30歲的以紅色顯示,年齡小於20歲的以綠色顯示。功能簡單。 1、首先確定顯示的表格有幾列資料,分別顯示為什麼形式。建模時,DataG

WPF新手之將如何將一個成員變數或定義到控制元件

(再次嘆一下中國的網路環境,搜出來的網頁一大堆,可有用的沒幾個,基本是大家相互轉,真正有了問題楞是找不到能解決的) 首先如果是基本型別的變數,或者是自定義的類,直接繫結到控制元件之後,控制元件只能顯示其初始值,值的改變並不能更新UI,只有以下兩種情況的繫結:①繫結到某個控制

記錄一次定義引數錯誤問題的解決過程

問題背景 先說一下問題背景:整個專案是一個大的分散式系統,由十幾個子系統組成,本人負責其中兩個系統。分散式服務框架採用了公司封裝好的jar包,當然還有一些其他的底層框架。由於某些原因,公司更換了底層分散式服務框架和一些其他的框架,其中分散式服務框架主要是更改了

Android定義ListView實現仿微信側滑刪除

經常在遇到問題第一時間都會在網上搜索解決的方法,因此看到很多前輩們的比較精闢的技術文章,學習了很多東西,現在將自己平時工作中開發的一些小功能坐下總結,也寫出來,既方便自己理清思路記憶功能塊實現思路,又能與大家一起交流分享技術。 第一次寫文章,哪裡有不對的希望大

JS定義事件--通過URL觸發不同的點選事件

window.onload = function () { var btn1 = document.getElementById("btn1"); var btn2 = document.getElementById("btn2"); function EventTarget