📜  Android 视图进化——PlaceHolderView

📅  最后修改于: 2022-05-13 01:55:16.644000             🧑  作者: Mango

Android 视图演变 – PlaceHolderView

ListViewGridViewRecyclerViewPesky Adapters统治舞台时,那些日子已经一去不复返了。向 PlaceHolderView 打个招呼????为每个 RecyclerView 添加监听器并实现动态内容是一项繁琐的操作。我们甚至不谈论动画;如果我们必须为嵌套的 Recycler 执行它,那将是一场灾难。如果我们可以通过使用具有附加功能且没有适配器实现的非常基本的接口来轻松简单地替换 ListView、GridView 和 RecyclerView 会怎样?

PlaceHolderView 类的目的是什么?

PlaceHolderView 通过删除所有样板代码来自动化配置 View 适配器的过程。令人难以置信的是,不需要适配器。代码变得令人难以置信的模块化,并且向任何视图或方法添加注释的能力赋予了它很大的灵活性。没有像 findViewById 或 onClickListener 这样难看的代码。

  • 只需一行代码,您就可以为视图对象创建令人惊叹的动画。
  • 内存管理轻而易举。

如何在项目中引入这个伟大的观点?

嗯,答案很简单。 PlaceHolderView 是一个视图,可让您查看正在发生的事情。 PlaceHolderView 库中的一些视图基于 RecyclerView,而其他视图则是从头开始创建的。为了生成绑定类,在构建过程中处理所有注释。有两种不同的变体可供选择。

  1. 在旧版本(分支 1.x)中使用Java反射。
  2. 新版本(分支 2.x)现在支持注释处理。

要将这个库添加到您的 Android 项目,只需在您的 Gradle(项目)中添加这一行,然后点击'Sync'

Kotlin
implementation 'com.mindorks.android:placeholderview:1.0.3'
implementation 'com.android.support:recyclerview-v7:27.1.0'
implementation 'com.mindorks.android:placeholderview:1.0.3'
kapt 'com.mindorks.android:placeholderview-compiler:1.0.3'


XML


XML
 

    
  
        
  
    


Java
@Animate(Animation.ENTER_RIGHT_DESC)
@NonReusable
@Layout(R.layout.gallery_item_big)
public class GeeksImage {
    @View(R.id.imageView) private ImageView imageView;
    private String mUrl;
    private Context mContext;
    private PlaceHolderView mPlaceHolderView;
    public ImageTypeBig(Context context,
                        PlaceHolderView placeHolderView,
                        String url)
    {
        mContext = context;
        mPlaceHolderView = placeHolderView;
        mUrl = url;
    }
    @Resolve private void onResolved()
    {
        Glide.with(mContext).load(mUrl).into(imageView);
    }
    @LongClick(R.id.imageView) private void onLongClick()
    {
  
        mPlaceHolderView.removeView(this);
    }
}


Java
PlaceHolderView mGalleryView = (PlaceHolderView)findViewById(R.id.galleryView);
.setHasFixedSize(true) 
.setItemViewCacheSize(15) 
.setLayoutManager(new GridLayoutManager(this, 3));
mGalleryView.addView(new GeekImage(this.getApplicationContext(), mGalleryView, url1));
.addView(new GeekImage(this.getApplicationContext(), mGalleryView, url2));
.addView(new GeekImage(this.getApplicationContext(), mGalleryView, url3));
.addView(new GeekImage(this.getApplicationContext(), mGalleryView, url4));


然后神奇地将 PlaceHolderView 添加到您当前的 Android 项目中

第 1 步:在 XML 布局中,创建一个 PlaceHolderView。之后,您需要调整您的 XML 文件并添加或替换当前视图,只需按照以下代码片段进行操作

XML


现在第 2 步:创建需要在 PlaceHolder 视图中膨胀的项目的视图

XML

 

    
  
        
  
    

第 3 步:现在在 MainActivity 或 Adapter Activity Java文件中只需绑定方法,以便在运行时识别它们

Java

@Animate(Animation.ENTER_RIGHT_DESC)
@NonReusable
@Layout(R.layout.gallery_item_big)
public class GeeksImage {
    @View(R.id.imageView) private ImageView imageView;
    private String mUrl;
    private Context mContext;
    private PlaceHolderView mPlaceHolderView;
    public ImageTypeBig(Context context,
                        PlaceHolderView placeHolderView,
                        String url)
    {
        mContext = context;
        mPlaceHolderView = placeHolderView;
        mUrl = url;
    }
    @Resolve private void onResolved()
    {
        Glide.with(mContext).load(mUrl).into(imageView);
    }
    @LongClick(R.id.imageView) private void onLongClick()
    {
  
        mPlaceHolderView.removeView(this);
    }
}

第四步。对于这最后一步,只需将视图膨胀到占位符视图,您就可以开始了



Java

PlaceHolderView mGalleryView = (PlaceHolderView)findViewById(R.id.galleryView);
.setHasFixedSize(true) 
.setItemViewCacheSize(15) 
.setLayoutManager(new GridLayoutManager(this, 3));
mGalleryView.addView(new GeekImage(this.getApplicationContext(), mGalleryView, url1));
.addView(new GeekImage(this.getApplicationContext(), mGalleryView, url2));
.addView(new GeekImage(this.getApplicationContext(), mGalleryView, url3));
.addView(new GeekImage(this.getApplicationContext(), mGalleryView, url4));

就是这样!

您刚刚掌握了使用 PlaceHolderView 的艺术,您将永远不会回头看旧的视图选项,现在看起来会低得惊人。

与其使用标有@Resolve 的方法,不如尝试实例化函数Object() { [native code] } 中的任何类。

如果 itemView 包含 PlaceHolderView/ListViews 并且正在使用标记为 @Resolve 的方法添加项目,则最初将列表设为空。这是必要的,因为如果回收的视图包含其他 itemViews 的 PlaceHolderView/ListViews,则可能会插入重复的 viewitems。在将视图添加到标记为 @Resolve 的方法之前,对 PlaceHolderView 使用removeAllViews()