Android仿微信朋友圈點(diǎn)贊和評(píng)論功能
最近在做朋友圈的項(xiàng)目,所以寫一個(gè)Android仿朋友圈點(diǎn)贊和評(píng)論功能Demo,代碼就是簡(jiǎn)單實(shí)現(xiàn)了一下功能,沒(méi)有做優(yōu)化,湊合看。
圖文排列是用的RecyclerView實(shí)現(xiàn)的,彈窗效果是用的自定義的PopupWindow,點(diǎn)贊應(yīng)該是在本地請(qǐng)求數(shù)據(jù)庫(kù),設(shè)置一個(gè)flag,獲取當(dāng)前用戶的id后,帶著id向服務(wù)器post一個(gè)flag,評(píng)論就比較簡(jiǎn)單了,也是獲取當(dāng)前朋友id(或者昵稱),帶著內(nèi)容,向服務(wù)器post
貼代碼:
package com.example.lenovo.dianzandemo; import android.content.Context; import android.graphics.drawable.ColorDrawable; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.PopupWindow; import android.widget.TextView; import android.widget.Toast; public class MainActivity extends AppCompatActivity { private RecyclerView recyclerView; private int[] pics; private String[] descs; public Context mContext; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mContext = getApplicationContext(); pics = new int[]{R.mipmap.test1, R.mipmap.test5, R.mipmap.test6, R.mipmap.test7, R.mipmap.test8, R.mipmap.test9, R.mipmap.test10, R.mipmap.test12, R.mipmap.test13, R.mipmap.test14, R.mipmap.test1, R.mipmap.test5, R.mipmap.test6, R.mipmap.test7, R.mipmap.test8, R.mipmap.test9, R.mipmap.test10, R.mipmap.test12, R.mipmap.test13, R.mipmap.test14}; descs = new String[]{ "詩(shī)人承陳隋風(fēng)流,浮靡相矜。", "古今詩(shī)人眾矣,而杜子美為首,豈非以其流落饑寒,終身不用,而一飯未嘗忘君也歟?", "老杜詩(shī),凡一篇皆工拙相半,古人文章類如此。", "王介甫只知巧語(yǔ)之為詩(shī),而不知拙語(yǔ)亦詩(shī)也;山谷只知奇語(yǔ)之為詩(shī),而不知常語(yǔ)亦詩(shī)也", "子美詩(shī)奄有古今。學(xué)者能識(shí)國(guó)風(fēng)、騷人之旨,然后知子美用意處", "或問(wèn)王荊公云:編四家詩(shī),以杜甫為第一,李白為第四,豈白之才格詞致不逮甫也?", "山谷云,老杜作詩(shī),退之作文,無(wú)一字無(wú)來(lái)處,蓋后人讀書少,故謂韓、杜自作此語(yǔ)耳。", "觀杜者不唯見(jiàn)其律,而有見(jiàn)其騷者焉;不唯見(jiàn)其騷,而有見(jiàn)其雅者焉", "盛唐一味秀麗雄渾。杜則精粗、巨細(xì)、巧拙、新陳、險(xiǎn)易、淺深、濃淡、肥瘦靡不畢具", "大概杜有三難:極盛難繼,首創(chuàng)難工,遘衰難挽", "詩(shī)人承陳隋風(fēng)流,浮靡相矜。", "古今詩(shī)人眾矣,而杜子美為首,豈非以其流落饑寒,終身不用,而一飯未嘗忘君也歟?", "老杜詩(shī),凡一篇皆工拙相半,古人文章類如此。", "王介甫只知巧語(yǔ)之為詩(shī),而不知拙語(yǔ)亦詩(shī)也;山谷只知奇語(yǔ)之為詩(shī),而不知常語(yǔ)亦詩(shī)也", "子美詩(shī)奄有古今。學(xué)者能識(shí)國(guó)風(fēng)、騷人之旨,然后知子美用意處", "或問(wèn)王荊公云:編四家詩(shī),以杜甫為第一,李白為第四,豈白之才格詞致不逮甫也?", "山谷云,老杜作詩(shī),退之作文,無(wú)一字無(wú)來(lái)處,蓋后人讀書少,故謂韓、杜自作此語(yǔ)耳。", "觀杜者不唯見(jiàn)其律,而有見(jiàn)其騷者焉;不唯見(jiàn)其騷,而有見(jiàn)其雅者焉", "盛唐一味秀麗雄渾。杜則精粗、巨細(xì)、巧拙、新陳、險(xiǎn)易、淺深、濃淡、肥瘦靡不畢具", "大概杜有三難:極盛難繼,首創(chuàng)難工,遘衰難挽" }; initView(); } private void initView() { recyclerView = (RecyclerView) findViewById(R.id.recycler_view); recyclerView.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false)); RecyclerAdapter recyclerAdapter = new RecyclerAdapter(pics, descs, mContext); recyclerView.setAdapter(recyclerAdapter); } } class RecyclerAdapter extends RecyclerView.Adapter<MyViewHolder> { private Context mContext; private String[] descs; private int[] pics; private PopupWindow mPop; public RecyclerAdapter(int[] pics, String[] descs, Context context) { this.pics = pics; this.descs = descs; this.mContext = context; } @Override public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = View.inflate(parent.getContext(), R.layout.item_layout, null); MyViewHolder viewHolder = new MyViewHolder(view); return viewHolder; } @Override public void onBindViewHolder(final MyViewHolder holder, final int position) { holder.desc.setText(descs[position]); holder.icon.setImageResource(pics[position]); holder.zan.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // Toast.makeText(mContext, position + "被點(diǎn)擊了", Toast.LENGTH_SHORT).show(); int zanWidth = holder.zan.getWidth(); int zanHeight = holder.zan.getHeight(); View contentView = LayoutInflater.from(mContext).inflate(R.layout.pop_layout, null); TextView popZan = (TextView) contentView.findViewById(R.id.pop_zan); TextView popPinlun = (TextView) contentView.findViewById(R.id.pop_pinlun); popZan.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(mContext, "點(diǎn)贊", Toast.LENGTH_SHORT).show(); } }); popPinlun.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(mContext, "評(píng)論", Toast.LENGTH_SHORT).show(); } }); if (mPop == null) { //優(yōu)化:當(dāng)popwindow為空的時(shí)候才創(chuàng)建,不為空,直接復(fù)用 int width = zanWidth * 5; //設(shè)置PopupWindow的寬 int height = zanHeight; //設(shè)置PopupWindow的高 boolean focusable = true; //設(shè)置PopupWindow可獲取焦點(diǎn) mPop = new PopupWindow(contentView, width, height, focusable); //為PopupWindow設(shè)置背景,獲取焦點(diǎn)才能生效(谷歌官方要求) mPop.setBackgroundDrawable(new ColorDrawable()); } View anchor = holder.zan; //指定PopupWindow在哪個(gè)控件下面顯示 int xoff = -zanWidth;//指定PopupWindow在x軸方向上的偏移量 int yoff = -zanHeight;//指定PopupWindow在Y軸方向上的偏移量 mPop.showAsDropDown(anchor, xoff, yoff); } }); } @Override public int getItemCount() { return pics.length; } } class MyViewHolder extends RecyclerView.ViewHolder { public TextView desc; public ImageView icon; public ImageView zan; public MyViewHolder(View itemView) { super(itemView); desc = (TextView) itemView.findViewById(R.id.desc); icon = (ImageView) itemView.findViewById(R.id.icon); zan = (ImageView) itemView.findViewById(R.id.zan); } }
具體的彈窗位置和點(diǎn)贊按鈕,評(píng)論按鈕實(shí)現(xiàn)效果只用了吐司彈出,可以加自己的業(yè)務(wù)邏輯進(jìn)去。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
詳解如何實(shí)現(xiàn)一個(gè)Kotlin函數(shù)類型
這篇文章主要為大家詳細(xì)介紹了如何實(shí)現(xiàn)一個(gè)Kotlin函數(shù)類型,文中的實(shí)現(xiàn)方法講解詳細(xì),具有一定的借鑒價(jià)值,需要的小伙伴可以跟隨小編一起學(xué)習(xí)一下2022-10-10Android開(kāi)發(fā)之項(xiàng)目模塊化實(shí)踐教程
這篇文章主要給大家介紹了關(guān)于Android開(kāi)發(fā)之項(xiàng)目模塊化的相關(guān)資料,文中通過(guò)示例代碼給各位Android開(kāi)發(fā)者們介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)下吧。2017-09-09Android工具欄頂出轉(zhuǎn)場(chǎng)動(dòng)畫的實(shí)現(xiàn)方法實(shí)例
這篇文章主要給大家介紹了關(guān)于Android工具欄頂出轉(zhuǎn)場(chǎng)動(dòng)畫的實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)各位Android開(kāi)發(fā)者們具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2018-09-09Android計(jì)時(shí)器的三種實(shí)現(xiàn)方式(Chronometer、Timer、handler)
這篇文章主要介紹了Android計(jì)時(shí)器的三種實(shí)現(xiàn)方式,Chronometer、Timer、handler計(jì)時(shí)器的實(shí)現(xiàn)方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-11-11android基于ListView和CheckBox實(shí)現(xiàn)多選和全選記錄的功能
本篇文章主要介紹了android基于ListView和CheckBox實(shí)現(xiàn)多選和全選記錄的功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。2016-11-11Android Studio 運(yùn)行按鈕灰色的完美解決方法
今天新建項(xiàng)目的時(shí)候突然發(fā)現(xiàn)編譯后運(yùn)行按鈕為灰色,今天小編給大家?guī)?lái)了Android Studio 運(yùn)行按鈕灰色的完美解決方法,非常不錯(cuò),對(duì)大家的需要或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2020-10-10Android?常見(jiàn)獲取設(shè)備標(biāo)識(shí)方法總結(jié)
隨著Android系統(tǒng)版本更新,Google對(duì)用戶隱私保護(hù)增強(qiáng),限制獲取設(shè)備標(biāo)識(shí),文中測(cè)試DeviceID、ANDROID_ID、Serial、MAC地址等方法在不同API級(jí)別的表現(xiàn),感興趣的朋友跟隨小編一起看看吧2024-09-09android實(shí)現(xiàn)多線程下載文件(支持暫停、取消、斷點(diǎn)續(xù)傳)
本篇文章主要介紹了androids實(shí)現(xiàn)多線程下載文件,主要包括暫停、取消、斷點(diǎn)續(xù)傳等功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。2017-02-02