Skip to content

Commit c935aad

Browse files
committed
显示收藏
1 parent eca1df6 commit c935aad

File tree

10 files changed

+220
-62
lines changed

10 files changed

+220
-62
lines changed

app/src/main/kotlin/com/rayfantasy/icode/ui/activity/AccountActivity.kt

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,32 @@
11
package com.rayfantasy.icode.ui.activity
22

3+
import android.graphics.drawable.ColorDrawable
34
import android.os.Bundle
45
import android.support.design.widget.FloatingActionButton
56
import android.support.design.widget.Snackbar
67
import android.support.v7.app.AppCompatActivity
78
import android.support.v7.widget.Toolbar
9+
import android.view.LayoutInflater
810
import android.view.Menu
911
import android.view.View
12+
import com.bumptech.glide.Glide
1013

1114
import com.rayfantasy.icode.R
15+
import com.rayfantasy.icode.extension.alpha
16+
import com.rayfantasy.icode.extension.loadPortrait
17+
import com.rayfantasy.icode.extension.shadowColor
18+
import com.rayfantasy.icode.postutil.PostUtil
19+
import com.rayfantasy.icode.postutil.bean.User
20+
import jp.wasabeef.glide.transformations.BlurTransformation
21+
import jp.wasabeef.glide.transformations.CropTransformation
22+
import kotlinx.android.synthetic.main.activity_account.*
23+
import org.jetbrains.anko.image
1224

1325
class AccountActivity :ActivityBase() {
26+
val glide by lazy { Glide.with(this) }
27+
val lf : LayoutInflater = LayoutInflater.from(this)
28+
lateinit var views : MutableList<View>
29+
var titles : List<String> = listOf("代码","回复")
1430

1531
override fun onCreate(savedInstanceState: Bundle?) {
1632
super.onCreate(savedInstanceState)
@@ -20,9 +36,23 @@ class AccountActivity :ActivityBase() {
2036
supportActionBar?.setDisplayHomeAsUpEnabled(true)
2137
val fab = findViewById(R.id.fab) as FloatingActionButton
2238
fab.setOnClickListener { view -> Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG).setAction("Action", null).show() }
39+
val username : String = PostUtil.user!!.username
40+
account_pic.loadPortrait(username)
41+
account_username.text = username
42+
val colorDrawable = ColorDrawable(username.hashCode().alpha(0xff).shadowColor())
43+
glide.load(PostUtil.getProfilePicUrl(username))
44+
.error(colorDrawable)
45+
.placeholder(colorDrawable)
46+
.bitmapTransform(CropTransformation(this, account_bg_pic.width, account_bg_pic.height),
47+
BlurTransformation(this, 15, 4))
48+
.into(account_bg_pic)
49+
50+
views.add(0,lf.inflate(R.layout.pager_code,null))
51+
views.add(1,lf.inflate(R.layout.pager_reply,null))
2352
}
2453

2554
override fun onCreateOptionsMenu(menu: Menu?): Boolean {
2655
return super.onCreateOptionsMenu(menu)
2756
}
57+
2858
}

app/src/main/kotlin/com/rayfantasy/icode/ui/activity/MainActivity.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -183,7 +183,7 @@ class MainActivity : ActivityBase() {
183183
R.id.nav_home -> replaceFragment(mainFragment)
184184
R.id.nav_about -> replaceFragment(aboutFragment)
185185
//R.id.nav_edit -> startActivity(Intent(this@MainActivity, WriteCodeActivity::class.java))
186-
// R.id.nav_favourite -> replaceFragment(favoriteFragment)
186+
R.id.nav_favo -> replaceFragment(favoriteFragment)
187187
R.id.nav_setting -> replaceFragment(settingFragment)
188188
R.id.nav_homepage -> OpenWeb()
189189
R.id.nav_update -> checkUpdate()

app/src/main/kotlin/com/rayfantasy/icode/ui/activity/UserActivity.kt

Lines changed: 40 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -2,20 +2,19 @@ package com.rayfantasy.icode.ui.activity
22

33
import android.databinding.DataBindingUtil
44
import android.os.Bundle
5-
import android.support.v7.widget.LinearLayoutManager
65
import android.view.Menu
76
import android.view.MenuItem
87
import com.android.volley.Request
98
import com.rayfantasy.icode.R
109
import com.rayfantasy.icode.databinding.ActivityUserBinding
10+
import com.rayfantasy.icode.extra.PreloadLinearLayoutManager
1111
import com.rayfantasy.icode.model.ICodeTheme
1212
import com.rayfantasy.icode.postutil.PostUtil
1313
import com.rayfantasy.icode.ui.adapter.UserListAdapter
1414
import kotlinx.android.synthetic.main.content_user.*
1515
import kotlinx.android.synthetic.main.nv_layout.*
1616
import org.jetbrains.anko.alert
1717
import org.jetbrains.anko.startActivity
18-
import org.jetbrains.anko.support.v4.onRefresh
1918
import java.util.*
2019

2120
class UserActivity : ActivityBase() {
@@ -30,12 +29,14 @@ class UserActivity : ActivityBase() {
3029
username = intent.getSerializableExtra("username").toString()
3130
title = username
3231
initRecyclerView()
33-
user_swipe.onRefresh { refresh() }
32+
// fab.setOnClickListener { view ->
33+
// Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG).setAction("Action", null).show()
34+
// }
3435

3536
}
3637

3738
private fun initRecyclerView() {
38-
user_recyclerview.layoutManager = LinearLayoutManager(this)
39+
user_recyclerview.layoutManager = PreloadLinearLayoutManager(this)
3940
adapter = UserListAdapter(this, username, ArrayList()) {}
4041
user_recyclerview.adapter = adapter
4142
refresh()
@@ -54,33 +55,21 @@ class UserActivity : ActivityBase() {
5455
if (isRefreshing)
5556
return
5657
isRefreshing = true
57-
val condition = "WHERE ${if (!isRefreshing && adapter.codeGoods.isNotEmpty()) "createat < ${adapter.codeGoods.last().createAt} AND " else ""}username=$username " +
58-
"ORDER BY createat DESC LIMIT 0,3"
5958
//按照username查找
60-
request = PostUtil.selectCodeGood(condition/*"WHERE username = '$username' ORDER BY updateat DESC"*/) {
59+
request = PostUtil.selectCodeGood("WHERE username = '$username' ORDER BY updateat DESC") {
6160
onSuccess {
6261
isRefreshing = false
63-
/* if (it.isEmpty()) {
62+
if (it.isEmpty()) {
6463
adapter.setFooterState(UserListAdapter.FOOTER_STATE_NO_MORE)
65-
}*/
66-
if (isRefreshing) {
67-
adapter.codeGoods.clear()
6864
}
69-
adapter.codeGoods.addAll(it)
70-
7165

7266
//重复利用原来的adapter,节省内存
73-
if (adapter != null) {
74-
if (it.isEmpty()) {
75-
/* adapter = UserListAdapter(this, username, it) {}
76-
user_recyclerview.adapter = adapter*/
77-
adapter.setFooterState(UserListAdapter.FOOTER_STATE_NO_MORE)
78-
} else {
79-
/* adapter.codeGoods = it
80-
adapter.notifyDataSetChanged()*/
81-
if (isRefreshing) adapter.notifyDataSetChanged()
82-
else adapter.notifyItemRangeChanged(adapter.itemCount - 1 - it.size, it.size)
83-
}
67+
if (adapter == null) {
68+
adapter = UserListAdapter(this@UserActivity, username, it) {}
69+
user_recyclerview.adapter = adapter
70+
} else {
71+
adapter.codeGoods = it
72+
adapter.notifyDataSetChanged()
8473
}
8574
}
8675
onFailed { throwable, rc ->
@@ -92,39 +81,39 @@ class UserActivity : ActivityBase() {
9281
}
9382

9483

95-
override fun onCreateOptionsMenu(menu: Menu?): Boolean {
96-
if (PostUtil.user?.username == username) {
97-
menuInflater.inflate(R.menu.user_menu, menu)
98-
return true
99-
}
100-
return super.onCreateOptionsMenu(menu)
84+
override fun onCreateOptionsMenu(menu: Menu?): Boolean {
85+
if (PostUtil.user?.username == username) {
86+
menuInflater.inflate(R.menu.user_menu, menu)
87+
return true
88+
}
89+
return super.onCreateOptionsMenu(menu)
10190

102-
}
91+
}
10392

104-
override fun onOptionsItemSelected(item: MenuItem): Boolean {
105-
val id = item.itemId
106-
when (id) {
107-
R.id.account_menu_out -> {
108-
alert(getString(R.string.exit_user_msg), getString(R.string.app_name)) {
109-
positiveButton(getString(R.string.ok_btn)) {
110-
PostUtil.logoutUser()
111-
nv_user_icon.setImageDrawable(resources.getDrawable(R.mipmap.ic_nv_user))
112-
nv_username.text = getText(R.string.not_Login)
93+
override fun onOptionsItemSelected(item: MenuItem): Boolean {
94+
val id = item.itemId
95+
when (id) {
96+
R.id.account_menu_out -> {
97+
alert(getString(R.string.exit_user_msg), getString(R.string.app_name)) {
98+
positiveButton(getString(R.string.ok_btn)) {
99+
PostUtil.logoutUser()
100+
nv_user_icon.setImageDrawable(resources.getDrawable(R.mipmap.ic_nv_user))
101+
nv_username.text = getText(R.string.not_Login)
113102

114-
finish()
103+
finish()
115104

116-
}
117-
negativeButton(getString(R.string.no_btn)) { }
118-
}.show()
105+
}
106+
negativeButton(getString(R.string.no_btn)) { }
107+
}.show()
119108

120-
return true
121-
}
122-
R.id.account_setAccount -> {
123-
startActivity<AccountSettingActivity>()
124-
return true
109+
return true
110+
}
111+
R.id.account_setAccount -> {
112+
startActivity<AccountSettingActivity>()
113+
return true
114+
}
125115
}
116+
return super.onOptionsItemSelected(item)
126117
}
127-
return super.onOptionsItemSelected(item)
128118
}
129-
}
130119

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package com.rayfantasy.icode.ui.adapter
2+
3+
import android.content.Context
4+
import android.support.v4.view.PagerAdapter
5+
import android.view.View
6+
7+
/**
8+
* Created by qweas on 2016/2/29.
9+
*/
10+
class AccountAdapter(val ctx : Context,var views : MutableList<View>) : PagerAdapter() {
11+
12+
override fun isViewFromObject(p0: View?, p1: Any?): Boolean = p0 == p1
13+
override fun getCount(): Int = views.size
14+
override fun destroyItem(container: View?, position: Int, `object`: Any?) {
15+
super.destroyItem(container, position, `object`)
16+
}
17+
18+
override fun instantiateItem(container: View?, position: Int): Any? {
19+
return super.instantiateItem(container, position)
20+
}
21+
}
Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,107 @@
11
package com.rayfantasy.icode.ui.fragment
22

33
import android.os.Bundle
4+
import android.support.v7.widget.LinearLayoutManager
5+
import android.view.LayoutInflater
46
import android.view.View
7+
import android.view.ViewGroup
8+
import com.android.volley.Request
9+
import com.raizlabs.android.dbflow.sql.language.SQLite
10+
import com.rayfantasy.icode.R
11+
import com.rayfantasy.icode.databinding.FragmentMainBinding
12+
import com.rayfantasy.icode.model.ICodeTheme
13+
import com.rayfantasy.icode.postutil.PostUtil
14+
import com.rayfantasy.icode.postutil.bean.CodeGood
15+
import com.rayfantasy.icode.postutil.bean.CodeGood_Table
16+
import com.rayfantasy.icode.postutil.bean.Favorite
17+
import com.rayfantasy.icode.postutil.bean.Favorite_Table
18+
import com.rayfantasy.icode.ui.adapter.CodeListAdapter
19+
import com.rayfantasy.icode.ui.adapter.LoadMoreAdapter
20+
import kotlinx.android.synthetic.main.fragment_favorite.*
21+
import kotlinx.android.synthetic.main.fragment_favorite.view.*
22+
import org.apache.commons.collections4.list.SetUniqueList
23+
import org.jetbrains.anko.support.v4.onRefresh
524

625
class FavoriteFragment : FragmentBase() {
26+
companion object {
27+
const val LOAD_ONCE = 10
28+
}
29+
private lateinit var adapter: CodeListAdapter
30+
private val isRefreshing: Boolean
31+
get() = request != null
32+
private var request: Request<*>? = null
733
override fun onViewCreated(view: View?, savedInstanceState: Bundle?) {
834
super.onViewCreated(view, savedInstanceState)
35+
view?.favo_swipe?.onRefresh { loadCodeGoods(true) }
36+
initRecyclerView()
37+
loadCodeGoods(true)
38+
39+
}
40+
41+
override fun onCreateView(inflater: LayoutInflater?, container: ViewGroup?, savedInstanceState: Bundle?): View? {
42+
return inflater?.inflate(R.layout.fragment_favorite,container,false)
43+
}
944

45+
private fun initRecyclerView() {
46+
val layoutManager = LinearLayoutManager(activity)
47+
view.favorite_recycler_view.layoutManager = layoutManager
48+
adapter = CodeListAdapter(activity, SetUniqueList.setUniqueList(getCacheData())) { loadCodeGoods(false) }
49+
view.favorite_recycler_view.adapter = adapter
1050
}
51+
private fun loadCodeGoods(refresh: Boolean) {
52+
//如果正在刷新,则不再发起新的刷新请求
53+
if (isRefreshing)
54+
return
1155

56+
//生成加载条件,目前加载3个,方便测试
57+
if(PostUtil.user == null){
58+
adapter.footerState = LoadMoreAdapter.FOOTER_STATE_FAILED
59+
return
60+
}
61+
val condition = "SELECT a.* FROM icode.code_good a JOIN (SELECT * FROM icode.favorite WHERE userId = ${PostUtil.user!!.id}) b on a.id = b.goodId ORDER BY b.createat"
62+
request = PostUtil.selectCodeGood(condition) {
63+
onSuccess {
64+
if (isDetached) return@onSuccess
65+
view.favo_swipe.isRefreshing = false
66+
request = null
67+
68+
if (it.isEmpty() ) {
69+
//如果结果为空,则表示没有更多内容了
70+
adapter.footerState = LoadMoreAdapter.FOOTER_STATE_NO_MORE
71+
} else {
72+
if (refresh) {
73+
adapter.codeGoods.clear()
74+
}
75+
//否则将结果加入codeGoods,并刷新adapter
76+
adapter.codeGoods.addAll(it)
77+
if (refresh) adapter.notifyDataSetChanged()
78+
else adapter.notifyItemRangeInserted(adapter.itemCount - 1 - it.size, it.size)
79+
cacheData(adapter.codeGoods)
80+
}
81+
onFailed { t, rc ->
82+
request = null
83+
if (isDetached || view == null) return@onFailed
84+
view.favo_swipe.isRefreshing = false
85+
adapter.footerState = LoadMoreAdapter.FOOTER_STATE_FAILED
86+
}
87+
}
88+
}
89+
}
90+
91+
override fun onStop() {
92+
super.onStop()
93+
PostUtil.cancel(request)
94+
request = null
95+
}
96+
fun cacheData(data: List<CodeGood>) {
97+
data.forEach {
98+
it.loadContentFromCache()
99+
it.save()
100+
}
101+
}
102+
fun getCacheData() = SQLite.select(CodeGood_Table.id)
103+
.from(CodeGood::class.java).leftOuterJoin(Favorite::class.java)
104+
.on(CodeGood_Table.id.withTable().eq(Favorite_Table.goodId.withTable()))
105+
.queryList()
12106

13107
}

app/src/main/res/layout/activity_account.xml

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -30,23 +30,25 @@
3030
android:layout_height="match_parent">
3131
<ImageView
3232
android:layout_width="match_parent"
33+
android:id="@+id/account_bg_pic"
3334
android:layout_height="match_parent" />
3435
<ImageView
35-
android:layout_width="60dp"
36-
android:layout_height="60dp"
36+
android:layout_width="80dp"
37+
android:layout_height="80dp"
38+
android:id="@+id/account_pic"
3739
android:src="@mipmap/ic_account_box_black"
38-
android:layout_above="@+id/textView"
40+
android:layout_centerVertical="true"
3941
android:layout_centerHorizontal="true" />
4042
<TextView
4143
android:layout_width="wrap_content"
4244
android:layout_height="wrap_content"
4345
android:text="Username"
4446
android:layout_alignParentBottom="true"
4547
android:layout_centerHorizontal="true"
46-
android:layout_marginBottom="18dp"
48+
android:layout_marginBottom="16dp"
4749
android:textColor="#FFF"
4850
android:textSize="24dp"
49-
android:id="@+id/textView" />
51+
android:id="@+id/account_username" />
5052

5153
</RelativeLayout>
5254
</android.support.design.widget.CollapsingToolbarLayout>

0 commit comments

Comments
 (0)