最近在做朋友圈的項目,所以寫一個Android仿朋友圈點贊和評論功能Demo,代碼就是簡單實現(xiàn)了一下功能,沒有做優(yōu)化,湊合看。
圖文排列是用的RecyclerView實現(xiàn)的,彈窗效果是用的自定義的PopupWindow,點贊應該是在本地請求數(shù)據(jù)庫,設置一個flag,獲取當前用戶的id后,帶著id向服務器post一個flag,評論就比較簡單了,也是獲取當前朋友id(或者昵稱),帶著內(nèi)容,向服務器post
貼代碼:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
|
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[]{ "詩人承陳隋風流,浮靡相矜。" , "古今詩人眾矣,而杜子美為首,豈非以其流落饑寒,終身不用,而一飯未嘗忘君也歟?" , "老杜詩,凡一篇皆工拙相半,古人文章類如此。" , "王介甫只知巧語之為詩,而不知拙語亦詩也;山谷只知奇語之為詩,而不知常語亦詩也" , "子美詩奄有古今。學者能識國風、騷人之旨,然后知子美用意處" , "或問王荊公云:編四家詩,以杜甫為第一,李白為第四,豈白之才格詞致不逮甫也?" , "山谷云,老杜作詩,退之作文,無一字無來處,蓋后人讀書少,故謂韓、杜自作此語耳。" , "觀杜者不唯見其律,而有見其騷者焉;不唯見其騷,而有見其雅者焉" , "盛唐一味秀麗雄渾。杜則精粗、巨細、巧拙、新陳、險易、淺深、濃淡、肥瘦靡不畢具" , "大概杜有三難:極盛難繼,首創(chuàng)難工,遘衰難挽" , "詩人承陳隋風流,浮靡相矜。" , "古今詩人眾矣,而杜子美為首,豈非以其流落饑寒,終身不用,而一飯未嘗忘君也歟?" , "老杜詩,凡一篇皆工拙相半,古人文章類如此。" , "王介甫只知巧語之為詩,而不知拙語亦詩也;山谷只知奇語之為詩,而不知常語亦詩也" , "子美詩奄有古今。學者能識國風、騷人之旨,然后知子美用意處" , "或問王荊公云:編四家詩,以杜甫為第一,李白為第四,豈白之才格詞致不逮甫也?" , "山谷云,老杜作詩,退之作文,無一字無來處,蓋后人讀書少,故謂韓、杜自作此語耳。" , "觀杜者不唯見其律,而有見其騷者焉;不唯見其騷,而有見其雅者焉" , "盛唐一味秀麗雄渾。杜則精粗、巨細、巧拙、新陳、險易、淺深、濃淡、肥瘦靡不畢具" , "大概杜有三難:極盛難繼,首創(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 + "被點擊了", 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, "點贊" , Toast.LENGTH_SHORT).show(); } }); popPinlun.setOnClickListener( new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(mContext, "評論" , Toast.LENGTH_SHORT).show(); } }); if (mPop == null ) { //優(yōu)化:當popwindow為空的時候才創(chuàng)建,不為空,直接復用 int width = zanWidth * 5 ; //設置PopupWindow的寬 int height = zanHeight; //設置PopupWindow的高 boolean focusable = true ; //設置PopupWindow可獲取焦點 mPop = new PopupWindow(contentView, width, height, focusable); //為PopupWindow設置背景,獲取焦點才能生效(谷歌官方要求) mPop.setBackgroundDrawable( new ColorDrawable()); } View anchor = holder.zan; //指定PopupWindow在哪個控件下面顯示 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); } } |
具體的彈窗位置和點贊按鈕,評論按鈕實現(xiàn)效果只用了吐司彈出,可以加自己的業(yè)務邏輯進去。
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。
原文鏈接:https://blog.csdn.net/vxwjf/article/details/51907957