Skip to content

Commit 277a240

Browse files
committed
详情页 修复数据重复
1 parent 9dca276 commit 277a240

File tree

14 files changed

+272
-57
lines changed

14 files changed

+272
-57
lines changed

app/src/main/AndroidManifest.xml

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
<category android:name="android.intent.category.LAUNCHER" />
1919
</intent-filter>
2020
</activity>
21-
<activity android:name=".ui.activity.AboutActivity"></activity>
21+
<activity android:name=".ui.activity.AboutActivity" />
2222
<activity
2323
android:name="com.airbnb.deeplinkdispatch.DeepLinkActivity"
2424
android:theme="@android:style/Theme.NoDisplay">
@@ -31,7 +31,8 @@
3131
<data android:scheme="gank" />
3232
</intent-filter>
3333
</activity>
34-
<activity android:name=".ui.activity.ImageActivity"></activity>
34+
<activity android:name=".ui.activity.ImageActivity" />
35+
<activity android:name=".ui.activity.DetailActivity"></activity>
3536
</application>
3637

3738
</manifest>

app/src/main/java/com/wingsofts/gankclient/router/GankClientUri.kt

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,4 +6,12 @@ package com.wingsofts.gankclient.router
66
object GankClientUri {
77
//关于Activity
88
const val ABOUT = "gank://androidwing.net/about/"
9+
10+
11+
12+
13+
//详情页
14+
const val DETAIL_PARAM_URL = "url"
15+
const val DETAIL_PARAM_TITLE = "title"
16+
const val DETAIL = "gank://androidwing.net/detail/"
917
}

app/src/main/java/com/wingsofts/gankclient/ui/activity/BaseBindingActivity.kt

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,9 @@ package com.wingsofts.gankclient.ui.activity
33
import android.databinding.ViewDataBinding
44
import android.os.Bundle
55
import android.support.v7.app.AppCompatActivity
6+
import android.support.v7.widget.Toolbar
7+
import android.view.MenuItem
8+
import com.wingsofts.gankclient.R
69

710
/**
811
* Created by wing on 16-11-24.
@@ -22,4 +25,20 @@ abstract class BaseBindingActivity<B : ViewDataBinding> : AppCompatActivity() {
2225
abstract fun initView()
2326

2427
abstract fun createDataBinding(savedInstanceState: Bundle?): B
28+
29+
30+
fun setupToolbar(toolbar: Toolbar){
31+
toolbar.title = ""
32+
toolbar.setNavigationIcon(R.drawable.icon_back)
33+
setSupportActionBar(toolbar)
34+
35+
}
36+
37+
override fun onOptionsItemSelected(item: MenuItem): Boolean {
38+
when (item.itemId) {
39+
android.R.id.home -> onBackPressed()
40+
}
41+
return super.onOptionsItemSelected(item)
42+
}
43+
2544
}
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
package com.wingsofts.gankclient.ui.activity
2+
3+
import android.databinding.DataBindingUtil
4+
import android.support.v7.app.AppCompatActivity
5+
import android.os.Bundle
6+
import android.util.Base64
7+
import android.webkit.WebView
8+
import android.webkit.WebViewClient
9+
import com.airbnb.deeplinkdispatch.DeepLink
10+
import com.wingsofts.gankclient.R
11+
import com.wingsofts.gankclient.databinding.ActivityDetailBinding
12+
import com.wingsofts.gankclient.router.GankClientUri
13+
import com.wingsofts.gankclient.toast
14+
import kotlinx.android.synthetic.main.activity_detail.*
15+
import java.net.URLDecoder
16+
17+
@DeepLink("gank://androidwing.net/detail/{${GankClientUri.DETAIL_PARAM_URL}}")
18+
class DetailActivity : BaseBindingActivity<ActivityDetailBinding>() {
19+
var url = ""
20+
override fun initView() {
21+
if (intent.getBooleanExtra(DeepLink.IS_DEEP_LINK, false)) {
22+
url = URLDecoder.decode(intent.extras.getString(GankClientUri.DETAIL_PARAM_URL))
23+
}
24+
setupToolbar(toolbar)
25+
tv_title.text = "Gank.io"
26+
webView.loadUrl(url)
27+
webView.setWebViewClient(object : WebViewClient() {
28+
override fun shouldOverrideUrlLoading(view: WebView?, url: String?): Boolean {
29+
view?.loadUrl(url)
30+
return true
31+
}
32+
}
33+
)
34+
}
35+
36+
override fun createDataBinding(savedInstanceState: Bundle?): ActivityDetailBinding {
37+
return DataBindingUtil.setContentView(this, R.layout.activity_detail)
38+
}
39+
40+
}

app/src/main/java/com/wingsofts/gankclient/ui/activity/MainActivity.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@ import java.util.*
1616

1717
class MainActivity : BaseBindingActivity<ActivityMainBinding>() {
1818
lateinit var mFragments: MutableList<Fragment>
19-
var mPreItem: MenuItem? = null
2019
override fun createDataBinding(savedInstanceState: Bundle?): ActivityMainBinding {
2120
return DataBindingUtil.setContentView(this, R.layout.activity_main)
2221
}
@@ -29,6 +28,8 @@ class MainActivity : BaseBindingActivity<ActivityMainBinding>() {
2928
override fun getCount() = mFragments.size
3029
}
3130

31+
viewPager.offscreenPageLimit = 4
32+
3233
navigationView.setOnNavigationItemSelectedListener { item ->
3334
var tab = 0
3435
when (item.itemId) {
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package com.wingsofts.gankclient.ui.adapter
2+
3+
import android.databinding.ViewDataBinding
4+
import android.support.v7.widget.RecyclerView
5+
import android.view.ViewGroup
6+
7+
/**
8+
* Created by wing on 16-11-25.
9+
*/
10+
abstract class BaseBindingAdapter<B : ViewDataBinding> : RecyclerView.Adapter<DataBoundViewHolder<B>>() {
11+
var mListener: ((pos: Int) -> Unit)? = null
12+
13+
override fun onBindViewHolder(holder: DataBoundViewHolder<B>, position: Int) {
14+
holder.binding.root.setOnClickListener {
15+
mListener?.invoke(holder.adapterPosition)
16+
}
17+
}
18+
19+
fun setOnItemClickListener(listener: ((pos: Int) -> Unit)) {
20+
mListener = listener
21+
}
22+
23+
}

app/src/main/java/com/wingsofts/gankclient/ui/adapter/FuckGoodsAdapter.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,13 @@ import com.wingsofts.gankclient.databinding.ItemFuckgoodsBinding
1010
/**
1111
* Created by wing on 11/23/16.
1212
*/
13-
class FuckGoodsAdapter(private val mList: List<FuckGoods>) : RecyclerView.Adapter<DataBoundViewHolder<ItemFuckgoodsBinding>>() {
13+
class FuckGoodsAdapter(private val mList: List<FuckGoods>) :BaseBindingAdapter<ItemFuckgoodsBinding>() {
1414
override fun getItemCount(): Int {
1515
return mList.size
1616
}
1717

1818
override fun onBindViewHolder(holder: DataBoundViewHolder<ItemFuckgoodsBinding>, position: Int) {
19+
super.onBindViewHolder(holder, position)
1920
holder.binding.fuckgoods = mList[position]
2021
holder.binding.executePendingBindings()
2122
}

app/src/main/java/com/wingsofts/gankclient/ui/adapter/GirlAdapter.kt

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -10,18 +10,16 @@ import com.wingsofts.gankclient.databinding.ItemGirlBinding
1010
/**
1111
* Created by wing on 16-11-25.
1212
*/
13-
class GirlAdapter(private val mList: List<FuckGoods>) : RecyclerView.Adapter<DataBoundViewHolder<ItemGirlBinding>>() {
14-
var mListener: ((pos: Int) -> Unit)? = null
13+
class GirlAdapter(private val mList: List<FuckGoods>) : BaseBindingAdapter<ItemGirlBinding>() {
1514
override fun getItemCount(): Int {
1615
return mList.size
1716
}
1817

1918
override fun onBindViewHolder(holder: DataBoundViewHolder<ItemGirlBinding>, position: Int) {
19+
super.onBindViewHolder(holder, position)
2020
holder.binding.girl = mList[holder.adapterPosition]
2121

22-
holder.binding.root.setOnClickListener {
23-
mListener?.invoke(holder.adapterPosition)
24-
}
22+
2523
holder.binding.executePendingBindings()
2624
}
2725

@@ -31,7 +29,5 @@ class GirlAdapter(private val mList: List<FuckGoods>) : RecyclerView.Adapter<Dat
3129
ItemGirlBinding.inflate(LayoutInflater.from(parent.context), parent, false))
3230
}
3331

34-
fun setOnItemClickListener(listener: ((pos: Int) -> Unit)) {
35-
mListener = listener
36-
}
32+
3733
}

app/src/main/java/com/wingsofts/gankclient/ui/fragment/AndroidFragment.kt

Lines changed: 56 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import android.databinding.DataBindingUtil
55
import android.os.Bundle
66
import android.support.v7.widget.LinearLayoutManager
77
import android.support.v7.widget.RecyclerView
8+
import android.util.Base64
89
import android.util.Log
910
import android.view.LayoutInflater
1011
import android.view.View
@@ -18,10 +19,14 @@ import com.wingsofts.gankclient.di.component.DaggerApiComponent
1819
import com.wingsofts.gankclient.getMainComponent
1920
import com.wingsofts.gankclient.mvp.contract.FuckGoodsContract
2021
import com.wingsofts.gankclient.mvp.presenter.FuckGoodsPresenter
22+
import com.wingsofts.gankclient.router.GankClientUri
23+
import com.wingsofts.gankclient.router.GankRouter
2124
import com.wingsofts.gankclient.toast
2225
import com.wingsofts.gankclient.ui.adapter.FuckGoodsAdapter
2326
import kotlinx.android.synthetic.main.view_recycler.*
2427
import rx.android.schedulers.AndroidSchedulers
28+
import java.net.URLDecoder
29+
import java.net.URLEncoder
2530
import java.util.*
2631
import javax.inject.Inject
2732

@@ -31,60 +36,67 @@ import javax.inject.Inject
3136
*/
3237
class AndroidFragment : BaseBingingFragment<ViewRecyclerBinding>(), FuckGoodsContract.View {
3338

34-
private var mList = ArrayList<FuckGoods>()
35-
private lateinit var mAdapter: FuckGoodsAdapter
36-
private var mPage = 1
37-
@Inject lateinit var mPresenter: FuckGoodsPresenter
38-
override fun createDataBinding(inflater: LayoutInflater?, container: ViewGroup?,
39-
savedInstanceState: Bundle?): ViewRecyclerBinding {
40-
return ViewRecyclerBinding.inflate(inflater, container, false)
41-
}
39+
private var mList = ArrayList<FuckGoods>()
40+
private lateinit var mAdapter: FuckGoodsAdapter
41+
private var mPage = 1
42+
@Inject lateinit var mPresenter: FuckGoodsPresenter
43+
override fun createDataBinding(inflater: LayoutInflater?, container: ViewGroup?,
44+
savedInstanceState: Bundle?): ViewRecyclerBinding {
45+
return ViewRecyclerBinding.inflate(inflater, container, false)
46+
}
4247

43-
override fun initView() {
44-
mAdapter = FuckGoodsAdapter(mList)
45-
context.getMainComponent().plus(FuckGoodsModule(this)).inject(this)
46-
with(mBinding!!) {
47-
recyclerView.adapter = mAdapter
48-
recyclerView.layoutManager = LinearLayoutManager(context)
49-
val manager = recyclerView.layoutManager as LinearLayoutManager
48+
override fun initView() {
49+
mAdapter = FuckGoodsAdapter(mList)
50+
context.getMainComponent().plus(FuckGoodsModule(this)).inject(this)
51+
with(mBinding!!) {
52+
recyclerView.adapter = mAdapter
53+
recyclerView.layoutManager = LinearLayoutManager(context)
54+
val manager = recyclerView.layoutManager as LinearLayoutManager
5055

51-
recyclerView.addOnScrollListener(object : RecyclerView.OnScrollListener() {
52-
override fun onScrolled(recyclerView: RecyclerView?, dx: Int, dy: Int) {
53-
super.onScrolled(recyclerView, dx, dy)
54-
if (!recyclerView?.canScrollVertically(1)!!) {
55-
mPresenter.getData(++mPage, ANDROID)
56-
}
57-
}
56+
recyclerView.addOnScrollListener(object : RecyclerView.OnScrollListener() {
57+
override fun onScrolled(recyclerView: RecyclerView?, dx: Int, dy: Int) {
58+
super.onScrolled(recyclerView, dx, dy)
59+
if (!recyclerView?.canScrollVertically(1)!!) {
60+
mPresenter.getData(++mPage, ANDROID)
61+
}
62+
}
5863

59-
override fun onScrollStateChanged(recyclerView: RecyclerView?, newState: Int) {
60-
super.onScrollStateChanged(recyclerView, newState)
64+
override fun onScrollStateChanged(recyclerView: RecyclerView?, newState: Int) {
65+
super.onScrollStateChanged(recyclerView, newState)
66+
}
67+
})
6168
}
62-
})
6369

64-
mPresenter.getData(mPage, ANDROID)
65-
}
70+
context.toast(this.toString())
71+
mPresenter.getData(mPage, ANDROID)
6672

73+
mAdapter.setOnItemClickListener {
74+
pos ->
75+
val url = URLEncoder.encode(mList[pos].url)
76+
GankRouter.router(context, GankClientUri.DETAIL + url)
77+
}
6778

68-
}
6979

70-
override fun setData(results: List<FuckGoods>) {
71-
mList.addAll(results)
72-
mAdapter.notifyDataSetChanged()
73-
}
80+
}
7481

75-
override fun onDestroy() {
76-
super.onDestroy()
77-
mPresenter.unSubscribe()
78-
}
82+
override fun setData(results: List<FuckGoods>) {
83+
mList.addAll(results)
84+
mAdapter.notifyDataSetChanged()
85+
}
86+
87+
override fun onDestroy() {
88+
super.onDestroy()
89+
mPresenter.unSubscribe()
90+
}
7991

80-
companion object {
81-
val ANDROID = "ANDROID"
82-
fun newInstance(): AndroidFragment {
83-
val fragment = AndroidFragment()
84-
val bundle = Bundle()
85-
fragment.arguments = bundle
86-
return fragment
92+
companion object {
93+
val ANDROID = "ANDROID"
94+
fun newInstance(): AndroidFragment {
95+
val fragment = AndroidFragment()
96+
val bundle = Bundle()
97+
fragment.arguments = bundle
98+
return fragment
99+
}
87100
}
88-
}
89101

90102
}

app/src/main/java/com/wingsofts/gankclient/ui/fragment/BaseBindingFragment.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package com.wingsofts.gankclient.ui.fragment
33
import android.databinding.ViewDataBinding
44
import android.os.Bundle
55
import android.support.v4.app.Fragment
6+
import android.util.Log
67
import android.view.LayoutInflater
78
import android.view.View
89
import android.view.ViewGroup
@@ -15,12 +16,12 @@ abstract class BaseBingingFragment<B:ViewDataBinding> : Fragment(){
1516
override fun onCreateView(inflater: LayoutInflater?, container: ViewGroup?, savedInstanceState: Bundle?): View {
1617
mBinding = createDataBinding(inflater,container,savedInstanceState)
1718
initView()
19+
Log.e("wing","onCreateView" + javaClass.name)
1820
return mBinding.root
1921

2022
}
2123

2224
override fun onViewCreated(view: View?, savedInstanceState: Bundle?) {
23-
2425
super.onViewCreated(view, savedInstanceState)
2526
}
2627

0 commit comments

Comments
 (0)