diff options
Diffstat (limited to 'app/src/main/java/net/lacolaco/smileessence/view/Partials.kt')
-rw-r--r-- | app/src/main/java/net/lacolaco/smileessence/view/Partials.kt | 57 |
1 files changed, 30 insertions, 27 deletions
diff --git a/app/src/main/java/net/lacolaco/smileessence/view/Partials.kt b/app/src/main/java/net/lacolaco/smileessence/view/Partials.kt index 3a42af8c..82da5358 100644 --- a/app/src/main/java/net/lacolaco/smileessence/view/Partials.kt +++ b/app/src/main/java/net/lacolaco/smileessence/view/Partials.kt @@ -2,23 +2,23 @@ package net.lacolaco.smileessence.view import android.app.Activity import android.text.Html +import android.view.LayoutInflater import android.view.View -import android.view.ViewGroup import com.bumptech.glide.Glide import kotlinx.android.synthetic.main.item_status_base.view.* import net.lacolaco.smileessence.R import net.lacolaco.smileessence.World import net.lacolaco.smileessence.entity.Tweet import net.lacolaco.smileessence.entity.User +import net.lacolaco.smileessence.twitter.TwitterTaskException import net.lacolaco.smileessence.twitter.task.getTweetAsync -import net.lacolaco.smileessence.util.launchBg +import net.lacolaco.smileessence.util.launchUi import net.lacolaco.smileessence.util.toCompactString -import net.lacolaco.smileessence.view.adapter.UnorderedCustomListAdapter import net.lacolaco.smileessence.view.dialog.StatusDetailDialogFragment import net.lacolaco.smileessence.view.dialog.UserDetailDialogFragment object Partials { - fun getTweetView(tweet: Tweet, world: World, activity: Activity, convertView: View?, expandEmbeddedTweets: Boolean = true): View { + fun getTweetView(tweet: Tweet, world: World, activity: Activity, convertView: View?): View { val view: View = convertView ?: activity.layoutInflater.inflate(R.layout.list_item_status, null) view.setOnClickListener { @@ -27,36 +27,39 @@ object Partials { updateViewUser(tweet.originalTweet.user, activity, view) updateViewBody(tweet, world, activity, view) updateTweetReactionsViews(tweet, world, view) - updateViewEmbeddeds(tweet, world, activity, view, expandEmbeddedTweets) + updateViewEmbeddeds(tweet, world, activity, view) return view } - private fun updateViewEmbeddeds(tweet: Tweet, world: World, activity: Activity, view: View, expandEmbeddedTweets: Boolean) { - if (expandEmbeddedTweets && tweet.embeddedStatusIDs.isNotEmpty()) { - val embeddedTweetsAdapter = object : UnorderedCustomListAdapter<Tweet>() { - override fun getView(position: Int, convertView: View?, parent: ViewGroup): View { - return Partials.getTweetView(getItem(position), world, activity, convertView, false) - } - } + private fun updateViewEmbeddeds(tweet: Tweet, world: World, activity: Activity, view: View) { + val layout = view.tweet_embedded_items + layout.visibility = if (tweet.embeddedStatusIDs.isNotEmpty()) View.VISIBLE else View.GONE + if (layout.childCount < tweet.embeddedStatusIDs.size) { + val inflater = LayoutInflater.from(layout.context) + layout.addView(inflater.inflate(R.layout.list_item_status, layout, false)) + } + for (i in 0 until layout.childCount) + layout.getChildAt(i).visibility = View.GONE - launchBg { - val tasks = tweet.embeddedStatusIDs.map { id -> world.getTweetAsync(id, false) } - for (task in tasks) { - val t = try { - task.await() - } catch (e: Exception) { - continue - } - embeddedTweetsAdapter.add(t) - embeddedTweetsAdapter.update() + launchUi { + tweet.embeddedStatusIDs.mapIndexed { i, id -> + val itemView = layout.getChildAt(i) + itemView.tag = id + Triple(i, id, world.getTweetAsync(id, false)) + }.forEach { (i, id, task) -> + try { + val tweet = task.await() + if (activity.isDestroyed) + return@forEach + val itemView = layout.getChildAt(i) + if (itemView.tag != id) + return@forEach + getTweetView(tweet, world, activity, itemView) + itemView.visibility = View.VISIBLE + } catch (e: TwitterTaskException) { } } - view.listview_status_embedded_status.adapter = embeddedTweetsAdapter - view.listview_status_embedded_status.visibility = View.VISIBLE - } else { - view.listview_status_embedded_status.adapter = null // view may be reused, set null explicitly - view.listview_status_embedded_status.visibility = View.GONE } } |