如何在Listview
中使用Fragment
。我在Activity
中实现了几乎相似的代码,它完美地运行。但是在Fragment
的情况下,我只修改了一点以避免Android Studio
显示的错误。但是,它不在这里工作。
这是我的代码:
class FragmentMascot : Fragment() {
override fun onCreateView(inflater: LayoutInflater?, container: ViewGroup?, savedInstanceState: Bundle?): View? {
val view= inflater!!.inflate(R.layout.fragment_mascot, container, false)
val listview = view.findViewById<ListView>(R.id.maskot_list)
//listview.adapter = MaskotAdapter(this) -> this does't work in fragment but worked in activity
listview.adapter = MaskotAdapter(context)
return view
}
我的MaskotAdapter
课程是:
private class MaskotAdapter(context: Context): BaseAdapter() {
private val mContext: Context
//values can be entered from database too.
private val maskot_names_list = arrayListOf<String>("","","","")
private val maskot_details_list = arrayListOf<String>("","","","")
private val maskot_images_list = arrayListOf<Int>(0,0,0,0)
init {
this.mContext = context
}
//row count
override fun getCount(): Int {
return maskot_names_list.size //To change body of created functions use File | Settings | File Templates.
}
override fun getItem(position: Int): Any {
return "test String" //To change body of created functions use File | Settings | File Templates.
}
override fun getItemId(position: Int): Long {
return position.toLong()//To change body of created functions use File | Settings | File Templates.
}
//renders each row
override fun getView(position: Int, convertView: View?, parent: ViewGroup?): View {
val layoutInflater = LayoutInflater.from(mContext)
val maskot_row=layoutInflater.inflate(R.layout.activity_maskot_fragment, parent, false)
val maskot_names = maskot_row.findViewById<TextView>(R.id.maskot_name)
maskot_names.text=maskot_names_list.get(position)
// showing ??? if maskot name is empty
// and giving it a little padding top, to not to keep it on top
if(maskot_names.text=="")
{
maskot_names.text="???"
maskot_names.setPadding( 0, 16, 0, 0)
}
val maskot_details = maskot_row.findViewById<TextView>(R.id.maskot_details)
maskot_details.text=maskot_details_list.get(position)
if(maskot_images_list.get(position)!=0)
{
// showing particular maskot image if maskot image is not empty
val maskot_image = maskot_row.findViewById<ImageView>(R.id.maskot_image)
maskot_image.setImageResource(maskot_images_list.get(position))
}
return maskot_row
}
}
答案 0 :(得分:1)
我终于找到了答案。我们也需要将活动作为参数。所以,在问题中提到的代码中:
listview.adapter = MaskotAdapter(context)
将更改为listview.adapter = MaskotAdapter(上下文,活动) 和
private class MaskotAdapter(context: Context): BaseAdapter() {
行应改为
private class MaskotAdapter(context: Context, activity: Activity): BaseAdapter() {
答案 1 :(得分:1)
在这里,活动参数非常重要。您可以像这样更改:
listview.adapter = MaskotAdapter(context)
将更改为
listview.adapter = MaskotAdapter(context,activity)
和
private class MaskotAdapter(context: Context): BaseAdapter() {
行应更改为
private class MaskotAdapter(context: Context, activity: Activity): BaseAdapter() {
希望它会起作用。但是,请尽可能移至recyclerView,因为这样可以提高内存效率。
答案 2 :(得分:0)
您应该在实例化适配器中使用Activity上下文(getActivity)
。片段没有上下文。
答案 3 :(得分:0)
列表不显示?或者有致命的例外吗?
和
使用RecyclerView。 每次调用膨胀而不使用getView()中的holder模式是一种低效的方式。