当前位置: 首页 > 知识库问答 >
问题:

如何使用按钮将元素永久添加到RecyclerView中

竺鸿骞
2023-03-14

我正在制作一个应用程序,其中我有一个recyclerview,其中包含一些固定元素,这些元素在应用程序创建后立即添加。

我想做的是,当按下按钮时,会将一个元素添加到RecyclerView中,而当关闭它并再次启动它时,该新元素仍然保留。

此外,我还使用IndicatorView滚动查看RecyclerView的元素。当我用按钮添加一些元素时,发生在我身上的问题是新元素被创建了,回收视图的大小增加了,但指示视图没有增加,并且我无法滚动查看添加的新元素,此外,当重新启动应用程序时,这些用按钮添加的新元素会自行删除。

recyclerview添加新元素时,如何增加indicatorview的大小?

如何使用按钮上的onClick将元素永久添加到RecolyerView中?

    class MainActivity : AppCompatActivity() {

    private lateinit var viewPager: ViewPager
    private lateinit var pagerAdapter: PageAdapter
    private val animalList = arrayListOf<String>()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        animalList.add("1")
        animalList.add("2")
        animalList.add("3")
        animalList.add("4")
        animalList.add("5")
        animalList.add("6")
        animalList.add("7")
        animalList.add("8")
        animalList.add("9")
        animalList.add("10")
        animalList.add("11")
        animalList.add("12")
        animalList.add("13")
        animalList.add("14")
        animalList.add("15")
        animalList.add("16")
        animalList.add("17")


        var size = animalList.size / 4
        if ((animalList.size % 4 ) > 0)
            size += 1

        pagerAdapter = PageAdapter(supportFragmentManager, size, animalList)

        ADDbutton.setOnClickListener {

            animalList.add("lol")
            animalList.add("añadido jaja")
            Log.i("AAA","Added: "+ animalList +" SIZE: " + animalList.size)
            pagerAdapter.notifyDataSetChanged()
        }
        viewPager = findViewById(R.id.view_pager)

        pagerAdapter = PageAdapter(supportFragmentManager, size, animalList)
        viewPager.adapter = pagerAdapter

    }

}
class ItemFragment : Fragment() {

  override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {

    // Creates the view controlled by the fragment
    val view = inflater.inflate(R.layout.page, container, false)
    val recycler = view.findViewById<RecyclerView>(R.id.recycler)

    // Retrieve and display the movie data from the Bundle
    val args = arguments
    recycler.layoutManager = GridLayoutManager(activity,2,GridLayoutManager.VERTICAL,false)
    recycler.adapter = ItemAdapter(args?.getStringArrayList("items")!!, this.activity!!)

    return view
  }
  companion object {

    fun newInstance(items: ArrayList<String>): ItemFragment {

      val args = Bundle()
      args.putStringArrayList("items", items)

      val fragment = ItemFragment()
      fragment.arguments = args
      return fragment
    }
  }
}
    class PageAdapter(fragmentManager: FragmentManager, private val size: Int, private val items: ArrayList<String>) :
    FragmentStatePagerAdapter(fragmentManager) {

    override fun getItem(position: Int): Fragment {
        val firstItem = ((position + 1) * 4) - 3
        val lastItem = ((position + 1) * 4)
        val itemSet = arrayListOf<String>()
        for (i in firstItem..lastItem) {
            if (i <= items.size)
                itemSet.add(items[i - 1])
        }
        return ItemFragment.newInstance(itemSet)
    }

    override fun getCount(): Int {
        return size
    }
}
    class ItemAdapter(private val items: ArrayList<String>, private val context: Context) : RecyclerView.Adapter<ViewHolder>() {

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
        return ViewHolder(LayoutInflater.from(context).inflate(R.layout.item, parent, false))
    }

    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
        holder?.title?.text = items.get(position)
    }

    override fun getItemCount(): Int {
        return items.size
    }
}

class ViewHolder(view: View) : RecyclerView.ViewHolder(view) {
    val title: TextView = view.title_view
    val item: RelativeLayout = view.item_view

}

null

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:attrs="http://schemas.android.com/tools"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">


    <androidx.viewpager.widget.ViewPager
        android:id="@+id/view_pager"
        android:layout_width="wrap_content"
        android:layout_height="0dp"
        android:layout_marginBottom="32dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.0"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="@+id/guideline2">

    </androidx.viewpager.widget.ViewPager>

    <com.rd.PageIndicatorView
        android:id="@+id/pageIndicatorView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/view_pager"
        app:piv_animationType="worm"
        app:piv_dynamicCount="true"
        app:piv_interactiveAnimation="true"
        app:piv_radius="8dp"
        app:piv_selectedColor="#000000"
        app:piv_unselectedColor="#999999"
        app:piv_viewPager="@id/view_pager"
        attrs:piv_padding="8dp" />

    <androidx.constraintlayout.widget.Guideline
        android:id="@+id/guideline2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        app:layout_constraintGuide_begin="251dp"
        app:layout_constraintTop_toTopOf="parent" />
    
    <Button
        android:id="@+id/ADDbutton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Button"
        app:layout_constraintBottom_toTopOf="@+id/view_pager"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>

null

null

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/item_view"
    android:layout_width="match_parent"
    android:layout_height="100dp"
    android:layout_margin="10dp"
    android:background="@color/teal_700">

    <TextView
        android:id="@+id/title_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_centerInParent="true"
        android:gravity="center"
        android:textColor="@android:color/white"
        android:textSize="18sp"
        android:textStyle="bold" />
</RelativeLayout>

null

null

<?xml version="1.0" encoding="utf-8"?>
<androidx.recyclerview.widget.RecyclerView
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:id="@+id/recycler"
        android:layout_height="match_parent"/>

null

共有1个答案

华良才
2023-03-14

有两个问题。

>

  • 您需要理解持久化和非持久化数据之间的区别。现在只需在内存中创建列表。您还需要将数据存储在某个地方。最合适的位置是数据库、文件或web后端。

    AddButtonClickListener中,您正在向Animallist添加项。但您不在PageAdapter中设置此更新的列表。最简单的方法是使items参数成为PagerAdapter的Consturctor中的public var

    class PageAdapter(
        fragmentManager: FragmentManager,
        private val size: Int,
        public var items: ArrayList<String>) : FragmentStatePagerAdapter(fragmentManager) {
    
    }
    

    更新后的click侦听器如下所示:

    ADDbutton.setOnClickListener {
    
        animalList.add("lol")
        animalList.add("añadido jaja")
        Log.i("AAA","Added: "+ animalList +" SIZE: " + animalList.size)
        pagerAdapter.items = animalList
        pagerAdapter.notifyDataSetChanged()
    }
    

    另外,大小是固定的。在构造函数中传递参数并在getCount方法中使用它:

    override fun getCount(): Int {
        return size
    }
    

    相反,getcount应该根据当前的items.size值计算项目计数。

  •  类似资料:
    • 问题内容: 每当我使用时,都会添加新目录。但是,一旦我关闭python,列表将恢复为以前的值(默认值)。如何将目录永久添加到PYTHONPATH? 问题答案: 你需要将新目录添加到环境变量中PYTHONPATH,并用冒号与其之前的内容分隔开。在任何形式的Unix中,你都可以在启动脚本中执行此操作,该脚本适合于你正在使用的任何shell(.profile或取决于你喜欢的shell),该命令又取决于所

    • 问题内容: 我搜索了在jtable中添加按钮的教程,并从http://tips4java.wordpress.com/2009/07/12/table-button- column/ 找到了一个类文件, 该按钮在哪里设置? 问题答案: 它是通过DefaultTableModel中的数据在表渲染器和编辑器中自动设置的。例如,对于表编辑器,代码为: 表模型的值在哪里。有关详细信息,请参见ButtonC

    • 我在边框的中心有一个标题栏。对于链接哈希图中的每个条目,我想在标题栏中添加一个按钮。这个标题栏已经存在于fxml文件中,并且具有fx: id field dContainer。 如果一次添加一个键值对,按钮将一个接一个出现。但是,当我试图通过从文本文件导入链接的hashmap一次添加它们时,按钮不会出现。它将加载一个条目,然后抛出nullpointerexception。 导入文本文件和将条目添加

    • 问题内容: 我想添加除“确定”按钮以外的另一个按钮,该按钮应仅关闭警报。我希望其他按钮调用某个功能。 我如何在此警报中添加另一个按钮,然后单击该按钮,然后允许它调用一个函数,因此可以说我们希望新按钮进行调用: 问题答案: Swifty方法是使用新的UIAlertController和闭包: 斯威夫特3:

    • 问题内容: 它可以在默认键盘上正常工作,但是我无法在数字键盘上使用它。 有任何想法吗? 问题答案: 据我所知,您不能在键盘部分上添加“完成”按钮。您必须在或中添加一个(如果您使用的是)。 查看文档以获取更多信息。 编辑 :检查此问题以获取有关如何执行此操作的示例。 编辑2 :Swift中的类似示例。 编辑3 :来自编辑2的代码,因为链接可能过期。 斯威夫特4.2

    • 问题内容: 我如何(最好)将nodejs永久安装/添加到(Jenkins)Docker映像中? 结果是同时包含Jenkins和nodejs的docker映像。 目的是将nodejs作为全局工具安装在Jenkins容器中。要获得 nodejs 的 安装文件夹, 必须知道。 我看到了例如这种解决方案,但是Nodejs的安装文件夹是什么? 运行curl -sL https://deb.nodesourc