仿QQ聊天列表

295706.jpg
前言:

今天要給大家?guī)鞶Q聊天列表的仿寫效果,寫得不好地方請見諒~

概述:
  • 環(huán)境:Android Studio 3.42
  • 語言:Java
  • 特點(diǎn):簡單毅弧,易懂蔫仙,效果爆炸
展示:
image.png
項(xiàng)目技術(shù):
  • ListView 可以縱向滑動列表鲸伴,下面demo實(shí)現(xiàn)了繼承ListView的新列表,代碼如下
    MyListView extends ListView
public class MyListView extends ListView {



    public MyListView(Context context) {
        super(context);
    }

    public MyListView(Context context, AttributeSet attrs) {
        super(context, attrs);
        //設(shè)置適配器
        setAdapter(new MyAdapter());
    }


    public class MyAdapter extends BaseAdapter{

        /*列表的行數(shù)*/
        @Override
        public int getCount() {
            return 10;
        }

        @Override
        public Object getItem(int position) {
            return null;
        }

        /*返回列表item的序號*/
        @Override
        public long getItemId(int position) {
            return position;
        }
        /*列表顯示的內(nèi)容*/
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            View v = View.inflate(getContext(),R.layout.layout_qq,null);
            return v;
        }
    }
}
  • BaseAdapter 適配器灾票,用于設(shè)置列表行數(shù)和每一行的內(nèi)容
 public class MyAdapter extends BaseAdapter{

        /*列表的行數(shù)*/
        @Override
        public int getCount() {
            return 10;
        }

        @Override
        public Object getItem(int position) {
            return null;
        }

        /*返回列表item的序號*/
        @Override
        public long getItemId(int position) {
            return position;
        }
        /*列表顯示的內(nèi)容*/
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            View v = View.inflate(getContext(),R.layout.layout_qq,null);
            return v;
        }
    }

這里我們通過繼承ListView得到一個列表對象峡谊,并實(shí)現(xiàn)了設(shè)置適配器得到列表的行數(shù)和內(nèi)容,就實(shí)現(xiàn)了一個可滑動的列表刊苍,最后在xml文件里引用一下就OK了既们,效果如下

activity_main.xml引用

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <com.example.day_10.MyListView
        android:id="@+id/listView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

</RelativeLayout>

下面講解如何實(shí)現(xiàn)類似QQ聊天列表的效果

  • 圓形頭像實(shí)現(xiàn)
    MyImageView
public class MyImageView extends AppCompatImageView {



    public MyImageView(Context context) {
        super(context);
    }

    public MyImageView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    public void draw(Canvas canvas) {
        /*新建路徑,形成一個圓*/
        Path path = new Path();
        /*對應(yīng)參數(shù)分別是圓心坐標(biāo)正什,半徑啥纸,順逆方向*/
        path.addCircle(getPivotX()+getWidth()/2,getPivotY()+getHeight()/2,getWidth()/2, Path.Direction.CCW);
        /*剪掉與圓無關(guān)的部分*/
        canvas.clipPath(path);
        super.draw(canvas);
    }
}

效果


image.png

布局

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

    <com.example.day_10.MyImageView
        android:layout_width="100dp"
        android:layout_height="100dp"
        android:background="@drawable/icon"
        android:layout_marginStart="20dp"
        android:scaleType="fitXY"/>
    <TextView
        android:layout_width="match_parent"
        android:layout_height="100dp"
        android:layout_marginStart="20dp"
        android:background="@color/colorPrimaryDark"/>

</LinearLayout>

簡要說明:圓形頭像的實(shí)現(xiàn)其實(shí)就是通過Android繪制時(shí)去掉圓形以外的部分,類似剪刀剪紙婴氮,一般圖片是長方形的斯棒,剪切呈圓形當(dāng)然需要有一圓形路徑path,還要有剪刀canvas的clipPath方法,然后返回的是和path一樣路徑形狀的圖片主经,所以通過繼承AppCompatImageView(本身繼承ImageView),重寫draw方法荣暮,完成圓形圖片的繪制,這里我隨便選擇了一張方形圖片作為頭像罩驻,實(shí)現(xiàn)效果如上

那么到這里我們實(shí)現(xiàn)了列表穗酥,左邊頭像,最后實(shí)現(xiàn)右邊數(shù)據(jù),當(dāng)然為了模仿砾跃,聊天記錄我們自己來寫

  • DataUtils 數(shù)據(jù)加載
public class DataUtils {
    /**
     * 文件數(shù)據(jù)加載
     * */
    public static Object loadDataInFile(){return null;}
    /**
     * 自己構(gòu)造的數(shù)據(jù)加載
     * */
    public static ArrayList<FriendMode> loadDataInMine(){

        ArrayList<FriendMode> modes = new ArrayList<>();
        for(int i=0;i<10;i++)
        {
            FriendMode mode = new FriendMode(R.drawable.one,"Android開發(fā)");
            modes.add(mode);
        }
        return modes;}
    /**
     * 數(shù)據(jù)庫加載數(shù)據(jù)
     * */
    public static Object loadDataInRoom(){return null;}
    /**
     * 網(wǎng)絡(luò)數(shù)據(jù)加載
     * */
    public static Object loadDataInSite(){return null;}
}

為了方便骏啰,這里每條信息都會是一樣的

  • DataManager 獲取創(chuàng)建的數(shù)據(jù)
import java.util.ArrayList;

public class DataManager {

    /**
     * 數(shù)據(jù)資源
     * */
    private ArrayList<FriendMode> dataSource;


    public ArrayList<FriendMode> getDataSource() {
        return dataSource;
    }


    /**
     * 單例對象
     * */
private DataManager(){loadData();}
public static final DataManager shareManager = new DataManager();


    /**
     * 加載數(shù)據(jù)
     * */
    private void loadData(){dataSource = DataUtils.loadDataInMine();}

}
  • FriendItem 提取內(nèi)容
public class FriendItem {

    private FriendMode mode;

    public View rootView;
    private Context context;

    public FriendItem(Context context,FriendMode mode){
        this.mode = mode;
        this.context = context;
        initView();
    }

    private void initView()
    {
        View v = View.inflate(context,R.layout.layout,null);
        ImageView icon = v.findViewWithTag(context.getString(R.string.iconTag));
        TextView name = v.findViewWithTag(context.getResources().getString(R.string.nameTag));
        icon.setImageResource(mode.id);
        name.setText(mode.name);
        rootView = v;
    }

}
  • MyListView 顯示內(nèi)容
public class MyListView extends ListView {

    public MyListView(Context context) {
        super(context);
    }

    public MyListView(Context context, AttributeSet attrs) {
        super(context, attrs);
        setAdapter();
    }

    private void setAdapter(){
        setAdapter(new MyAdapter());
    }
    private class MyAdapter extends BaseAdapter {

        @Override
        public int getCount() {
            return DataManager.shareManager.getDataSource().size();
        }

        @Override
        public Object getItem(int i) {
            return null;
        }

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

        @Override
        public View getView(int i, View view, ViewGroup viewGroup) {
            FriendItem friendItem = new FriendItem(getContext(),DataManager.shareManager.getDataSource().get(i));
            return friendItem.rootView;
        }
    }
}

簡要說明:這里的FriendItem類實(shí)現(xiàn)了ImageView和TextView的提取以及對應(yīng)內(nèi)容的設(shè)置

總結(jié):這個demo復(fù)用性很高,因?yàn)楹芏啻a使用了許多類來封裝抽高,方便添加和設(shè)置判耕,如果不想用也不會刪除很多代碼,只需在 xml里注釋掉即可厨内,雖然效果還有待提高祈秕,但是QQ聊天列表的功能實(shí)現(xiàn)了渺贤,感謝大家的閱讀雏胃,有不足的地方還請留言

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市志鞍,隨后出現(xiàn)的幾起案子瞭亮,更是在濱河造成了極大的恐慌,老刑警劉巖固棚,帶你破解...
    沈念sama閱讀 221,695評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件统翩,死亡現(xiàn)場離奇詭異,居然都是意外死亡此洲,警方通過查閱死者的電腦和手機(jī)厂汗,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,569評論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來呜师,“玉大人娶桦,你說我怎么就攤上這事≈梗” “怎么了衷畦?”我有些...
    開封第一講書人閱讀 168,130評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長知牌。 經(jīng)常有香客問我祈争,道長,這世上最難降的妖魔是什么角寸? 我笑而不...
    開封第一講書人閱讀 59,648評論 1 297
  • 正文 為了忘掉前任菩混,我火速辦了婚禮,結(jié)果婚禮上扁藕,老公的妹妹穿的比我還像新娘墨吓。我一直安慰自己,他們只是感情好纹磺,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,655評論 6 397
  • 文/花漫 我一把揭開白布帖烘。 她就那樣靜靜地躺著,像睡著了一般橄杨。 火紅的嫁衣襯著肌膚如雪秘症。 梳的紋絲不亂的頭發(fā)上照卦,一...
    開封第一講書人閱讀 52,268評論 1 309
  • 那天,我揣著相機(jī)與錄音乡摹,去河邊找鬼役耕。 笑死,一個胖子當(dāng)著我的面吹牛聪廉,可吹牛的內(nèi)容都是我干的瞬痘。 我是一名探鬼主播,決...
    沈念sama閱讀 40,835評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼板熊,長吁一口氣:“原來是場噩夢啊……” “哼框全!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起干签,我...
    開封第一講書人閱讀 39,740評論 0 276
  • 序言:老撾萬榮一對情侶失蹤津辩,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后容劳,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體喘沿,經(jīng)...
    沈念sama閱讀 46,286評論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,375評論 3 340
  • 正文 我和宋清朗相戀三年竭贩,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了蚜印。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,505評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡留量,死狀恐怖窄赋,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情肪获,我是刑警寧澤寝凌,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站孝赫,受9級特大地震影響较木,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜青柄,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,873評論 3 333
  • 文/蒙蒙 一伐债、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧致开,春花似錦峰锁、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,357評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春魄衅,著一層夾襖步出監(jiān)牢的瞬間峭竣,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,466評論 1 272
  • 我被黑心中介騙來泰國打工晃虫, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留皆撩,地道東北人。 一個月前我還...
    沈念sama閱讀 48,921評論 3 376
  • 正文 我出身青樓哲银,卻偏偏與公主長得像扛吞,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子荆责,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,515評論 2 359

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