Android數(shù)據(jù)存儲(chǔ)(四)——SQLite+RecyclerView

在對(duì)數(shù)據(jù)庫(kù)進(jìn)行基本操作之后逝她,把查詢到的數(shù)據(jù)用RecyclerView列表顯示出來(lái),這里用到的知識(shí)都是之前學(xué)過(guò)的知識(shí)窿凤,只是做了一點(diǎn)結(jié)合仅偎。這里用到了Glide顯示圖片西潘,所以需要添加依賴,申請(qǐng)?jiān)L問(wèn)網(wǎng)絡(luò)的權(quán)限哨颂。

一、添加RecyclerView

在之前的工程中添加一個(gè)DataActivity相种,生成相對(duì)應(yīng)的布局威恼,在布局中加入RecyclerView,然后新建一個(gè)列表項(xiàng)的布局item_layout寝并,把要顯示在RecyclerView中的布局樣式構(gòu)建出來(lái)箫措。

<?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="130dp"
    android:id="@+id/rl_book_layout">

    <ImageView
        android:id="@+id/iv_book_image"
        android:layout_width="150dp"
        android:layout_height="110dp"
        android:layout_marginBottom="10dp"
        android:layout_marginStart="10dp"
        android:layout_marginTop="10dp" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="20dp"
        android:id="@+id/tv_book_name"
        android:layout_toRightOf="@+id/iv_book_image"
        android:layout_marginLeft="15dp"
        android:layout_marginTop="10dp"
        android:text="bookname"
        />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="20dp"
        android:id="@+id/tv_book_author"
        android:layout_below="@+id/tv_book_name"
        android:layout_marginTop="10dp"
        android:layout_toRightOf="@id/iv_book_image"
        android:layout_marginLeft="15dp"
        android:text="author"/>

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="20dp"
        android:id="@+id/tv_book_price"
        android:layout_below="@id/tv_book_author"
        android:layout_marginTop="10dp"
        android:layout_toRightOf="@id/iv_book_image"
        android:layout_marginLeft="15dp"
        android:text="price"/>

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="20dp"
        android:id="@+id/tv_book_pages"
        android:layout_below="@id/tv_book_price"
        android:layout_marginTop="10dp"
        android:layout_toRightOf="@id/iv_book_image"
        android:layout_marginLeft="15dp"
        android:text="pages"/>

</RelativeLayout>
item

然后新建一個(gè)Item類,把要顯示的屬性聲明出來(lái)衬潦,生成構(gòu)造器和Getter and Setter斤蔓,

public class Item {
    private String imgUrl;
    private String bookName;
    private String bookAuthor;
    private String bookPrice;
    private String bookPages;

    public Item(String imgUrl, String bookName, String bookAuthor, String bookPrice, String bookPages) {
        this.imgUrl = imgUrl;
        this.bookName = bookName;
        this.bookAuthor = bookAuthor;
        this.bookPrice = bookPrice;
        this.bookPages = bookPages;
    }

    public String getImgUrl() {return imgUrl;}

    public void setImgUrl(String imgUrl) {this.imgUrl = imgUrl;}

    public String getBookName() {return bookName;}

    public void setBookName(String bookName) {this.bookName = bookName;}

    public String getBookAuthor() {return bookAuthor;}

    public void setBookAuthor(String bookAuthor) {this.bookAuthor = bookAuthor;}

    public String getBookPrice() {return bookPrice;}

    public void setBookPrice(String bookPrice) {this.bookPrice = bookPrice;}

    public String getBookPages() {return bookPages;}

    public void setBookPages(String bookPages) {this.bookPages = bookPages;}
}

新建ItemFactory類用于生成需要的數(shù)據(jù)

public class ItemFactory {
    public static String[] bookImage = new String[1000];
    public static String[] bookName = new String[1000];
    public static String[] bookAuthor = new String[1000];
    public static String[] bookPrice = new String[1000];
    public static String[] bookPages = new String[1000];
    public static int bookCount;

    public static void queryDatabase(SQLiteDatabase db){

        String[] strings = new String[]{"id","image","author","price","pages","name"};
        Cursor cursor = db.query ("book",strings,null,null,null,null,null);
        bookCount = cursor.getCount ();
        for (int i = 0; i < cursor.getCount (); i++) {
            if(cursor.moveToFirst ()) {
                cursor.move (i);
                int id = cursor.getInt (cursor.getColumnIndex ("id"));
                Log.d ("book id", "book is NO." + id);
                bookImage[i] = cursor.getString (cursor.getColumnIndex ("image"));
                bookAuthor[i] = cursor.getString (cursor.getColumnIndex ("author"));
                bookPrice[i] = cursor.getString (cursor.getColumnIndex ("price"));
                bookPages[i] = cursor.getString (cursor.getColumnIndex ("pages"));
                bookName[i] = cursor.getString (cursor.getColumnIndex ("name"));
            }
        }
    }

    public static List<Item> createItem(SQLiteDatabase db){
        List<Item> items = new ArrayList<> ();
        queryDatabase (db);
        for (int i=0;i < bookCount;i++){
            String image = bookImage[i];
            String author = bookAuthor[i];
            String name = bookName[i];
            String price = bookPrice[i];
            String pages = bookPages[i];
            items.add(new Item(image,name,author,price,pages));
           }
        return items;
        }
     }

最重要的就是適配器了

public class BookAdapter extends RecyclerView.Adapter<BookAdapter.BookHolder> {

    Context context;
    private List<Item> list;

    public BookAdapter(Context context, List<Item> list) {
        this.context = context;
        this.list = list;
    }

    @NonNull
    @Override
    public BookHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from (parent.getContext ()).inflate (R.layout.layout_item,parent,false);
        BookHolder bookHolder = new BookHolder (view);
        return bookHolder;
    }

    @Override
    public void onBindViewHolder(@NonNull BookHolder holder, int position) {
        Item item = list.get (position);
        Glide.with (context).load (item.getImgUrl ()).into (holder.ivBookImage);
        holder.tvBookName.setText (item.getBookName ());
        holder.tvBookAuthor.setText (item.getBookAuthor ());
        holder.tvBookPrice.setText (item.getBookPrice ());
        holder.tvBookPages.setText (item.getBookPages ());

    }

    @Override
    public int getItemCount() {
        return list.size ();
    }

    class BookHolder extends RecyclerView.ViewHolder{

        RelativeLayout itemLayout;
        ImageView ivBookImage;
        TextView tvBookName;
        TextView tvBookAuthor;
        TextView tvBookPrice;
        TextView tvBookPages;
        public BookHolder(View itemView) {

            super (itemView);
            itemLayout = itemView.findViewById (R.id.rl_book_layout);
            ivBookImage = itemView.findViewById (R.id.iv_book_image);
            tvBookName = itemView.findViewById (R.id.tv_book_name);
            tvBookAuthor = itemView.findViewById (R.id.tv_book_author);
            tvBookPrice = itemView.findViewById (R.id.tv_book_price);
            tvBookPages = itemView.findViewById (R.id.tv_book_pages);

        }
    }
}

二、 封裝數(shù)據(jù)庫(kù)處理工具類DataUtil

把和數(shù)據(jù)庫(kù)有關(guān)的方法用一個(gè)工具類封裝起來(lái),對(duì)數(shù)據(jù)庫(kù)進(jìn)行增刪改查等操作都在工具類中進(jìn)行镀岛。

public class DataUtil {
    public static final String CREATE_BOOK = "create table book ("
            + "id integer primary key autoincrement,  "
            + "image text,"
            + "author text, "
            + "price text, "
            + "pages integer, "
            + "name text)";

    public void createTable(SQLiteDatabase db){
        db.execSQL (CREATE_BOOK);
    }

    public void insertDataBase(SQLiteDatabase db){

        insertData (db,"https://upload-images.jianshu.io/upload_images/13206622-41a6268f8c107ea1.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/508",
                "作者: 曹雪芹","價(jià)格: 40元","頁(yè)數(shù): 200頁(yè)","書(shū)名:《紅樓夢(mèng)》");
        insertData (db,"https://upload-images.jianshu.io/upload_images/13206622-4c9d58b5ae949a46.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/350",
                "作者: 吳承恩","價(jià)格: 50元","頁(yè)數(shù): 300頁(yè)","書(shū)名:《西游記》");
        insertData (db,"https://upload-images.jianshu.io/upload_images/13206622-6e0d5908bf95fd59.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/350",
                "作者: 羅貫中","價(jià)格: 60元","頁(yè)數(shù): 400頁(yè)","書(shū)名:《三國(guó)演義》");
        insertData (db,"https://upload-images.jianshu.io/upload_images/13206622-8a7dfd4925a4887d.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/200",
                "作者: 施耐庵","價(jià)格: 70元","頁(yè)數(shù): 500頁(yè)","書(shū)名:《水滸傳》");
    }

    public void insertData(SQLiteDatabase db, String imgUrl, String author, String price, String pages, String name){
        ContentValues cv = new ContentValues ();
        cv.put ("image",imgUrl);
        cv.put ("author",author);
        cv.put ("price",price);
        cv.put ("pages",pages);
        cv.put ("name",name);
        db.insert ("book",null,cv);
    }

    public void deleteDatabase(SQLiteDatabase db){
        String whereClauses = "id=?";
        String [] whereArgs = {String.valueOf(1)};
        db.delete ("book",whereClauses,whereArgs);
    }

    public void updateDatabase(SQLiteDatabase db){
        ContentValues cv = new ContentValues ();
        cv.put ("price","價(jià)格: 35元");
        cv.put ("pages","頁(yè)數(shù): 250頁(yè)");
        String whereClauses = "id=?";
        String [] whereArgs = {String.valueOf(1)};
        db.update ("book",cv,whereClauses,whereArgs);
    }
}

三弦牡、 在DataActivity中進(jìn)行實(shí)例化

RecyclerView需要進(jìn)行實(shí)例化才能正確顯示。

public class DataActivity extends Activity {

    private SQLiteDatabase db;
    private RecyclerView recyclerView;
    private BookAdapter bookAdapter;
    List<Item> list = null;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate (savedInstanceState);
        setContentView (R.layout.activity_data);
        db = MySQLiteHelper.getInstance (DataActivity.this);
        list =  ItemFactory.createItem (db);
        recyclerView = findViewById (R.id.rv_book);
        bookAdapter = new BookAdapter (this,list);
        //設(shè)置LayoutManager
        recyclerView.setLayoutManager(new LinearLayoutManager (this,LinearLayoutManager.VERTICAL,false));
        //設(shè)置動(dòng)畫(huà)效果
        recyclerView.setItemAnimator(new DefaultItemAnimator ());
        //設(shè)置適配器
        recyclerView.setAdapter(bookAdapter);
        //添加默認(rèn)的分割線
        recyclerView.addItemDecoration(new DividerItemDecoration (this,DividerItemDecoration.VERTICAL));
    }
}

四漂羊、 修改MainActivity

public class MainActivity extends AppCompatActivity {

    //新增控件
    private Button mBtnCreate;
    private Button mBtnDestroy;
    private DataUtil dataUtil;
    private SQLiteDatabase db;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate (savedInstanceState);
        setContentView (R.layout.activity_main);
        dataUtil = new DataUtil ();
        initView ();
        setListener ();
    }

    public void initView(){
          //新增控件
        mBtnTable = findViewById (R.id.btn_table_create);
        mBtnDestroy = findViewById (R.id.btn_database_destroy);
    }

    private void setListener(){
        //添加事件監(jiān)聽(tīng)
        mBtnTable.setOnClickListener (new CreateTableListener ());
        mBtnDestroy.setOnClickListener (new DestroyListener ());
    }

    class CreateListener implements View.OnClickListener{

        @Override
        public void onClick(View view) {
            db = MySQLiteHelper.getInstance (MainActivity.this);
            mTvDatainfo.setText ("創(chuàng)建數(shù)據(jù)庫(kù)成功驾锰!");
        }
    }

    class CreateTableListener implements View.OnClickListener{

        @Override
        public void onClick(View view) {
            db = MySQLiteHelper.getInstance (MainActivity.this);
            dataUtil.createTable (db);
            mTvDatainfo.setText ("創(chuàng)建表單成功!");
        }
    }

    class InsertListener implements View.OnClickListener{

        @Override
        public void onClick(View view) {
            dataUtil.insertDataBase (db);
            mTvDatainfo.setText ("添加數(shù)據(jù)成功走越!");
        }
    }

    class DeleteListener implements View.OnClickListener{

        @Override
        public void onClick(View view) {
            dataUtil.deleteDatabase (db);
            mTvDatainfo.setText ("刪除成功椭豫!");
        }
    }

    class UpdateListener implements View.OnClickListener{

        @Override
        public void onClick(View view) {
            dataUtil.updateDatabase (db);
            mTvDatainfo.setText ("修改成功!");
        }
    }

    class QueryListener implements View.OnClickListener{
        @Override
        public void onClick(View view) {
            Intent intent = new Intent (MainActivity.this,DataActivity.class);
            startActivity (intent);
        }
    }

    class DestroyListener implements View.OnClickListener{

        @Override
        public void onClick(View view) {
            String sql ="DROP TABLE book";
            db.execSQL(sql);
            mTvDatainfo.setText ("刪除表成功旨指!");
        }
    }

}
主界面

列表界面
三國(guó)演義

西游記

紅樓夢(mèng)

水滸傳
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末赏酥,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子谆构,更是在濱河造成了極大的恐慌裸扶,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,273評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件低淡,死亡現(xiàn)場(chǎng)離奇詭異姓言,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)蔗蹋,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,349評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門何荚,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人猪杭,你說(shuō)我怎么就攤上這事餐塘。” “怎么了皂吮?”我有些...
    開(kāi)封第一講書(shū)人閱讀 167,709評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵戒傻,是天一觀的道長(zhǎng)税手。 經(jīng)常有香客問(wèn)我,道長(zhǎng)需纳,這世上最難降的妖魔是什么芦倒? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,520評(píng)論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮不翩,結(jié)果婚禮上兵扬,老公的妹妹穿的比我還像新娘。我一直安慰自己口蝠,他們只是感情好器钟,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,515評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著妙蔗,像睡著了一般傲霸。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上眉反,一...
    開(kāi)封第一講書(shū)人閱讀 52,158評(píng)論 1 308
  • 那天昙啄,我揣著相機(jī)與錄音,去河邊找鬼寸五。 笑死跟衅,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的播歼。 我是一名探鬼主播伶跷,決...
    沈念sama閱讀 40,755評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼秘狞!你這毒婦竟也來(lái)了叭莫?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,660評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤烁试,失蹤者是張志新(化名)和其女友劉穎雇初,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體减响,經(jīng)...
    沈念sama閱讀 46,203評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡靖诗,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,287評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了支示。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片刊橘。...
    茶點(diǎn)故事閱讀 40,427評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖颂鸿,靈堂內(nèi)的尸體忽然破棺而出促绵,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 36,122評(píng)論 5 349
  • 正文 年R本政府宣布败晴,位于F島的核電站浓冒,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏尖坤。R本人自食惡果不足惜稳懒,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,801評(píng)論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望慢味。 院中可真熱鬧僚祷,春花似錦、人聲如沸贮缕。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,272評(píng)論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)感昼。三九已至,卻和暖如春罐脊,著一層夾襖步出監(jiān)牢的瞬間定嗓,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,393評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工萍桌, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留宵溅,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,808評(píng)論 3 376
  • 正文 我出身青樓上炎,卻偏偏與公主長(zhǎng)得像恃逻,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子藕施,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,440評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,264評(píng)論 25 707
  • 【Android 控件 RecyclerView】 概述 RecyclerView是什么 從Android 5.0...
    Rtia閱讀 307,550評(píng)論 27 439
  • 中序非遞歸遍歷 遇到一個(gè)結(jié)點(diǎn)寇损,就把他壓入棧,并去遍歷它的左子樹(shù) 當(dāng)左子樹(shù)遍歷結(jié)束后裳食,從棧頂彈出這個(gè)結(jié)點(diǎn)并訪問(wèn)它 然...
    tingshuo123閱讀 291評(píng)論 0 0
  • 當(dāng)你放下面子賺錢的時(shí)候诲祸, 說(shuō)明你已經(jīng)懂事了浊吏。 當(dāng)你用錢賺回面子的時(shí)候, 說(shuō)明你已經(jīng)成功了救氯。 當(dāng)你用面子可以賺錢的時(shí)...
    素素冰冰閱讀 569評(píng)論 0 0