kotlin開發(fā)經(jīng)驗談5

listview的使用

這篇講在koltin中如何使用listview直撤,跟java代碼比起來又會有哪些不同呢
先用java代碼創(chuàng)建一個bookAdapter.繼承自BaseAdapter,實現(xiàn)那固定的幾個方法地粪,貼一下代碼:

public class BookAdapter2 extends BaseAdapter {
    private List<Book> books = new ArrayList<>();

    @Override
    public int getCount() {
        return books.size();
    }

    @Override
    public Object getItem(int position) {
        return books.get(position);
    }

    @Override
    public long getItemId(int id) {
        return id;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup container) {
        ViewHolder viewHolder;
        Book book = (Book) getItem(position);
        if (convertView == null) {
            convertView = LayoutInflater.from(container.getContext()).inflate(R.layout.view_book_list_item, container, false);
            viewHolder = new ViewHolder(convertView);
            convertView.setTag(viewHolder);
        } else {
            viewHolder = (ViewHolder) convertView.getTag();
        }
        viewHolder.author.setText(book.getAuthor());
        viewHolder.name.setText(book.getName());
        return convertView;
    }

    static class ViewHolder {
        TextView author;
        TextView name;

        ViewHolder(View itemView) {
            author = itemView.findViewById(R.id.author);
            name = itemView.findViewById(R.id.name);
        }
    }
}

adapter里面最關(guān)鍵的代碼就是getView了酸些。那我們看看轉(zhuǎn)換成kotlin之后改怎么寫宰译,筆者這里沒有使用一鍵轉(zhuǎn)換,有點不太靠譜魄懂,還不如自己手敲沿侈,看一下得到的最原始的代碼

override fun getView(position: Int, convertView: View?, container: ViewGroup): View {
            val data = getItem(position) as Book
            val view: View
            val viewHolder: ViewHolder
            if (convertView == null) {
                view =  LayoutInflater.from(container.context).inflate(R.layout.view_book_list_item, container, false)
                viewHolder = ViewHolder(view)
                view.tag = viewHolder
            } else {
                view = convertView
                viewHolder = view.tag as ViewHolder
            }

            viewHolder.name.text = data.name
            viewHolder.author.text = data.author
            return view
        }

getView方法在轉(zhuǎn)換為java方法的時候,override fun getView(position: Int, convertView: View?, container: ViewGroup): View{}后兩個參數(shù)都是可空的市栗,而且參數(shù)都是常量了缀拭,不能夠當做變量用,這個地方得注意一下填帽。
在這里蛛淋,由于converView可能為null,而且是常量篡腌,不能修改值褐荷,那么原來的返回converView就不行了,得重新定義一個view哀蘑,在convertView為空的時候加載布局诚卸,非空的時候把converView賦值給view。以上的代碼寫法绘迁,是初學使用kotlin的寫法合溺,但是代碼看起來也還是清晰的。缀台。

那么我們是否有辦法修改優(yōu)化呢棠赛,變得更加函數(shù)式風格一點呢。

override fun getView(position: Int, convertView: View?, container: ViewGroup): View {
            val data = getItem(position) as Book
            val view: View = convertView ?: LayoutInflater.from(container.context).inflate(R.layout.view_book_list_item, container, false).apply {
                tag = ViewHolder(this)
            }
            (view.tag as ViewHolder).apply {
                name.text = data.name
                author.text = data.author
            }
            return view
        }

直接看這么一段代碼,這個就是我們做了一定程度的代碼優(yōu)化睛约,是的看起來更加偏函數(shù)式編程鼎俘,思路是直接對view賦值,根據(jù)converView是否為空做區(qū)分辩涝,不為空直接復制贸伐,為空的話,先加載布局同時執(zhí)行apply{}代碼塊怔揩,設置viewHolder捉邢。
然后就是講viewHolder取出來了,對控件進行賦值,思路其實跟最開始的koltin的思路是一樣的商膊,只不過代碼風格上面變化了伏伐。
那么是否可以再進一步演進呢。

override fun getView(position: Int, convertView: View?, container: ViewGroup): View {
            val data = getItem(position) as Book
            return (convertView ?: LayoutInflater.from(container.context).inflate(R.layout.view_book_list_item, container, false).apply {
                tag = ViewHolder(this)
            }).apply {
                (tag as ViewHolder).apply {
                    name.text = data.name
                    author.text = data.author
                    //this@apply.container.isSelected = selectedBooks.contains(data)
                }
            }
        }

這樣看起來就只定義了一個data常量晕拆,然后就直接return了convertView藐翎。顯得挺簡潔了。
當然了這樣的代碼看起來可能不是很直觀实幕,因為if條件不是很明顯吝镣,沒有java代碼寫出來的邏輯清晰分明,條件判斷區(qū)分的很顯眼茬缩。需要團隊成員熟悉這種寫法才好赤惊。初看這段代碼幾乎是一臉懵逼的,都不知道為啥這樣apply{}.apply{}的嵌套代碼凰锡,而且直接引用的是類屬性,各種this之類的圈暗,不好好的分析代碼掂为,肯定會很困惑的,如果項目里面類似這樣的代碼多了员串,新成員剛接觸肯定很不適應的勇哗。在這里就得扯遠一點了,如何讓代碼變得清晰可讀并且簡潔寸齐?

個人有一些看法欲诺,清晰可讀簡潔,我覺得得從邏輯的角度上來說

邏輯上得清晰渺鹦,無論是if條件判斷扰法,多重if/else判斷,還是循環(huán)嵌套毅厚,遞歸塞颁,或者是其他的設計模式等邏輯上一定得清晰,讀代碼的人能夠知道你是怎么區(qū)分的,依據(jù)條件是什么祠锣,是否分類的完善酷窥,邏輯跳轉(zhuǎn)是否合理正常等。

代碼可讀性強伴网,寫出來的代碼蓬推,讓團隊成員看著不困惑,就如同知名的開源項目那樣澡腾,大神寫出來的java代碼沸伏,基本上做過java開發(fā)的同學都是能夠看懂的,java語言決定了它的代碼寫出來的就是這樣的套路蛋铆,只不過在大神的手里馋评,寫出來可讀性,邏輯性都很高刺啦。讓人覺得代碼寫的很漂亮留特,很清爽。代碼的流轉(zhuǎn)執(zhí)行過程比較符合正常人的思維習慣等玛瘸,這樣的代碼容易給開發(fā)者一種親切感

簡潔蜕青,簡潔還是得是邏輯上簡潔,更多的時候不要過度沉迷于代碼層面了糊渊,比如說右核,某某一個驗證碼控件,不同業(yè)務都有自己的特殊場景渺绒,這種情況下不好復用的話贺喝,就按業(yè)務拆離,不要為了節(jié)省代碼宗兼,而將這兩三個業(yè)務的代碼都放在一起躏鱼,而且還堆纏在一起,這樣不太好殷绍,還不如為每一個業(yè)務做一個獨立的封裝染苛,出現(xiàn)部分重復的代碼是可以接受的,一定要記住主到,我們需要的是邏輯上的簡潔茶行,在舉個例子形容,比如說圖片加載組件picasso登钥,或者是Glide等畔师,我在項目中使用了其中一個,那么我需要考慮到以后存在換組件的問題而封裝一個抽象層嗎(當然了這個例子可能舉的不好怔鳖,但是這里我還是想說下這個)茉唉,我覺得是沒有必要的固蛾,這種組件api已經(jīng)足夠簡單了,使用也是極其方便度陆,而且還很方面開發(fā)者擴展一些特殊的需求艾凯,比如說加載通知欄的icon等場景,使用組件原生api已經(jīng)足夠方便懂傀,足夠簡潔了趾诗,我覺得在做封裝是沒有必要的,等你真正覺得需要換的時候蹬蚁,半天到一天就換過來了恃泪,畢竟我也是做過這種工作,不覺得有多麻煩犀斋。更何況做的封裝贝乎,不見的能夠滿足所有的場景,難道等不滿足的時候在重新寫一個新的方法嗎叽粹,或者就是直接調(diào)用原生組件的api呢览效? 反正我覺得沒必要。這就是我的技術(shù)理念虫几。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末锤灿,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子辆脸,更是在濱河造成了極大的恐慌但校,老刑警劉巖,帶你破解...
    沈念sama閱讀 210,978評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件啡氢,死亡現(xiàn)場離奇詭異状囱,居然都是意外死亡,警方通過查閱死者的電腦和手機倘是,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評論 2 384
  • 文/潘曉璐 我一進店門浪箭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人辨绊,你說我怎么就攤上這事∑ケ恚” “怎么了门坷?”我有些...
    開封第一講書人閱讀 156,623評論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長袍镀。 經(jīng)常有香客問我默蚌,道長,這世上最難降的妖魔是什么苇羡? 我笑而不...
    開封第一講書人閱讀 56,324評論 1 282
  • 正文 為了忘掉前任绸吸,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘锦茁。我一直安慰自己攘轩,他們只是感情好,可當我...
    茶點故事閱讀 65,390評論 5 384
  • 文/花漫 我一把揭開白布码俩。 她就那樣靜靜地躺著度帮,像睡著了一般。 火紅的嫁衣襯著肌膚如雪稿存。 梳的紋絲不亂的頭發(fā)上笨篷,一...
    開封第一講書人閱讀 49,741評論 1 289
  • 那天,我揣著相機與錄音瓣履,去河邊找鬼率翅。 笑死,一個胖子當著我的面吹牛袖迎,可吹牛的內(nèi)容都是我干的冕臭。 我是一名探鬼主播,決...
    沈念sama閱讀 38,892評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼瓢棒,長吁一口氣:“原來是場噩夢啊……” “哼浴韭!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起脯宿,我...
    開封第一講書人閱讀 37,655評論 0 266
  • 序言:老撾萬榮一對情侶失蹤念颈,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后连霉,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體榴芳,經(jīng)...
    沈念sama閱讀 44,104評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年跺撼,在試婚紗的時候發(fā)現(xiàn)自己被綠了窟感。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,569評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡歉井,死狀恐怖柿祈,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情哩至,我是刑警寧澤躏嚎,帶...
    沈念sama閱讀 34,254評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站菩貌,受9級特大地震影響卢佣,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜箭阶,卻給世界環(huán)境...
    茶點故事閱讀 39,834評論 3 312
  • 文/蒙蒙 一虚茶、第九天 我趴在偏房一處隱蔽的房頂上張望戈鲁。 院中可真熱鬧,春花似錦嘹叫、人聲如沸婆殿。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,725評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽鸣皂。三九已至,卻和暖如春暮蹂,著一層夾襖步出監(jiān)牢的瞬間寞缝,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,950評論 1 264
  • 我被黑心中介騙來泰國打工仰泻, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留荆陆,地道東北人。 一個月前我還...
    沈念sama閱讀 46,260評論 2 360
  • 正文 我出身青樓集侯,卻偏偏與公主長得像被啼,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子棠枉,可洞房花燭夜當晚...
    茶點故事閱讀 43,446評論 2 348

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

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,734評論 25 707
  • 上一章 | 目錄 chapter.7 欺詐師(1) 我靠欺騙收獲觀眾的笑容浓体,靠欺騙隱瞞血腥的秘密,靠欺騙贏得虛偽的...
    葳蕤之魂閱讀 1,191評論 0 1
  • HTML是什么辈讶? 定義:HTML 是用來描述網(wǎng)頁的一種語言 HTML 指的是超文本標記語言: HyperText ...
    Eugene_iOS閱讀 400評論 0 0