【问题标题】:Android card view collections filtering and sorting [closed]Android卡片视图集合过滤和排序[关闭]
【发布时间】:2017-12-16 03:32:42
【问题描述】:

Card View stack with various sizes

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

任何资源或代码 sn-ps 将不胜感激。 谢谢

【问题讨论】:

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


    【解决方案1】:

    网格

    那种动态列表和网格可以用RecyclerView来创建,不管单项是什么:CardViewImageView,那是你的选择。

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

    砌体网格

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

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

    作为项目的 CardViews

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

    dependencies {
        ...
        compile 'com.android.support:cardview-v7:21.0.+'
        compile 'com.android.support:recyclerview-v7:21.0.+'
    }
    

    然后创建单个item的布局文件(即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以不同的方式实现:

    不同的类型,不同的视图:如果项目在 2 种或更多类型中清晰可辨,您可以创建不同的项目布局和不同的ViewHolders:

    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&lt;&gt; 或传递给Adapter 的其他数据结构进行排序,您可以使用Java Collectionsstreams 进行排序(流需要Java 8 为enabled),然后调用@987654345 @。

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

    【讨论】:

    • 感谢您的帮助。我不知道布局在 API 语言中被称为“StaggeredGridLayoutManager”。这对我有很大帮助。
    猜你喜欢
    • 2016-08-25
    • 1970-01-01
    • 2014-07-11
    • 1970-01-01
    • 2020-03-21
    • 1970-01-01
    • 2014-04-16
    • 2020-07-05
    • 2013-05-11
    相关资源
    最近更新 更多