├── .gitignore ├── .idea ├── .name ├── compiler.xml ├── copyright │ └── profiles_settings.xml ├── encodings.xml ├── gradle.xml ├── libraries │ ├── animated_vector_drawable_23_2_1.xml │ ├── appcompat_v7_23_2_1.xml │ ├── design_23_2_1.xml │ ├── recyclerview_v7_23_2_1.xml │ ├── support_annotations_23_2_1.xml │ ├── support_v4_23_2_1.xml │ └── support_vector_drawable_23_2_1.xml ├── misc.xml ├── modules.xml ├── runConfigurations.xml ├── vcs.xml └── workspace.xml ├── README.md ├── app ├── .gitignore ├── build.gradle ├── proguard-rules.pro └── src │ ├── androidTest │ └── java │ │ └── com │ │ └── ithaha │ │ └── floorview │ │ └── ApplicationTest.java │ └── main │ ├── AndroidManifest.xml │ ├── java │ └── com │ │ └── ithaha │ │ └── floorview │ │ ├── Comment.java │ │ ├── Commentable.java │ │ ├── FloorView.java │ │ ├── MainActivity.java │ │ ├── SubComments.java │ │ └── SubFloorFactory.java │ └── res │ ├── drawable │ ├── bg_comment.xml │ ├── bg_floor.9.png │ └── ic_comment_down_arrow.png │ ├── layout │ ├── activity_main.xml │ └── item_comment_floor.xml │ ├── menu │ └── menu_main.xml │ ├── mipmap-hdpi │ └── ic_launcher.png │ ├── mipmap-mdpi │ └── ic_launcher.png │ ├── mipmap-xhdpi │ └── ic_launcher.png │ ├── mipmap-xxhdpi │ └── ic_launcher.png │ ├── mipmap-xxxhdpi │ └── ic_launcher.png │ ├── values-v21 │ └── styles.xml │ ├── values-w820dp │ └── dimens.xml │ └── values │ ├── colors.xml │ ├── dimens.xml │ ├── strings.xml │ └── styles.xml ├── build.gradle ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat └── settings.gradle /.gitignore: -------------------------------------------------------------------------------- 1 | # Built application files 2 | *.apk 3 | *.ap_ 4 | 5 | # Files for the Dalvik VM 6 | *.dex 7 | 8 | # Java class files 9 | *.class 10 | 11 | # Generated files 12 | bin/ 13 | gen/ 14 | out/ 15 | 16 | # Gradle files 17 | .gradle/ 18 | build/ 19 | 20 | # Local configuration file (sdk path, etc) 21 | local.properties 22 | 23 | # Proguard folder generated by Eclipse 24 | proguard/ 25 | 26 | # Log Files 27 | *.log 28 | 29 | # Android Studio Navigation editor temp files 30 | .navigation/ 31 | 32 | # Android Studio captures folder 33 | captures/ 34 | 35 | # Intellij 36 | *.iml 37 | 38 | # Keystore files 39 | *.jks -------------------------------------------------------------------------------- /.idea/.name: -------------------------------------------------------------------------------- 1 | FloorView -------------------------------------------------------------------------------- /.idea/compiler.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /.idea/copyright/profiles_settings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /.idea/encodings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /.idea/gradle.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 23 | 24 | -------------------------------------------------------------------------------- /.idea/libraries/animated_vector_drawable_23_2_1.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /.idea/libraries/appcompat_v7_23_2_1.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /.idea/libraries/design_23_2_1.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /.idea/libraries/recyclerview_v7_23_2_1.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /.idea/libraries/support_annotations_23_2_1.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /.idea/libraries/support_v4_23_2_1.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /.idea/libraries/support_vector_drawable_23_2_1.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 19 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 46 | 47 | 48 | 49 | 50 | 1.8 51 | 52 | 57 | 58 | 59 | 60 | 61 | 62 | -------------------------------------------------------------------------------- /.idea/modules.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /.idea/runConfigurations.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 11 | 12 | -------------------------------------------------------------------------------- /.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /.idea/workspace.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 30 | 31 | 32 | 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 | 138 | 139 | 163 | 1286 | 1291 | 1606 | 1609 | 1610 | 1611 | 1623 | 1624 | 1625 | 1630 | 1631 | 1632 | 1633 | 1634 | 1635 | 1636 | 1637 | 1638 | 1639 | 1640 | 1641 | 1642 | 1643 | 1644 | 1645 | 1646 | 1647 | 1648 | 1649 | 1650 | 1651 | 1652 | 1653 | 1654 | 1655 | 1656 | 1657 | 1658 | 1659 | 1660 | 1661 | 1662 | 1665 | 1666 | 1667 | 1668 | 1669 | 1670 | 1671 | 1672 | 1675 | 1676 | 1677 | 1678 | 1681 | 1682 | 1685 | 1686 | 1687 | 1688 | 1691 | 1692 | 1695 | 1696 | 1699 | 1700 | 1701 | 1702 | 1705 | 1706 | 1709 | 1710 | 1713 | 1714 | 1717 | 1718 | 1721 | 1722 | 1723 | 1724 | 1727 | 1728 | 1731 | 1732 | 1735 | 1736 | 1739 | 1740 | 1743 | 1744 | 1747 | 1748 | 1749 | 1750 | 1753 | 1754 | 1757 | 1758 | 1761 | 1762 | 1765 | 1766 | 1769 | 1770 | 1773 | 1774 | 1777 | 1778 | 1779 | 1780 | 1783 | 1784 | 1787 | 1788 | 1791 | 1792 | 1795 | 1796 | 1799 | 1800 | 1803 | 1804 | 1807 | 1808 | 1809 | 1810 | 1813 | 1814 | 1817 | 1818 | 1821 | 1822 | 1825 | 1826 | 1827 | 1828 | 1829 | 1830 | 1831 | 1832 | 1833 | 1834 | 1835 | 1836 | 1837 | 1838 | 1839 | 1840 | 1841 | 1842 | 1843 | 1844 | 1845 | 1846 | 1847 | 1876 | 1877 | 1878 | 1906 | 1907 | 1908 | 1921 | 1922 | 1923 | 1924 | 1938 | 1939 | 1940 | 1941 | 1944 | 1945 | 1946 | 1947 | 1948 | 1962 | 1963 | 1964 | 1965 | 1966 | 1967 | 1968 | 1969 | 1970 | 1971 | 1972 | 1973 | 1987 | 1988 | 1995 | 1996 | 1997 | 1998 | 2016 | 2023 | 2024 | 2025 | 2026 | 2044 | 2051 | 2052 | 2053 | 2082 | 2083 | 2084 | 2085 | 2086 | 2094 | 2095 | 2097 | 2098 | 2099 | 2100 | 2101 | 2102 | 2103 | 2104 | 2105 | 1459320292785 2106 | 2109 | 2110 | 2111 | 2112 | 2113 | 2114 | 2115 | 2116 | 2117 | 2118 | 2119 | 2120 | 2121 | 2122 | 2123 | 2124 | 2125 | 2126 | 2127 | 2128 | 2129 | 2130 | 2131 | 2132 | 2133 | 2134 | 2135 | 2136 | 2137 | 2138 | 2139 | 2140 | 2141 | 2144 | 2147 | 2148 | 2149 | 2151 | 2152 | 2153 | 2154 | 2155 | 2156 | 2157 | 2158 | 2159 | 2160 | 2161 | 2162 | 2163 | 2164 | 2165 | 2166 | 2167 | 2168 | 2169 | 2170 | 2171 | 2172 | 2173 | 2174 | 2175 | 2176 | 2177 | 2178 | 2179 | 2180 | 2181 | 2182 | 2183 | 2184 | 2185 | 2186 | 2187 | 2188 | 2189 | 2190 | 2191 | 2192 | 2193 | 2194 | 2195 | 2196 | 2197 | 2198 | 2199 | 2200 | 2201 | 2202 | 2203 | 2204 | 2205 | 2206 | 2207 | 2208 | 2209 | 2210 | 2211 | 2212 | 2213 | 2214 | 2215 | 2216 | 2217 | 2218 | 2219 | 2220 | 2221 | 2222 | 2223 | 2224 | 2225 | 2226 | 2227 | 2228 | 2229 | 2230 | 2231 | 2232 | 2233 | 2234 | 2235 | 2236 | 2237 | 2238 | 2239 | 2240 | 2241 | 2242 | 2243 | 2244 | 2245 | 2246 | 2247 | 2248 | 2249 | 2250 | 2251 | 2252 | 2253 | 2254 | 2255 | 2256 | 2257 | 2258 | 2259 | 2260 | 2261 | 2262 | 2263 | 2264 | 2265 | 2266 | 2267 | 2268 | 2269 | 2270 | 2271 | 2272 | 2273 | 2274 | 2275 | 2276 | 2277 | 2278 | 2279 | 2280 | 2281 | 2282 | 2283 | 2284 | 2285 | 2286 | 2287 | 2288 | 2289 | 2290 | 2291 | 2292 | 2293 | 2294 | 2295 | 2296 | 2297 | 2298 | 2299 | 2300 | 2301 | 2302 | 2303 | 2304 | 2305 | 2306 | 2307 | 2308 | 2309 | 2310 | 2311 | 2312 | 2313 | 2314 | 2315 | 2316 | 2317 | 2318 | 2319 | 2320 | 2321 | 2322 | 2323 | 2324 | 2325 | 2326 | 2327 | 2328 | 2329 | 2330 | 2331 | 2332 | 2333 | 2334 | 2335 | 2336 | 2337 | 2338 | 2339 | 2340 | 2341 | 2342 | 2343 | 2344 | 2345 | 2346 | 2347 | 2348 | 2349 | 2350 | 2351 | 2352 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # 仿网易新闻的评论楼层View 2 | 3 | **网易的楼层效果图** 4 | 5 | 6 | ![网易楼层的效果](http://img.blog.csdn.net/20160331094321580) 7 | 8 | **该View的效果图** 9 | 10 | ![自定义的效果](http://img.blog.csdn.net/20160331094541127) 11 | 12 | ![自定义的效果](http://img.blog.csdn.net/20160331094556456) 13 | 14 | **具体讲解** 15 | 16 | [查看详细](http://blog.csdn.net/u013435893/article/details/51023519) 17 | -------------------------------------------------------------------------------- /app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /app/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.application' 2 | 3 | android { 4 | compileSdkVersion 23 5 | buildToolsVersion "23.0.2" 6 | 7 | defaultConfig { 8 | applicationId "com.ithaha.floorview" 9 | minSdkVersion 15 10 | targetSdkVersion 23 11 | versionCode 1 12 | versionName "1.0" 13 | } 14 | buildTypes { 15 | release { 16 | minifyEnabled false 17 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 18 | } 19 | } 20 | } 21 | 22 | dependencies { 23 | compile fileTree(dir: 'libs', include: ['*.jar']) 24 | testCompile 'junit:junit:4.12' 25 | compile 'com.android.support:appcompat-v7:23.2.1' 26 | compile 'com.android.support:design:23.2.1' 27 | } 28 | -------------------------------------------------------------------------------- /app/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # By default, the flags in this file are appended to flags specified 3 | # in E:\adt-bundle-windows-x86_64-20140702\adt-bundle-windows-x86_64-20140702\sdk/tools/proguard/proguard-android.txt 4 | # You can edit the include path and order by changing the proguardFiles 5 | # directive in build.gradle. 6 | # 7 | # For more details, see 8 | # http://developer.android.com/guide/developing/tools/proguard.html 9 | 10 | # Add any project specific keep options here: 11 | 12 | # If your project uses WebView with JS, uncomment the following 13 | # and specify the fully qualified class name to the JavaScript interface 14 | # class: 15 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 16 | # public *; 17 | #} 18 | -------------------------------------------------------------------------------- /app/src/androidTest/java/com/ithaha/floorview/ApplicationTest.java: -------------------------------------------------------------------------------- 1 | package com.ithaha.floorview; 2 | 3 | import android.app.Application; 4 | import android.test.ApplicationTestCase; 5 | 6 | /** 7 | * Testing Fundamentals 8 | */ 9 | public class ApplicationTest extends ApplicationTestCase { 10 | public ApplicationTest() { 11 | super(Application.class); 12 | } 13 | } -------------------------------------------------------------------------------- /app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 11 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /app/src/main/java/com/ithaha/floorview/Comment.java: -------------------------------------------------------------------------------- 1 | package com.ithaha.floorview; 2 | 3 | /** 4 | * @author: Long 5 | * @Date: 2016/3/30 14:51 6 | * 评论 7 | */ 8 | public class Comment implements Commentable, Comparable { 9 | 10 | private String name; // 评论者 11 | 12 | private String content; // 评论的内容 13 | 14 | private int floorNum = 1; // 楼层 15 | 16 | public Comment(String name, String content, int floorNum) { 17 | this.name = name; 18 | this.content = content; 19 | this.floorNum = floorNum; 20 | } 21 | 22 | public String getName() { 23 | return name; 24 | } 25 | 26 | public void setName(String name) { 27 | this.name = name; 28 | } 29 | 30 | public String getContent() { 31 | return content; 32 | } 33 | 34 | public void setContent(String content) { 35 | this.content = content; 36 | } 37 | 38 | public int getFloorNum() { 39 | return floorNum; 40 | } 41 | 42 | public void setFloorNum(int floorNum) { 43 | this.floorNum = floorNum; 44 | } 45 | 46 | @Override 47 | public int getCommentFloorNum() { 48 | return getFloorNum(); 49 | } 50 | 51 | @Override 52 | public String getCommentContent() { 53 | return getContent(); 54 | } 55 | 56 | @Override 57 | public String getAuthorName() { 58 | return getName(); 59 | } 60 | 61 | @Override 62 | public int compareTo(Object another) { 63 | Comment anotherComment = (Comment) another; 64 | return getFloorNum() - anotherComment.getFloorNum(); 65 | } 66 | } 67 | -------------------------------------------------------------------------------- /app/src/main/java/com/ithaha/floorview/Commentable.java: -------------------------------------------------------------------------------- 1 | package com.ithaha.floorview; 2 | 3 | /** 4 | * @author: Long 5 | * @Date: 2016/3/30 15:40 6 | * 每个评论所需要的 7 | */ 8 | public interface Commentable { 9 | 10 | int getCommentFloorNum(); 11 | 12 | String getCommentContent(); 13 | 14 | String getAuthorName(); 15 | } 16 | -------------------------------------------------------------------------------- /app/src/main/java/com/ithaha/floorview/FloorView.java: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | */ 4 | package com.ithaha.floorview; 5 | 6 | import android.annotation.TargetApi; 7 | import android.content.Context; 8 | import android.graphics.Canvas; 9 | import android.graphics.drawable.Drawable; 10 | import android.os.Build; 11 | import android.util.AttributeSet; 12 | import android.view.Gravity; 13 | import android.view.View; 14 | import android.widget.LinearLayout; 15 | import android.widget.TextView; 16 | 17 | import java.util.Iterator; 18 | 19 | /** 20 | * @author: Long 21 | * @Date: 2016/3/30 15:38 22 | * 完成楼层的内容填充、分割线绘制和布局添加 23 | */ 24 | @TargetApi(Build.VERSION_CODES.HONEYCOMB) 25 | public class FloorView extends LinearLayout { 26 | 27 | private int density; 28 | private Drawable drawer; 29 | private SubComments datas; // 评论的数据 30 | private SubFloorFactory factory; 31 | 32 | public FloorView(Context context) { 33 | super(context); 34 | init(context); 35 | } 36 | 37 | public FloorView(Context context, AttributeSet attrs) { 38 | super(context, attrs); 39 | init(context); 40 | } 41 | 42 | public FloorView(Context context, AttributeSet attrs, int defStyle) { 43 | super(context, attrs, defStyle); 44 | init(context); 45 | } 46 | 47 | public void setBoundDrawer(Drawable drawable) { 48 | drawer = drawable; 49 | } 50 | 51 | public void setComments(SubComments cmts) { 52 | datas = cmts; 53 | } 54 | 55 | public void setFactory(SubFloorFactory fac) { 56 | factory = fac; 57 | } 58 | 59 | public int getFloorNum() { 60 | return getChildCount(); 61 | } 62 | 63 | private void init(Context context) { 64 | // 设置为垂直方向 65 | this.setOrientation(LinearLayout.VERTICAL); 66 | // 获取手机屏幕相对密度(常见于 dp和px转换的公式里面) 67 | density = (int) (3.0F * context.getResources().getDisplayMetrics().density); 68 | } 69 | 70 | public void init() { 71 | // 如果没有数据直接返回 72 | if (null == datas.iterator()) 73 | return; 74 | // 如果评论回复数小于7个,则直接显示完 75 | if (datas.getFloorNum() < 7) { 76 | for (Iterator iterator = datas.iterator(); iterator 77 | .hasNext(); ) { 78 | View view = factory.buildSubFloor(iterator.next(), this); 79 | addView(view); 80 | } 81 | } else { 82 | // 如果评论回复数很多,则显示一个“显示隐藏楼层”的按钮 83 | View view; 84 | view = factory.buildSubFloor(datas.get(0), this); 85 | addView(view); 86 | view = factory.buildSubFloor(datas.get(1), this); 87 | addView(view); 88 | // 可以点击显示更多的楼层 89 | view = factory.buildSubHideFloor(datas.get(2), this); 90 | view.setOnClickListener(new OnClickListener() { 91 | 92 | @Override 93 | public void onClick(View v) { 94 | TextView hide_text = (TextView) v 95 | .findViewById(R.id.hide_text); 96 | hide_text.setCompoundDrawablesWithIntrinsicBounds(0, 0, 0, 97 | 0); 98 | v.findViewById(R.id.hide_pb).setVisibility(View.VISIBLE); 99 | removeAllViews(); 100 | for (Iterator iterator = datas.iterator(); iterator 101 | .hasNext(); ) { 102 | View view = factory.buildSubFloor(iterator.next(), 103 | FloorView.this); 104 | addView(view); 105 | } 106 | reLayoutChildren(); 107 | } 108 | }); 109 | addView(view); 110 | view = factory.buildSubFloor(datas.get(datas.size() - 1), this); 111 | addView(view); 112 | } 113 | 114 | reLayoutChildren(); 115 | } 116 | 117 | /** 118 | * 重新布局子View的位置,呈现出楼层的效果 119 | */ 120 | public void reLayoutChildren() { 121 | int count = getChildCount(); 122 | for (int i = 0; i < count; i++) { 123 | View view = getChildAt(i); 124 | LayoutParams layout = new LayoutParams(LayoutParams.MATCH_PARENT, 125 | LayoutParams.WRAP_CONTENT); 126 | layout.gravity = Gravity.TOP | Gravity.CENTER_HORIZONTAL; 127 | int margin = Math.min((count - i - 1), 4) * density; 128 | layout.leftMargin = margin; 129 | layout.rightMargin = margin; 130 | if (i == count - 1) { 131 | layout.topMargin = 0; 132 | } else { 133 | layout.topMargin = Math.min((count - i), 4) * density; 134 | } 135 | view.setLayoutParams(layout); 136 | } 137 | } 138 | 139 | /** 140 | * 分发给子组件进行绘制,给每个子View画背景 141 | * @param canvas 142 | */ 143 | @Override 144 | protected void dispatchDraw(Canvas canvas) { 145 | int i = getChildCount(); 146 | if (null != drawer && i > 0) { 147 | for (int j = i - 1; j >= 0; j--) { 148 | View view = getChildAt(j); 149 | // drawable将在被绘制在canvas的哪个矩形区域内。 150 | drawer.setBounds(view.getLeft(), view.getLeft(), 151 | view.getRight(), view.getBottom()); 152 | drawer.draw(canvas); 153 | } 154 | } 155 | super.dispatchDraw(canvas); 156 | } 157 | 158 | @Override 159 | protected void onLayout(boolean changed, int l, int t, int r, int b) { 160 | super.onLayout(changed, l, t, r, b); 161 | } 162 | 163 | @Override 164 | protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 165 | if (this.getChildCount() <= 0) { 166 | setMeasuredDimension(0, 0); 167 | return; 168 | } 169 | super.onMeasure(widthMeasureSpec, heightMeasureSpec); 170 | } 171 | } 172 | -------------------------------------------------------------------------------- /app/src/main/java/com/ithaha/floorview/MainActivity.java: -------------------------------------------------------------------------------- 1 | package com.ithaha.floorview; 2 | 3 | import android.os.Bundle; 4 | import android.support.v7.app.AppCompatActivity; 5 | 6 | import java.util.ArrayList; 7 | import java.util.Collections; 8 | 9 | public class MainActivity extends AppCompatActivity { 10 | 11 | @Override 12 | protected void onCreate(Bundle savedInstanceState) { 13 | super.onCreate(savedInstanceState); 14 | setContentView(R.layout.activity_main); 15 | 16 | FloorView floorsParent = (FloorView) findViewById(R.id.floors_parent); 17 | 18 | ArrayList commentArrayList = new ArrayList<>(); 19 | commentArrayList.add(new Comment("heihei", "嘿嘿嘿,我是评论2", 2)); 20 | commentArrayList.add(new Comment("haha", "哈哈哈,我是评论1", 1)); 21 | commentArrayList.add(new Comment("wowo", "喔喔喔,我是评论3", 3)); 22 | commentArrayList.add(new Comment("wowo", "喔喔喔,我是评论4", 4)); 23 | commentArrayList.add(new Comment("wowo", "喔喔喔,我是评论5", 5)); 24 | commentArrayList.add(new Comment("wowo", "喔喔喔,我是评论6", 6)); 25 | commentArrayList.add(new Comment("wowo", "喔喔喔,我是评论7", 7)); 26 | commentArrayList.add(new Comment("wowo", "喔喔喔,我是评论8", 8)); 27 | commentArrayList.add(new Comment("wowo", "喔喔喔,我是评论9", 9)); 28 | 29 | 30 | Collections.sort(commentArrayList); 31 | 32 | SubComments subComments = new SubComments(commentArrayList); 33 | floorsParent.setComments(subComments); 34 | floorsParent.setFactory(new SubFloorFactory()); 35 | floorsParent.setBoundDrawer(getResources().getDrawable(R.drawable.bg_comment)); 36 | floorsParent.init(); 37 | 38 | } 39 | 40 | 41 | } 42 | -------------------------------------------------------------------------------- /app/src/main/java/com/ithaha/floorview/SubComments.java: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | */ 4 | package com.ithaha.floorview; 5 | 6 | import java.util.ArrayList; 7 | import java.util.Iterator; 8 | import java.util.List; 9 | 10 | /** 11 | * @author: Long 12 | * @Date: 2016/3/30 15:39 13 | * 对评论的再次封装,每一个评论都对应一个SubComments对象,它里面封装个这个评论的所有楼层内容 14 | */ 15 | public class SubComments { 16 | 17 | private List list; 18 | 19 | public SubComments(List cmts) { 20 | if (cmts != null) { 21 | list = new ArrayList<>(cmts); 22 | } else { 23 | list = null; 24 | } 25 | } 26 | 27 | public int size() { 28 | return list == null ? 0 : list.size(); 29 | } 30 | 31 | public int getFloorNum() { 32 | return list.get(list.size() - 1).getCommentFloorNum(); 33 | } 34 | 35 | public Commentable get(int index) { 36 | return list.get(index); 37 | } 38 | 39 | public Iterator iterator() { 40 | return list == null ? null : list.iterator(); 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /app/src/main/java/com/ithaha/floorview/SubFloorFactory.java: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | */ 4 | package com.ithaha.floorview; 5 | 6 | import android.content.Context; 7 | import android.view.LayoutInflater; 8 | import android.view.View; 9 | import android.view.ViewGroup; 10 | import android.widget.RelativeLayout; 11 | import android.widget.TextView; 12 | 13 | /** 14 | * @author: Long 15 | * @Date: 2016/3/30 15:45 16 | * 用于根据不同类型产生正常评论View和隐藏楼层View,同时在产生过程中,完成了数据和View的适配 17 | */ 18 | public class SubFloorFactory { 19 | 20 | /** 21 | * 直接显示评论 22 | * @param cmt 23 | * @param group 24 | * @return 25 | */ 26 | public View buildSubFloor (Commentable cmt, ViewGroup group ) { 27 | // to retrieve a LayoutInflater for inflating layout resources in this context 28 | LayoutInflater inflater = (LayoutInflater) group.getContext ().getSystemService ( Context.LAYOUT_INFLATER_SERVICE ) ; 29 | // 加载布局文件 30 | View view = inflater.inflate ( R.layout.item_comment_floor, null ) ; 31 | RelativeLayout show = (RelativeLayout) view.findViewById ( R.id.show_sub_floor_content ) ; 32 | RelativeLayout hide = (RelativeLayout) view.findViewById ( R.id.hide_sub_floor_content ) ; 33 | show.setVisibility ( View.VISIBLE ) ; 34 | hide.setVisibility ( View.GONE ) ; 35 | TextView floorNum = (TextView) view.findViewById ( R.id.sub_floor_num ) ; 36 | TextView username = (TextView) view.findViewById ( R.id.sub_floor_username ) ; 37 | TextView content = (TextView) view.findViewById ( R.id.sub_floor_content ) ; 38 | floorNum.setText ( String.valueOf ( cmt.getCommentFloorNum() ) ) ; 39 | username.setText ( cmt.getAuthorName() ) ; 40 | content.setText ( cmt.getCommentContent()) ; 41 | return view ; 42 | } 43 | 44 | /** 45 | * 不显示评论,显示加载更多 46 | * @param cmt 47 | * @param group 48 | * @return 49 | */ 50 | public View buildSubHideFloor (Commentable cmt, ViewGroup group ) { 51 | LayoutInflater inflater = (LayoutInflater) group.getContext ().getSystemService ( Context.LAYOUT_INFLATER_SERVICE ) ; 52 | View view = inflater.inflate ( R.layout.item_comment_floor, null ) ; 53 | RelativeLayout show = (RelativeLayout) view.findViewById ( R.id.show_sub_floor_content ) ; 54 | RelativeLayout hide = (RelativeLayout) view.findViewById ( R.id.hide_sub_floor_content ) ; 55 | show.setVisibility ( View.GONE ) ; 56 | hide.setVisibility ( View.VISIBLE ) ; 57 | TextView hide_text = (TextView) view.findViewById ( R.id.hide_text ) ; 58 | hide_text.setCompoundDrawablesWithIntrinsicBounds ( R.drawable.ic_comment_down_arrow, 0, 0, 0 ) ; 59 | view.findViewById ( R.id.hide_pb ).setVisibility ( View.GONE ) ; 60 | return view ; 61 | } 62 | } 63 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/bg_comment.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/bg_floor.9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/whyalwaysmea/floorView/b0c10c0a79442cd4570787536c4c246f4cf027f9/app/src/main/res/drawable/bg_floor.9.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_comment_down_arrow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/whyalwaysmea/floorView/b0c10c0a79442cd4570787536c4c246f4cf027f9/app/src/main/res/drawable/ic_comment_down_arrow.png -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_main.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /app/src/main/res/layout/item_comment_floor.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 11 | 12 | 20 | 21 | 32 | 33 | 40 | 41 | 42 | 47 | 48 | 56 | 57 | 63 | 64 | 65 | -------------------------------------------------------------------------------- /app/src/main/res/menu/menu_main.xml: -------------------------------------------------------------------------------- 1 | 5 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/whyalwaysmea/floorView/b0c10c0a79442cd4570787536c4c246f4cf027f9/app/src/main/res/mipmap-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/whyalwaysmea/floorView/b0c10c0a79442cd4570787536c4c246f4cf027f9/app/src/main/res/mipmap-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/whyalwaysmea/floorView/b0c10c0a79442cd4570787536c4c246f4cf027f9/app/src/main/res/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/whyalwaysmea/floorView/b0c10c0a79442cd4570787536c4c246f4cf027f9/app/src/main/res/mipmap-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/whyalwaysmea/floorView/b0c10c0a79442cd4570787536c4c246f4cf027f9/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/values-v21/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/values-w820dp/dimens.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 64dp 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/values/colors.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | #3F51B5 4 | #303F9F 5 | #FF4081 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/values/dimens.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 16dp 4 | 16dp 5 | 16dp 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | FloorView 3 | Settings 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/values/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 10 | 14 |