Card View stack with various sizes
我对如何以网格布局方式使用CardView有很好的理解。但我想开发类似于发布的图像,其中卡片的大小可变。我该怎么做?此外,如何以编程方式过滤和排序卡片,Android文档不明确。
将非常感谢任何资源或代码段。 感谢
答案 0 :(得分:1)
可以使用RecyclerView
创建这种动态列表和网格,无论单个项目是什么:CardView
,ImageView
,这都是您的选择。
在官方文档中,您可以找到一些清晰简单的示例,用于创建Recyclerview https://developer.android.com/training/material/lists-cards.html的基本形式。
要在交错网格中布置元素,只需将StaggeredGridLayoutManager
附加到RecyclerView
:
recyclerView.setLayoutManager(new StaggeredGridLayoutManager(/* # of columns */, /* orientation */));
如果您希望CardView
作为RecyclerView
中的项首先在app.gradle(模块:应用)中导入必要的依赖项:
dependencies {
...
compile 'com.android.support:cardview-v7:21.0.+'
compile 'com.android.support:recyclerview-v7:21.0.+'
}
然后创建单个项目的布局文件(即card_item.xml):
<android.support.v7.widget.CardView
xmlns:card_view="http://schemas.android.com/apk/res-auto"
android:id="@+id/card_view"
android:layout_width="200dp"
android:layout_height="200dp"
card_view:cardCornerRadius="4dp"
card_view:cardElevation="3dp">
<TextView
android:id="@+id/note_text"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<!-- other note contents -->
</android.support.v7.widget.CardView>
并在之前创建的适配器中对其进行充气:
@Override
public NotesAdapter.ViewHolder onCreateViewHolder(ViewGroup parent,
int viewType) {
CardView v = (CardView) LayoutInflater.from(parent.getContext())
.inflate(R.layout.card_item, parent, false);
ViewHolder vh = new ViewHolder(v);
return vh;
}
在你提供的图片中,笔记和统计数据非常不同:有些有图片,有些只有文字,有些是复选框......这可以用RecyclerView
以不同的方式实现:
不同的类型,不同的观点:如果项目在两种或更多种类型中可以清楚地区分,您可以创建不同的项目布局和不同的ViewHolder
:
class ViewHolderType1 extends RecyclerView.ViewHolder {
public ViewHolderType1(View itemView){
// ...
}
}
class ViewHolderType2 extends RecyclerView.ViewHolder {
public ViewHolderType2(View itemView){
// ...
}
}
@Override
public int getItemViewType(int position) {
// The Note class could memorize the type
return mNotes.get(position).getType();
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
switch (viewType) {
case 0: return new ViewHolderType1(...);
case 1: return new ViewHolderType2(...);
}
}
@Override
public void onBindViewHolder(final RecyclerView.ViewHolder holder, final int position) {
switch(holder.getItemViewType()) {
case 0:
ViewHolderType1 viewHolder1 = (ViewHolderType1) holder;
// Here you have access to type specific views
// to fill with data
break;
case 1:
ViewHolderType2 viewHolder2 = (ViewHolderType2) holder;
// ...
break;
}
}
替代方法可能只创建一种CardView
类型,其中包含所有可能的子视图,并根据当前的Note对象有条件地显示setVisibility()
。
在某些情况下,这种方法将使View.GONE
视图未被使用,但从回收的角度来看可能会更有效。
如果通过
以编程方式过滤和排序卡片
你的意思是对传递给ArrayList<>
的{{1}}或其他数据结构进行排序,你可以用Java Adapter
或streams对它进行排序(流需要Java 8为{ {3}})然后拨打Collections
。
如果您想让用户通过拖动来重新排序项目,或者通过轻扫adapter.notifyDataSetChanged()
来删除项目,这样就很简单:enabled。