Java Android卡视图集合筛选和排序

Java Android卡视图集合筛选和排序,java,android,user-interface,material-design,android-cardview,Java,Android,User Interface,Material Design,Android Cardview,我非常了解如何以网格布局方式使用CardView。但我想发展类似于张贴图像,在那里卡的大小是可变的。我该怎么办?另外,如何以编程方式过滤和排序卡片,Android文档还不清楚 任何资源或代码片段都将不胜感激。 谢谢网格 这种动态列表和网格可以使用RecyclerView创建,无论单个项目是什么:CardView,ImageView,这是您的选择 在官方文档中,您可以找到一些创建基本形式的recyclerview的清晰简单的示例 砌体网格 要在交错网格中布局元素,只需将交错网格布局管理器附加到回收

我非常了解如何以网格布局方式使用CardView。但我想发展类似于张贴图像,在那里卡的大小是可变的。我该怎么办?另外,如何以编程方式过滤和排序卡片,Android文档还不清楚

任何资源或代码片段都将不胜感激。 谢谢

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

在官方文档中,您可以找到一些创建基本形式的recyclerview的清晰简单的示例

砌体网格 要在交错网格中布局元素,只需将
交错网格布局管理器
附加到
回收视图

recyclerView.setLayoutManager(new StaggeredGridLayoutManager(/* # of columns */, /* orientation */));
卡片视图作为项目 如果您希望
CardView
s作为
RecyclerView
中的项目,首先在app.gradle(模块:app)中导入必要的依赖项:

然后创建单个项目的布局文件(即card_item.xml):

不同类型的项目 在您提供的图像中,注释和统计信息非常不同:有些有图像,有些只有文本,有些复选框。。。这可以通过使用
RecyclerView
以不同的方式实现:

不同的类型,不同的视图:如果项目在两种或更多类型中可以清晰区分,则可以创建不同的项目布局和不同的
视图持有者
s:

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()
有条件地显示它们。
在某些情况下,这种方法会使
视图不被使用。但从回收的角度来看,可能会更有效率

拖动可重新排序,滑动可取消排序 如果

以编程方式筛选和排序卡片

您的意思是排序传递给
适配器的
数组列表
或其他数据结构
您可以使用Java
集合
或(流需要Java 8),然后调用
适配器。notifyDataSetChanged()


如果您想让用户能够通过拖动或通过滑动
ItemTouchHelper
进行删除来对项目进行重新排序,则操作简单:。

谢谢您的帮助。我不知道这个布局在API语言中被称为“StaggedGridLayoutManager”。这对我有很大帮助。
<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;
}
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;
    }
}