[英]ListView is not clickable (custom Adapter)
我正在尝试用罗马创建一个简单的RSS阅读器。
我的准系统实现使用ListView
和我的自定义Adapter
用feed_stub.xml
填充它。 单击ListView项将启动另一个活动。
到目前为止,我有两个问题:
我的ListView项目无法点击 - 我的setOnItemClickListener
未被触发。
如果我多次点击某些项目,我的应用程序会因超出异常而崩溃。 这意味着我的适配器可能有错误。
来自activity_main.xml
ListView
<ListView
android:layout_width="0dp"
android:layout_height="0dp" android:layout_marginTop="8dp"
app:layout_constraintTop_toTopOf="parent" app:layout_constraintStart_toStartOf="parent"
android:layout_marginStart="8dp"
android:layout_marginBottom="8dp" app:layout_constraintBottom_toBottomOf="parent"
android:id="@+id/rssListView" app:layout_constraintEnd_toEndOf="parent" android:layout_marginEnd="8dp"
android:clickable="true" app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintVertical_bias="0.0"/>
我的MainActivity
import android.content.Intent
import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import android.widget.Toast
import cz.cvut.lenguduy.rss.Downloader
import cz.cvut.lenguduy.view.ViewHolder
import kotlinx.android.synthetic.main.activity_main.*
class MainActivity : AppCompatActivity() {
private val TAG = "MainActivity"
private val downloader by lazy { Downloader(this, rssListView) }
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
rssListView.setOnItemClickListener { parent, _, position, _ ->
Log.d(TAG, "rssListView: item @pos $position clicked")
val intent = Intent(this, SecondActivity::class.java)
val item = parent.getItemAtPosition(position) as ViewHolder
Toast.makeText(this, "clicked", Toast.LENGTH_LONG).show()
intent.putExtra("title", item.tvName.text)
intent.putExtra("text", item.tvSummary.text)
this.startActivity(intent)
}
downloader.execute("http://ax.itunes.apple.com/WebObjects/MZStoreServices.woa/ws/RSS/topfreeapplications/limit=25/xml")
}
override fun onDestroy() {
super.onDestroy()
downloader.cancel(true)
}
}
ViewHolder
很简单:
class ViewHolder(view: View) {
val tvName: TextView = view.findViewById(R.id.tvName)
val tvSummary: TextView = view.findViewById(R.id.tvSummary)
}
我的ListView
使用feed_stub.xml
:
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:text="TextView"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:id="@+id/tvName" android:layout_marginTop="8dp"
app:layout_constraintTop_toTopOf="parent" app:layout_constraintEnd_toEndOf="parent"
android:layout_marginEnd="16dp" app:layout_constraintStart_toStartOf="parent"
android:layout_marginStart="16dp" android:textSize="20sp" android:textStyle="bold" android:maxLines="2"
android:clickable="true"/>
<TextView
android:text="TextView"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:id="@+id/tvSummary"
app:layout_constraintTop_toBottomOf="@+id/tvName" app:layout_constraintEnd_toEndOf="parent"
android:layout_marginEnd="16dp" app:layout_constraintStart_toStartOf="parent"
android:layout_marginStart="16dp" android:maxLines="3" android:clickable="true"/>
</android.support.constraint.ConstraintLayout>
最后我的FeedAdapter
:
class FeedAdapter(context: Context,
private val resource: Int, private val feed: MutableList<Any?>)
: ArrayAdapter<Article>(context, resource) {
private val inflater = LayoutInflater.from(context)
override fun getCount(): Int {
return feed.size
}
override fun getView(position: Int, convertView: View?, parent: ViewGroup): View {
val view: View
val viewHolder: ViewHolder
if(convertView == null) {
view = inflater.inflate(resource, parent, false)
viewHolder = ViewHolder(view)
view.tag = viewHolder
} else {
view = convertView
viewHolder = view.tag as ViewHolder
}
val currentEntry = feed[position] as SyndEntry
viewHolder.tvName.text = currentEntry.title
viewHolder.tvSummary.text = currentEntry.description.value
return view
}
override fun isEnabled(position: Int): Boolean {
return true
}
}
大多数操作都是由我的伪控制器执行的:
class Downloader(context: Context, listView: ListView): AsyncTask<String, Void, String>() {
private val TAG = "Downloader"
private var propContext: Context by Delegates.notNull()
private var propListView: ListView by Delegates.notNull()
init {
propContext = context
propListView = listView
}
private lateinit var list: MutableList<Any?>
override fun doInBackground(vararg url: String?): String {
val input = SyndFeedInput()
val feed = input.build(XmlReader(URL(url[0])))
list = feed.entries
return feed.toString()
}
override fun onPostExecute(result: String?) {
super.onPostExecute(result)
val feedAdapter = FeedAdapter(propContext, R.layout.feed_stub, list)
propListView.adapter = feedAdapter
}
}
那么为什么我的ListView
项目不可点击?
为什么我的应用程序在使用java.lang.IndexOutOfBoundsException: Invalid index 10, size is 0
多次单击后崩溃java.lang.IndexOutOfBoundsException: Invalid index 10, size is 0
?
编辑:在FeedAdapter
的getView()
我添加了这个onClickListener:
convertView?.setOnClickListener() { v ->
Log.d(TAG, "getView(): item clicked")
val intent = Intent(context, SecondActivity::class.java)
intent.putExtra("title", currentEntry.title)
intent.putExtra("summary", currentEntry.description.value)
context.startActivity(intent)
}
现在我可以点击它有时候。 我完全不知道为什么会这样,但如果我随机点击,我将获得去另一个活动的预期行为。
这是因为您尚未为viewHolder类实现onClickListener。 你已经实现了listView onItemClick Listener,它不适用于自定义适配器。 对于自定义适配器,您需要在getView方法中实现onClickListener。
override fun getView(position: Int, convertView: View?, parent: ViewGroup): View {
val view: View
val viewHolder: ViewHolder
if(convertView == null) {
view = inflater.inflate(resource, parent, false)
viewHolder = ViewHolder(view)
view.tag = viewHolder
} else {
view = convertView
viewHolder = view.tag as ViewHolder
}
val currentEntry = feed[position] as SyndEntry
viewHolder.tvName.text = currentEntry.title
viewHolder.tvSummary.text = currentEntry.description.value
// set onClickListener for your ConvertView...
convertView.setOnClickListener(context);
return view
}
// now implement your on Click
@Overriden
void onClick(View view){
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.