Added detail view

This commit is contained in:
Vladislav Khorev 2017-06-11 00:33:37 +03:00
parent 1a6611c087
commit ad3b15db3b
26 changed files with 594 additions and 58 deletions

View File

@ -2,6 +2,7 @@ package fishrungames.yelpmapapp
import android.support.v4.app.Fragment import android.support.v4.app.Fragment
import android.os.Bundle import android.os.Bundle
import android.support.design.widget.AppBarLayout
import android.support.v7.widget.LinearLayoutCompat import android.support.v7.widget.LinearLayoutCompat
import android.support.v7.widget.LinearLayoutManager import android.support.v7.widget.LinearLayoutManager
@ -11,7 +12,12 @@ import android.view.View
import fishrungames.yelpmapapp.records.BusinessDetailRecord import fishrungames.yelpmapapp.records.BusinessDetailRecord
import fishrungames.yelpmapapp.records.ReviewListRecord import fishrungames.yelpmapapp.records.ReviewListRecord
import android.support.v7.widget.RecyclerView import android.support.v7.widget.RecyclerView
import android.util.Log
import android.widget.ImageView
import android.widget.TextView
import com.koushikdutta.ion.Ion
import fishrungames.yelpmapapp.records.MapMarkerRecord import fishrungames.yelpmapapp.records.MapMarkerRecord
import org.w3c.dom.Text
/** /**
@ -25,19 +31,62 @@ class DetailFragment : Fragment()
var mapMarkerRecord : MapMarkerRecord? = null var mapMarkerRecord : MapMarkerRecord? = null
var backdropImageView : ImageView? = null
var backgroundTitleTextView : TextView? = null
var toolbarTitleTextView : TextView? = null
var detailCoordinatorChangeOffset : Int = 0
var detailCoordinatorOffset : Int = 0
override fun onCreateView(inflater: LayoutInflater?, container: ViewGroup?, savedInstanceState: Bundle?): View? { override fun onCreateView(inflater: LayoutInflater?, container: ViewGroup?, savedInstanceState: Bundle?): View? {
detailCoordinatorChangeOffset = context.resources.getInteger(R.integer.detailCoordinatorChangeOffset)
detailCoordinatorOffset = context.resources.getInteger(R.integer.detailCoordinatorOffset)
val rootView = inflater!!.inflate(R.layout.detail_fragment, container, false) val rootView = inflater!!.inflate(R.layout.detail_fragment, container, false)
val appBarLayout = rootView.findViewById(R.id.appBarLayout) as AppBarLayout
appBarLayout.addOnOffsetChangedListener {
_, verticalOffset ->
run {
if (-verticalOffset > detailCoordinatorChangeOffset) {
val alpha = (-verticalOffset - detailCoordinatorChangeOffset).toFloat() / (detailCoordinatorOffset - detailCoordinatorChangeOffset).toFloat()
toolbarTitleTextView?.alpha = alpha
backgroundTitleTextView?.alpha = 1F - alpha
}
else
{
toolbarTitleTextView?.alpha = 0F
backgroundTitleTextView?.alpha = 1F
}
}
}
val detailRecyclerView = rootView.findViewById(R.id.detailRecyclerView) as RecyclerView val detailRecyclerView = rootView.findViewById(R.id.detailRecyclerView) as RecyclerView
backdropImageView = rootView.findViewById(R.id.backdropImageView) as ImageView
backgroundTitleTextView = rootView.findViewById(R.id.backgroundTitleTextView) as TextView
toolbarTitleTextView = rootView.findViewById(R.id.toolbarTitleTextView) as TextView
detailRecyclerView.layoutManager = LinearLayoutManager(this.context) detailRecyclerView.layoutManager = LinearLayoutManager(this.context)
mapMarkerRecord = arguments?.getSerializable("mapMarkerRecord") as? MapMarkerRecord mapMarkerRecord = arguments?.getSerializable("mapMarkerRecord") as? MapMarkerRecord
if (mapMarkerRecord != null && mapMarkerRecord!!.id != null) { if (mapMarkerRecord != null && mapMarkerRecord!!.id != null) {
detailRecyclerAdapter = DetailRecyclerAdapter() Ion.with(backdropImageView)
.placeholder(R.drawable.placeholder)
.error(R.drawable.placeholder)
.fadeIn(true)
.load(mapMarkerRecord!!.image_url)
toolbarTitleTextView?.text = mapMarkerRecord!!.name
backgroundTitleTextView?.text = mapMarkerRecord!!.name
detailRecyclerAdapter = DetailRecyclerAdapter(context, mapMarkerRecord!!)
detailRecyclerView.adapter = detailRecyclerAdapter detailRecyclerView.adapter = detailRecyclerAdapter
@ -51,11 +100,29 @@ class DetailFragment : Fragment()
fun updateBusinessDetail(businessDetailRecord : BusinessDetailRecord) fun updateBusinessDetail(businessDetailRecord : BusinessDetailRecord)
{ {
detailRecyclerAdapter?.notifyDataSetChanged() if (businessDetailRecord.id != null && businessDetailRecord.id == mapMarkerRecord?.id) {
Ion.with(backdropImageView)
.error(R.drawable.placeholder)
.fadeIn(true)
.load(businessDetailRecord.image_url)
toolbarTitleTextView?.text = businessDetailRecord.name
backgroundTitleTextView?.text = mapMarkerRecord!!.name
detailRecyclerAdapter?.businessDetailRecord = businessDetailRecord
detailRecyclerAdapter?.notifyDataSetChanged()
}
} }
fun updateReviewList(reviewListRecordPair : Pair<String, ReviewListRecord>) fun updateReviewList(reviewListRecordPair : Pair<String, ReviewListRecord>)
{ {
detailRecyclerAdapter?.notifyDataSetChanged() if (reviewListRecordPair.first == mapMarkerRecord?.id) {
detailRecyclerAdapter?.reviewListRecordPair = reviewListRecordPair
detailRecyclerAdapter?.notifyDataSetChanged()
}
} }
} }

View File

@ -1,15 +1,21 @@
package fishrungames.yelpmapapp package fishrungames.yelpmapapp
import android.content.Context
import android.support.v4.content.ContextCompat
import android.support.v7.widget.RecyclerView import android.support.v7.widget.RecyclerView
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import android.widget.TextView import android.widget.TextView
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View.GONE
import android.view.View.VISIBLE
import android.widget.ImageView
import android.widget.ProgressBar
import com.koushikdutta.ion.Ion
import fishrungames.yelpmapapp.records.BusinessDetailRecord
import fishrungames.yelpmapapp.records.MapMarkerRecord
import fishrungames.yelpmapapp.records.ReviewListRecord
import java.text.DecimalFormat
/** /**
@ -17,8 +23,11 @@ import android.view.LayoutInflater
*/ */
class DetailRecyclerAdapter : RecyclerView.Adapter<RecyclerView.ViewHolder>() { class DetailRecyclerAdapter(val context : Context, val mapMarkerRecord : MapMarkerRecord) : RecyclerView.Adapter<RecyclerView.ViewHolder>() {
var businessDetailRecord : BusinessDetailRecord? = null
var reviewListRecordPair : Pair<String, ReviewListRecord>? = null
internal class PhoneViewHolder(v: View) : RecyclerView.ViewHolder(v) { internal class PhoneViewHolder(v: View) : RecyclerView.ViewHolder(v) {
@ -32,42 +41,182 @@ class DetailRecyclerAdapter : RecyclerView.Adapter<RecyclerView.ViewHolder>() {
} }
internal class ReviewTitleViewHolder(v: View) : RecyclerView.ViewHolder(v) {
var noReviewsTextView: TextView = v.findViewById(R.id.noReviewsTextView) as TextView
var progressBar: ProgressBar = v.findViewById(R.id.progressBar) as ProgressBar
}
internal class RatingViewHolder(v: View) : RecyclerView.ViewHolder(v) {
var ratingTextView : TextView = v.findViewById(R.id.ratingTextView) as TextView
val starImageView1 = v.findViewById(R.id.starImageView1) as ImageView
val starImageView2 = v.findViewById(R.id.starImageView2) as ImageView
val starImageView3 = v.findViewById(R.id.starImageView3) as ImageView
val starImageView4 = v.findViewById(R.id.starImageView4) as ImageView
val starImageView5 = v.findViewById(R.id.starImageView5) as ImageView
}
internal class ReviewViewHolder(v: View) : RecyclerView.ViewHolder(v) {
var nameTextView : TextView = v.findViewById(R.id.nameTextView) as TextView
var messageTextView : TextView = v.findViewById(R.id.messageTextView) as TextView
var dateTextView : TextView = v.findViewById(R.id.dateTextView) as TextView
var ratingTextView : TextView = v.findViewById(R.id.ratingTextView) as TextView
val starImageView1 = v.findViewById(R.id.starImageView1) as ImageView
val starImageView2 = v.findViewById(R.id.starImageView2) as ImageView
val starImageView3 = v.findViewById(R.id.starImageView3) as ImageView
val starImageView4 = v.findViewById(R.id.starImageView4) as ImageView
val starImageView5 = v.findViewById(R.id.starImageView5) as ImageView
val profilePictureImageView = v.findViewById(R.id.profilePictureImageView) as ImageView
}
override fun getItemViewType(position: Int): Int { override fun getItemViewType(position: Int): Int {
// Just as an example, return 0 or 2 depending on position return position
// Note that unlike in ListView adapters, types don't have to be contiguous
return position % 2
} }
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
when (viewType) { when (viewType) {
0 -> { 0 -> {
val v = LayoutInflater.from(parent.context).inflate(R.layout.recycler_rating, parent, false)
return RatingViewHolder(v)
}
1 -> {
val v = LayoutInflater.from(parent.context).inflate(R.layout.recycler_phone, parent, false) val v = LayoutInflater.from(parent.context).inflate(R.layout.recycler_phone, parent, false)
return PhoneViewHolder(v) return PhoneViewHolder(v)
} }
else -> { 2 -> {
val v = LayoutInflater.from(parent.context).inflate(R.layout.recycler_address, parent, false) val v = LayoutInflater.from(parent.context).inflate(R.layout.recycler_address, parent, false)
return AddressViewHolder(v) return AddressViewHolder(v)
} }
3 -> {
val v = LayoutInflater.from(parent.context).inflate(R.layout.recycler_review_title, parent, false)
return ReviewTitleViewHolder(v)
}
else -> {
val v = LayoutInflater.from(parent.context).inflate(R.layout.recycler_review, parent, false)
return ReviewViewHolder(v)
}
} }
} }
override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
when (holder.itemViewType) { when (holder.itemViewType) {
0 -> { 0 -> {
val ratingViewHolder = holder as RatingViewHolder
val rating = businessDetailRecord?.rating ?: (mapMarkerRecord.rating ?: 0.0)
val formatter = DecimalFormat("#0.00")
ratingViewHolder.ratingTextView.text = formatter.format(rating)
ratingViewHolder.starImageView1.setImageDrawable(ContextCompat.getDrawable(context, Utils.getStarRatingId(rating, 0.0)))
ratingViewHolder.starImageView2.setImageDrawable(ContextCompat.getDrawable(context, Utils.getStarRatingId(rating, 1.0)))
ratingViewHolder.starImageView3.setImageDrawable(ContextCompat.getDrawable(context, Utils.getStarRatingId(rating, 2.0)))
ratingViewHolder.starImageView4.setImageDrawable(ContextCompat.getDrawable(context, Utils.getStarRatingId(rating, 3.0)))
ratingViewHolder.starImageView5.setImageDrawable(ContextCompat.getDrawable(context, Utils.getStarRatingId(rating, 4.0)))
}
1 -> {
val phoneViewHolder = holder as PhoneViewHolder val phoneViewHolder = holder as PhoneViewHolder
phoneViewHolder.phoneTextView.text = "+86 15000929180" if (businessDetailRecord?.display_phone != null) {
phoneViewHolder.phoneTextView.text = businessDetailRecord?.display_phone
}
else
{
phoneViewHolder.phoneTextView.text = mapMarkerRecord.display_phone
}
} }
1 -> { 2 -> {
val addressViewHolder = holder as AddressViewHolder val addressViewHolder = holder as AddressViewHolder
addressViewHolder.addressTextView.text = "555 First avenue" if (businessDetailRecord?.location?.display_address != null) {
addressViewHolder.addressTextView.text = businessDetailRecord?.location?.display_address?.joinToString(" ")
}
else
{
addressViewHolder.addressTextView.text = mapMarkerRecord.location?.display_address?.joinToString(" ")
}
}
3 -> {
val reviewTitleViewHolder = holder as ReviewTitleViewHolder
if (reviewListRecordPair == null)
{
reviewTitleViewHolder.progressBar.visibility = VISIBLE
reviewTitleViewHolder.noReviewsTextView.visibility = GONE
}
else
{
reviewTitleViewHolder.progressBar.visibility = GONE
reviewTitleViewHolder.noReviewsTextView.visibility = if (getReviewCount() > 0) GONE else VISIBLE
}
}
else -> {
val reviewViewHolder = holder as ReviewViewHolder
val reviewRecord = reviewListRecordPair?.second?.reviews?.get(position - 4)
if (reviewRecord != null) {
reviewViewHolder.nameTextView.text = reviewRecord.user?.name
reviewViewHolder.messageTextView.text = reviewRecord.text
reviewViewHolder.dateTextView.text = reviewRecord.time_created
val rating = reviewRecord.rating ?: 0.0
val formatter = DecimalFormat("#0.00")
reviewViewHolder.ratingTextView.text = formatter.format(rating)
reviewViewHolder.starImageView1.setImageDrawable(ContextCompat.getDrawable(context, Utils.getStarRatingId(rating, 0.0)))
reviewViewHolder.starImageView2.setImageDrawable(ContextCompat.getDrawable(context, Utils.getStarRatingId(rating, 1.0)))
reviewViewHolder.starImageView3.setImageDrawable(ContextCompat.getDrawable(context, Utils.getStarRatingId(rating, 2.0)))
reviewViewHolder.starImageView4.setImageDrawable(ContextCompat.getDrawable(context, Utils.getStarRatingId(rating, 3.0)))
reviewViewHolder.starImageView5.setImageDrawable(ContextCompat.getDrawable(context, Utils.getStarRatingId(rating, 4.0)))
Ion.with(reviewViewHolder.profilePictureImageView)
.placeholder(R.drawable.placeholder)
.error(R.drawable.placeholder)
.fadeIn(true)
.load(reviewRecord.user?.image_url)
}
} }
} }
} }
override fun getItemCount(): Int { override fun getItemCount(): Int {
return 2
return 4 + getReviewCount()
}
private fun getReviewCount() : Int {
return reviewListRecordPair?.second?.reviews?.count() ?: 0
} }
} }

View File

@ -0,0 +1,26 @@
package fishrungames.yelpmapapp
/**
* Created by mephi on 10.06.2017.
*/
class Utils {
companion object {
fun getStarRatingId(rating : Double, s : Double) : Int {
if (rating < 0.25 + s)
{
return R.drawable.ic_star_border_black_48dp
}
if (rating < 0.75 + s)
{
return R.drawable.ic_star_half_black_48dp
}
return R.drawable.ic_star_black_48dp
}
}
}

View File

@ -1,16 +1,19 @@
package fishrungames.yelpmapapp package fishrungames.yelpmapapp
import android.annotation.SuppressLint
import android.app.Activity import android.app.Activity
import android.content.Context import android.content.Context
import android.support.v4.content.ContextCompat
import android.view.LayoutInflater
import android.view.View import android.view.View
import android.widget.ImageView
import android.widget.LinearLayout import android.widget.LinearLayout
import com.google.android.gms.maps.model.Marker import com.google.android.gms.maps.model.Marker
import android.widget.TextView import android.widget.TextView
import com.google.android.gms.maps.GoogleMap.InfoWindowAdapter import com.google.android.gms.maps.GoogleMap.InfoWindowAdapter
import android.widget.RelativeLayout import android.widget.RelativeLayout
import fishrungames.yelpmapapp.Utils.Companion.getStarRatingId
import java.text.DecimalFormat
/** /**
@ -21,15 +24,43 @@ class YelpInfoWindowProvider(val activity: Activity) : InfoWindowAdapter {
private val myContentsView: View = activity.layoutInflater.inflate(R.layout.yelp_info_contents, null) private val myContentsView: View = activity.layoutInflater.inflate(R.layout.yelp_info_contents, null)
var lastClickedMapMarker : MapMarkerClusterItem? = null
override fun getInfoContents(marker: Marker): View { override fun getInfoContents(marker: Marker): View {
if (lastClickedMapMarker != null)
{
val nameTextView = myContentsView.findViewById(R.id.nameTextView) as TextView
val addressTextView = myContentsView.findViewById(R.id.addressTextView) as TextView
val ratingTextView = myContentsView.findViewById(R.id.ratingTextView) as TextView
//val contentsView = activity.layoutInflater.inflate(R.layout.yelp_info_contents, null)
//myContentsView.layoutParams = LinearLayout.LayoutParams(500, RelativeLayout.LayoutParams.WRAP_CONTENT) val starImageView1 = myContentsView.findViewById(R.id.starImageView1) as ImageView
val starImageView2 = myContentsView.findViewById(R.id.starImageView2) as ImageView
val starImageView3 = myContentsView.findViewById(R.id.starImageView3) as ImageView
val starImageView4 = myContentsView.findViewById(R.id.starImageView4) as ImageView
val starImageView5 = myContentsView.findViewById(R.id.starImageView5) as ImageView
//myContentsView.findViewById(R.id.title) = marker.title nameTextView.text = lastClickedMapMarker?.mapMarkerRecord?.name
//myContentsView.findViewById(R.id.snippet).text = marker.snippet
addressTextView.text = lastClickedMapMarker?.mapMarkerRecord?.location?.display_address?.joinToString(" ")
if (lastClickedMapMarker?.mapMarkerRecord?.rating != null) {
val rating = lastClickedMapMarker?.mapMarkerRecord?.rating!!
val formatter = DecimalFormat("#0.00")
ratingTextView.text = formatter.format(rating)
starImageView1.setImageDrawable(ContextCompat.getDrawable(activity, getStarRatingId(rating, 0.0)))
starImageView2.setImageDrawable(ContextCompat.getDrawable(activity, getStarRatingId(rating, 1.0)))
starImageView3.setImageDrawable(ContextCompat.getDrawable(activity, getStarRatingId(rating, 2.0)))
starImageView4.setImageDrawable(ContextCompat.getDrawable(activity, getStarRatingId(rating, 3.0)))
starImageView5.setImageDrawable(ContextCompat.getDrawable(activity, getStarRatingId(rating, 4.0)))
}
}
return myContentsView return myContentsView
} }
@ -38,4 +69,4 @@ class YelpInfoWindowProvider(val activity: Activity) : InfoWindowAdapter {
return null return null
} }
} }

View File

@ -152,10 +152,11 @@ class YelpMapActivity : MapsActivity(), ClusterManager.OnClusterItemInfoWindowCl
} }
override fun onClusterItemClick(item: MapMarkerClusterItem): Boolean { override fun onClusterItemClick(item: MapMarkerClusterItem): Boolean {
// Does nothing, but you could go into the user's profile page, for example.
lastClickedMapMarker = item lastClickedMapMarker = item
yelpInfoWindowProvider?.lastClickedMapMarker = item
return false return false
} }

View File

@ -24,7 +24,7 @@ class HandleReviewListResponseAsyncTask(val id: String, val onUpdateReviewList :
try { try {
val recordType = object : TypeToken<BusinessDetailRecord?>() {}.type val recordType = object : TypeToken<ReviewListRecord?>() {}.type
val result = Gson().fromJson<ReviewListRecord?>(response[0], recordType) val result = Gson().fromJson<ReviewListRecord?>(response[0], recordType)

View File

@ -1,5 +1,7 @@
package fishrungames.yelpmapapp.records package fishrungames.yelpmapapp.records
import java.io.Serializable
/** /**
* Created by mephi on 10.06.2017. * Created by mephi on 10.06.2017.
*/ */
@ -20,4 +22,4 @@ data class BusinessDetailRecord(
val location : LocationRecord?, val location : LocationRecord?,
val coordinates: CoordinatesRecord?, val coordinates: CoordinatesRecord?,
val photos : List<String>? val photos : List<String>?
) ) : Serializable

View File

@ -1,8 +1,10 @@
package fishrungames.yelpmapapp.records package fishrungames.yelpmapapp.records
import java.io.Serializable
/** /**
* Created by mephi on 10.06.2017. * Created by mephi on 10.06.2017.
*/ */
data class CategoryRecord(val alias: String?, data class CategoryRecord(val alias: String?,
val title: String?) val title: String?) : Serializable

View File

@ -1,8 +1,10 @@
package fishrungames.yelpmapapp.records package fishrungames.yelpmapapp.records
import java.io.Serializable
/** /**
* Created by mephi on 10.06.2017. * Created by mephi on 10.06.2017.
*/ */
data class CoordinatesRecord(val latitude: Double?, data class CoordinatesRecord(val latitude: Double?,
val longitude: Double?) val longitude: Double?) : Serializable

View File

@ -1,5 +1,7 @@
package fishrungames.yelpmapapp.records package fishrungames.yelpmapapp.records
import java.io.Serializable
/** /**
* Created by mephi on 10.06.2017. * Created by mephi on 10.06.2017.
*/ */
@ -14,4 +16,4 @@ data class LocationRecord(
val state: String?, val state: String?,
val display_address: List<String>?, val display_address: List<String>?,
val cross_streets: String? val cross_streets: String?
) ) : Serializable

View File

@ -11,8 +11,12 @@ import com.google.gson.annotations.SerializedName
data class MapMarkerRecord ( data class MapMarkerRecord (
@SerializedName("id") val id: String?, val id: String?,
@SerializedName("name") val name: String?, val name: String?,
@SerializedName("image_url") val image_url: String?, val image_url: String?,
@SerializedName("coordinates") val coordinates: CoordinatesRecord? val coordinates: CoordinatesRecord?,
val location: LocationRecord?,
val rating: Double?,
val phone : String?,
val display_phone : String?
) : Serializable ) : Serializable

View File

@ -1,9 +1,11 @@
package fishrungames.yelpmapapp.records package fishrungames.yelpmapapp.records
import java.io.Serializable
/** /**
* Created by mephi on 10.06.2017. * Created by mephi on 10.06.2017.
*/ */
data class ReviewListRecord( data class ReviewListRecord(
val reviews: List<ReviewRecord>?, val reviews: List<ReviewRecord>?,
val total: Int?) val total: Int?) : Serializable

View File

@ -1,5 +1,7 @@
package fishrungames.yelpmapapp.records package fishrungames.yelpmapapp.records
import java.io.Serializable
/** /**
* Created by mephi on 10.06.2017. * Created by mephi on 10.06.2017.
*/ */
@ -9,4 +11,4 @@ data class ReviewRecord(
val user: ReviewUserRecord?, val user: ReviewUserRecord?,
val text: String?, val text: String?,
val time_created: String?, val time_created: String?,
val url: String?) val url: String?) : Serializable

View File

@ -1,9 +1,11 @@
package fishrungames.yelpmapapp.records package fishrungames.yelpmapapp.records
import java.io.Serializable
/** /**
* Created by mephi on 10.06.2017. * Created by mephi on 10.06.2017.
*/ */
data class ReviewUserRecord( data class ReviewUserRecord(
val image_url: String?, val image_url: String?,
val name: String?) val name: String?) : Serializable

Binary file not shown.

Before

Width:  |  Height:  |  Size: 78 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.4 KiB

View File

@ -10,7 +10,7 @@
> >
<android.support.design.widget.AppBarLayout <android.support.design.widget.AppBarLayout
android:id="@+id/main.appbar" android:id="@+id/appBarLayout"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="300dp" android:layout_height="300dp"
android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar" android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
@ -18,33 +18,53 @@
> >
<android.support.design.widget.CollapsingToolbarLayout <android.support.design.widget.CollapsingToolbarLayout
android:id="@+id/main.collapsing" android:id="@+id/collapsing"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
app:layout_scrollFlags="scroll|exitUntilCollapsed"
android:fitsSystemWindows="true" android:fitsSystemWindows="true"
app:contentScrim="?attr/colorPrimary" app:contentScrim="?attr/colorPrimary"
app:expandedTitleMarginStart="48dp"
app:expandedTitleMarginEnd="64dp" app:expandedTitleMarginEnd="64dp"
> app:expandedTitleMarginStart="48dp"
app:layout_scrollFlags="scroll|exitUntilCollapsed">
<ImageView <ImageView
android:id="@+id/main.backdrop" android:id="@+id/backdropImageView"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:scaleType="centerCrop"
android:fitsSystemWindows="true" android:fitsSystemWindows="true"
android:src="@drawable/bkgtest" android:scaleType="centerCrop"
app:layout_collapseMode="parallax" android:src="@drawable/placeholder"
/> app:layout_collapseMode="parallax" />
<TextView
android:id="@+id/backgroundTitleTextView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="bottom|left"
android:layout_marginBottom="16dp"
android:layout_marginLeft="16dp"
android:text="Toolbar Title"
android:textColor="#ffffff"
android:textSize="22sp"
android:textStyle="bold" />
<android.support.v7.widget.Toolbar <android.support.v7.widget.Toolbar
android:id="@+id/main.toolbar" android:id="@+id/toolbar"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize" android:layout_height="?attr/actionBarSize"
app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
app:layout_collapseMode="pin" app:layout_collapseMode="pin"
/> app:popupTheme="@style/ThemeOverlay.AppCompat.Light">
<TextView
android:id="@+id/toolbarTitleTextView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="left"
android:text="Toolbar Title"
android:textColor="#ffffff"
android:textSize="22sp"
android:textStyle="bold" />
</android.support.v7.widget.Toolbar>
</android.support.design.widget.CollapsingToolbarLayout> </android.support.design.widget.CollapsingToolbarLayout>
</android.support.design.widget.AppBarLayout> </android.support.design.widget.AppBarLayout>

View File

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent" android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent"> android:layout_height="wrap_content">
<TextView <TextView
android:id="@+id/textView" android:id="@+id/textView"

View File

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent" android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent"> android:layout_height="wrap_content">
<TextView <TextView
android:id="@+id/textView" android:id="@+id/textView"

View File

@ -0,0 +1,61 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:id="@+id/ratingTitleTextView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Rating:"
android:textAppearance="@style/TextAppearance.AppCompat.Medium" />
<TextView
android:id="@+id/ratingTextView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="5.0" />
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal">
<ImageView
android:id="@+id/starImageView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/ic_star_border_black_48dp"
/>
<ImageView
android:id="@+id/starImageView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/ic_star_border_black_48dp"
/>
<ImageView
android:id="@+id/starImageView3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/ic_star_border_black_48dp"
/>
<ImageView
android:id="@+id/starImageView4"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/ic_star_border_black_48dp"
/>
<ImageView
android:id="@+id/starImageView5"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/ic_star_border_black_48dp"
/>
</LinearLayout>
</LinearLayout>

View File

@ -0,0 +1,110 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<ImageView
android:id="@+id/profilePictureImageView"
android:layout_width="60dp"
android:layout_height="60dp"
android:layout_margin="10dp"
app:srcCompat="@drawable/empty_profile" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:id="@+id/nameTextView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:text="TextView"
android:textAppearance="@style/TextAppearance.AppCompat.Medium" />
<TextView
android:id="@+id/ratingTextView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="TextView"
android:textAppearance="@style/TextAppearance.AppCompat.Small" />
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal">
<ImageView
android:id="@+id/starImageView1"
android:layout_width="20dp"
android:layout_height="20dp"
android:src="@drawable/ic_star_border_black_48dp"
app:srcCompat="@drawable/ic_star_border_black_48dp" />
<ImageView
android:id="@+id/starImageView2"
android:layout_width="20dp"
android:layout_height="20dp"
android:src="@drawable/ic_star_border_black_48dp"
app:srcCompat="@drawable/ic_star_border_black_48dp" />
<ImageView
android:id="@+id/starImageView3"
android:layout_width="20dp"
android:layout_height="20dp"
android:src="@drawable/ic_star_border_black_48dp"
app:srcCompat="@drawable/ic_star_border_black_48dp" />
<ImageView
android:id="@+id/starImageView4"
android:layout_width="20dp"
android:layout_height="20dp"
android:src="@drawable/ic_star_border_black_48dp"
app:srcCompat="@drawable/ic_star_border_black_48dp" />
<ImageView
android:id="@+id/starImageView5"
android:layout_width="20dp"
android:layout_height="20dp"
android:src="@drawable/ic_star_border_black_48dp"
app:srcCompat="@drawable/ic_star_border_black_48dp" />
</LinearLayout>
<TextView
android:id="@+id/messageTextView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="TextView TextView TextView TextView TextView TextView TextView TextView TextView TextView TextView TextView TextView TextView"
android:textAppearance="@style/TextAppearance.AppCompat.Small" />
<TextView
android:id="@+id/dateTextView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="TextView"
android:textAppearance="@style/TextAppearance.AppCompat.Small" />
</LinearLayout>
</LinearLayout>
<ImageView
android:id="@+id/separatorImageView"
android:layout_width="match_parent"
android:layout_height="1dp"
android:layout_marginBottom="16dp"
android:layout_marginLeft="8dp"
android:layout_marginRight="8dp"
android:layout_marginTop="16dp"
app:srcCompat="@android:color/black" />
</LinearLayout>

View File

@ -0,0 +1,25 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:id="@+id/textView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Reviews:"
android:textAppearance="@style/TextAppearance.AppCompat.Medium"/>
<TextView
android:id="@+id/noReviewsTextView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="No reviews yet"
android:textAppearance="@style/TextAppearance.AppCompat.Large"/>
<ProgressBar
android:id="@+id/progressBar"
style="?android:attr/progressBarStyle"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>

View File

@ -11,7 +11,7 @@
android:orientation="vertical"> android:orientation="vertical">
<TextView <TextView
android:id="@+id/textView" android:id="@+id/nameTextView"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginBottom="6dp" android:layout_marginBottom="6dp"
@ -19,19 +19,25 @@
android:textAppearance="@style/TextAppearance.AppCompat.Large" /> android:textAppearance="@style/TextAppearance.AppCompat.Large" />
<ImageView <ImageView
android:id="@+id/imageView" android:id="@+id/separatorImageView1"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="1dp" android:layout_height="1dp"
android:layout_marginBottom="6dp" android:layout_marginBottom="6dp"
android:background="@android:color/black" /> android:background="@android:color/black" />
<TextView <TextView
android:id="@+id/textView2" android:id="@+id/ratingTitleTextView"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text="Rating:" android:text="Rating:"
android:textAppearance="@style/TextAppearance.AppCompat.Medium" /> android:textAppearance="@style/TextAppearance.AppCompat.Medium" />
<TextView
android:id="@+id/ratingTextView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="5.0" />
<LinearLayout <LinearLayout
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
@ -73,18 +79,26 @@
app:srcCompat="@drawable/ic_star_border_black_48dp" /> app:srcCompat="@drawable/ic_star_border_black_48dp" />
</LinearLayout> </LinearLayout>
<ImageView
android:id="@+id/separatorImageView2"
android:layout_width="match_parent"
android:layout_height="1dp"
android:layout_marginBottom="6dp"
android:background="@android:color/black" />
<TextView <TextView
android:id="@+id/textView3" android:id="@+id/addressTitleTextView"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text="Address:" android:text="Address:"
android:textAppearance="@style/TextAppearance.AppCompat.Medium" /> android:textAppearance="@style/TextAppearance.AppCompat.Medium" />
<TextView <TextView
android:id="@+id/textView4" android:id="@+id/addressTextView"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text="123 Main" /> android:text="123 Main" />
</LinearLayout> </LinearLayout>
</LinearLayout> </LinearLayout>

View File

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<dimen name="detail_background_height">300dp</dimen>
</resources>

View File

@ -0,0 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<integer name="detailCoordinatorChangeOffset">300</integer>
<integer name="detailCoordinatorOffset">488</integer>
</resources>