You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Android原生StackView实现钱包式垂直对齐卡片堆叠效果

问题:基于Android原生StackView实现钱包式垂直堆叠卡片效果

当前已实现原生StackView卡片堆叠效果:
当前效果

希望实现类似钱包中卡片的垂直对齐堆叠效果:
期望效果

需求与限制

  • 卡片需保持原生StackView的滚动交互能力
  • 卡片需垂直对齐堆叠
  • 仅允许使用Android原生StackView组件实现

遇到的问题

尝试设置垂直对齐时,卡片会出现截断现象。

现有代码

ActivityMain.kt

class MainActivity : AppCompatActivity() {

lateinit var cardAdapter: CardAdapter

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

        val stackView = findViewById<StackView>(R.id.stack_view)

        cardAdapter= CardAdapter(numberWord(),numberImage(),R.layout.item_card,this)
        stackView.adapter=cardAdapter
    }


    // the method numberWord() is used to
    // add the text below corresponding images.
    private fun numberWord(): List<String> {
        val word: MutableList<String> = ArrayList()
        word.add("One")
        word.add("Two")
        word.add("Three")
        word.add("Four")
        word.add("Five")
        return word
    }

    // the method numberWord() is used to call
    // the images that are added to the stack.
    private fun numberImage(): List<Int>{
        val image: MutableList<Int> = ArrayList()
        image.add(R.drawable.ic_filter)
        image.add(R.drawable.ic_filter)
        image.add(R.drawable.ic_filter)
        image.add(R.drawable.ic_filter)
        image.add(R.drawable.ic_filter)
        return image
    }
}

activity_main.xml

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

    <!--Add StackView-->
    <StackView
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintTop_toBottomOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        android:id="@+id/stack_view"
        android:layoutDirection="ltr"
        android:layout_width="400dp"
        android:layout_height="300dp" />

</androidx.constraintlayout.widget.ConstraintLayout>

CardAdapter.kt

class CardAdapter 
    (
    var numberWord: List<String>,
    var numberImage: List<Int>,
    var itemLayout: Int,
    var c: Context
) : ArrayAdapter<Any?>(
    c, itemLayout, numberWord
) {
    // getCount() is called to return
    // the total number of words to be used
    override fun getCount(): Int {
        return numberWord.size
    }

    // getView() is called to get position, 
    // parent and view of the images.
    override fun getView(position: Int, convertView: View?, parent: ViewGroup): View {
        var convertView = convertView
        if (convertView == null) {
            convertView = LayoutInflater.from(parent.context).inflate(itemLayout, parent, false)
        }
        val word = numberWord[position]
        val image = numberImage[position]
        val textView = convertView!!.findViewById<TextView>(R.id.text_view)
        val imageView = convertView.findViewById<ImageView>(R.id.image_view)
        textView.text = word
        imageView.setImageResource(image)
        return convertView
    }
}

item_card.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="300dp"
    android:layout_height="180dp"
    android:background="@drawable/border_bg"
    android:gravity="center"
    android:orientation="vertical">
  
    <ImageView
        android:id="@+id/image_view"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/ic_filter" />
    
    <TextView
        android:id="@+id/text_view"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="40sp"
        android:textStyle="bold" />

</LinearLayout>

参考资料

可参考Android原生StackView官方文档。

寻求仅使用原生StackView组件的解决方法。


内容的提问来源于stack exchange,提问作者Anish Vahora

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 11:15:36