smart-adapters, 用于 listview/recyclerview的通用和可以交换适配器轻松完成

分享于 

10分钟阅读

GitHub

  繁體 雙語
Generic and interchangeable Adapters for ListView / RecyclerView
  • 源代码名称:smart-adapters
  • 源代码网址:http://www.github.com/mrmans0n/smart-adapters
  • smart-adapters源代码文档
  • smart-adapters源代码下载
  • Git URL:
    git://www.github.com/mrmans0n/smart-adapters.git
    Git Clone代码到本地:
    git clone http://www.github.com/mrmans0n/smart-adapters
    Subversion代码到本地:
    $ svn co --depth empty http://www.github.com/mrmans0n/smart-adapters
    Checked out revision 1.
    $ cd repo
    $ svn up trunk
    
    智能适配器库

    Build StatusAndroid Arsenal

    打算简化 listview/gridview和RecyclerView适配器使用情况的Android库项目。 你不必再编写任何无聊的适配器 !

    它有助于保持样板的最小化,并且增加了 baseadapter/recyclerview适配器样式的可以能性。 它还允许对相同列表或者网格使用多种模型/视图类型的无痛使用- 只需在模型对象和视图对象之间添加不同的。

    以前的一部分是 nl工具包。

    添加到你的项目中

    将这里添加到你的依赖项:

    compile 'io.nlopez.smartadapters:library:1.3.1'

    用法

    命令行适配器创建

    如果使用一个对象,如 Tweet>,那么就简单了:

    SmartAdapter.items(myObjectList).map(Tweet.class, TweetView.class).into(myListView);

    我们需要准备一位视图(。TweetView中的) 注释。 请阅读 "准备视图类"部分。

    如果需要做更复杂的列表,用不同的模型映射到不同的视图,我们只需要添加更多的map 调用。 以下是一个示例:

    SmartAdapter.items(myObjectList)
    . map(Tweet.class, TweetView.class)
    . map(String.class, ListHeaderView.class)
    . map(User.class, UserView.class)
    . into(myListView);

    你可以将基于AbsListView的控件( ListView,GridView ) 或者RecyclerView传递给 into 方法。 类将使用适当的适配器类,具体取决于你在其中传递的控件。

    如果希望使用空 array 初始化适配器,我们可以更改 empty()items(...) 调用。

    返回适配器之前的调用,因这里如果要存储该适配器,则可以在以后进行操作。 例如:

    MultiAdapter adapter =SmartAdapter.empty().map(Tweet.class, TweetView.class).into(myListView);// We can add more stuff. The list will update and refresh its views.adapter.addItems(moreItems);// And delete it if we want!adapter.clearItems();

    准备你的视图类

    视图类必须实现BindableLayout接口,因此我们得到了将模型数据绑定到视图的公共入口点。

    如果看起来像很多工作,但你有一些已经实现的基类,根据你想要使用的基础视图。 你可以看一下示例项目中的一些实现示例。

    • BindableFrameLayout
    • BindableLinearLayout ( 你必须在这里实现 getOrientation() )
    • BindableRelativeLayout
    • adventurous adventurous adventurous BindableViewLayout
    publicclassTweetViewextendsBindableFrameLayout<Tweet> {
     // [...]publicTweetView(Contextcontext) {
     // This is the constructor that should be implemented, because it's the one used internally// by the default builder.super(context);
     }
     @OverridepublicintgetLayoutId() {
     // This is mandatory, and should return the id for the view layout of this viewreturnR.layout.view_tweet;
     }
     @OverridepublicvoidonViewInflated() {
     // Here we should assign the views or use ButterKnifeButterKnife.inject(this);
     // Fixes some horizontal fill layout setLayoutParams(newLayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT));
     }
     @Overridepublicvoidbind(Tweettweet) {
     // In here we assign the model information values to our view widgets// Examples: tweetText.setText(tweet.getText());
     authorText.setText(tweet.getAuthor());
     // and so on! }
    }

    我使用 Android Studio 模板创建 BindableLayouts。 你可以在这里找到它,。

    一个不错的副作用是我们可以在没有 Having的情况下来回使用 switch 或者RecyclerView来改变这些视图中的任何内容。 我们还对这些视图小部件的事件进行了更细粒度的控制。 我们可以在行中添加不同的onClick事件,到它里面的某个按钮等等。

    在实例化适配器的任何地方,我们都可以使用特定的调用通知监听器,而不是在视图代码( 那是非常混乱的) 中全部执行。

    publicvoid bind(MyModel model) {
     // Set a global click handler setOnClickListener(newOnClickListener() {
     @OverridepublicvoidonClick(Viewv) {
     notifyItemAction(ROW_PRESSED);
     }
     });
     favoriteButton.setOnClickListener(newOnClickListener() {
     @OverridepublicvoidonClick(Viewv) {
     notifyItemAction(FAVORITE_PRESSED);
     }
     });
     }

    指定侦听器

    如果我们想在适配器级别控制视图类中的任何事件,我们可以这样做。 我们只需要向适配器添加一个监听器,它可以在instantaiting或者。

    例如:

    SmartAdapter.items(myObjectList)
    . map(Tweet.class, TweetView.class)
    . listener(myViewListener)
    . into(myListView);

    侦听器将如下所示:

    myViewListener =newViewEventListener<Tweet>() {
     @OverridepublicvoidonViewEvent(intactionId, Tweetitem, Viewview) {
     // actionId would be any constant value you used in notifyItemAction. }
    };

    使用自定义生成器的高级用法

    如果要根据单个模型的数据或者更为复杂的数据显示不同的单元格,可以为类指定BindableLayoutBuilder接口。 只要在BindableLayoutBuilder中为viewType方法提供特定的实现,库就允许映射到同一视图对象的多个视图。

    这里我们有一个自定义BindableLayoutBuilder的例子,为一个假设的例子,视图类依赖于对象的值。 理想情况下,仅覆盖viewType方法并根据所需的视图类返回值。 同样,在allowsMultimapping方法中,对同一类型的对象的多个视图也必须是 return true。

    publicclassTweetBindableLayoutBuilderextendsDefaultBindableLayoutBuilder {
     @OverridepublicClass<? extends BindableLayout>viewType(@NonNullObjectitem, intposition, @NonNullMappermapper) {
     if (item instanceofTweet) {
     // All the multiple bindings must be dealt with here and NOT get into the fallbackTweet tweet = (Tweet) item;
     if (tweet.hasGallery()) {
     returnTweetGalleryView.class;
     } elseif (tweet.hasImage()) {
     returnTweetImageView.class;
     } elseif (tweet.hasEmbeds()) {
     returnTweetEmbedView.class;
     } else {
     returnTweetView.class;
     }
     }
     // With this fallback we return control for all the other cases to be handled as the default use.returnsuper.viewType(item, position, mapper);
     }
     @OverridepublicbooleanallowsMultimapping() {
     returntrue;
     }
    }

    我们可以像这样将它添加到适配器:

    SmartAdapter.items(myObjectList)
    . listener(myViewListener)
    . map(Tweet.class, TweetView.class)
    . map(Tweet.class, TweetGalleryView.class)
    . map(Tweet.class, TweetImageView.class)
    . map(Tweet.class, TweetEmbedView.class)
    . map(OtherThing.class, OtherThingView.class)
    . builder(newTweetBindableLayoutBuilder())
    . into(myListView);

    你已经在示例中有一个关于这个特定案例的例子。

    还可以在默认生成器中查看有关如何在library包含库中实现 builder 的更多示例。

    构建器背后的思想是,给定对象及其类,就可以自己创建视图类并返回到适配器。

    常见问题

    如果你已经在项目中使用 RecyclerView,并且编译问题,则可以尝试将传递属性设置为 false:

    compile ('io.nlopez.smartadapters:library:1.3.1') {
     transitive =false}

    如果行没有水平填充 RecyclerView,则应指定LayoutParams以进行 MATCH_PARENT。

    setLayoutParams(newLayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT));

    请注意,LayoutParams的类型可以能必须根据你在膨胀视图的位置进行更改。 如果你在这里获得了很多信息,你知道你必须在这里改变LayoutParms的类型。

    欢迎使用 fork。补丁和其他反馈。

    创建者

    Nacho López Blog Blog Blog Blog Blog Blog Blog。

    许可证

    MIT许可证


    INT  lis  列表  ADA  generic  适配器  
    相关文章