java - Android卡片 View 集合过滤和排序

标签 java android user-interface material-design android-cardview

Card View stack with various sizes

我对如何以网格布局方式使用 CardViews 有很好的理解。但我想开发类似于发布的图像,其中卡片的尺寸可变。我该怎么办?另外,如何以编程方式对卡片进行过滤和排序,Android 文档尚不清楚。

任何资源或代码 fragment 将不胜感激。 谢谢

最佳答案

网格

可以使用 RecyclerView 创建这种动态列表和网格,无论单个项目是什么: CardViewImageView ,这都是您的选择。

在官方文档中,您可以找到一些用于创建基本形式的 recyclerview https://developer.android.com/training/material/lists-cards.html 的清晰且简单的示例。

砌体网格

要在交错网格中布局元素,只需将 StaggeredGridLayoutManager 附加到 RecyclerView :

recyclerView.setLayoutManager(new StaggeredGridLayoutManager(/* # of columns */, /* orientation */));

卡片 View 作为项目

如果您希望 CardView 作为 RecyclerView 中的项目,首先在 app.gradle(Module:app) 中导入必要的依赖项:

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 以不同的方式实现:

不同的类型,不同的 View :如果项目可以明显区分为 2 种或更多类型,则可以创建不同的项目布局和不同的 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,其中包含所有可能的 subview ,并根据当前的 Note 对象有条件地使用 setVisibility() 显示它们。
在某些情况下,这种方法会留下未使用的 View.GONE View ,但从回收的角度来看可能会更有效。

拖动可重新排序,滑动可关闭

如果通过

filter and sort the cards programmatically

您的意思是对 ArrayList<> 或传递给 Adapter 的其他数据结构进行排序,您可以使用 Java Collectionsstreams (流需要 Java 8 才能成为 enabled ),然后调用 adapter.notifyDataSetChanged()

如果您想让用户能够通过拖动或滑动删除来重新排序项目,ItemTouchHelper 就很简单:https://medium.com/@ipaulpro/drag-and-swipe-with-recyclerview-b9456d2b1aaf

关于java - Android卡片 View 集合过滤和排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45045246/

相关文章:

android - 用于 ReamList 和 List 的 Kotlin 序列化序列化器

java - 如何使用文件处理来保存和访问java中的登录信息

iphone - 如何改进 iPhone UI 自动化?

c++ - 如何获取Qt C++中所有可用主题的列表?

java - 枚举和最终变量有什么区别?

java - 为所有jsp页面设置默认的fmt formatNumber maxFractionDigits

java - 也从包含国家代码的号码获取电话号码

java - 如何导出丰富的:dataTable to excel

java - 如何从实体类spring boot生成CRUD存储库类

android - 致命异常 : ThumbnailManager-1 while sharing images to Intent