From 35e226c4a0028388664a32e39a7703a9c90efb63 Mon Sep 17 00:00:00 2001 From: Kale Date: Fri, 29 Jan 2016 21:18:04 +0800 Subject: [PATCH] =?UTF-8?q?=E7=BB=99=E5=87=BA=E4=BA=86viewpager=E6=87=92?= =?UTF-8?q?=E5=8A=A0=E8=BD=BD=E5=92=8C=E6=AD=A3=E5=B8=B8=E5=8A=A0=E8=BD=BD?= =?UTF-8?q?=E7=9A=84=E4=BE=8B=E5=AD=90=EF=BC=8C=E5=AF=B9databinding?= =?UTF-8?q?=E5=81=9A=E7=9A=84viewdata=E8=BF=9B=E8=A1=8C=E4=BA=86=E8=87=AA?= =?UTF-8?q?=E5=8A=A8=E7=BB=91=E5=AE=9A=E7=9A=84=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 125 +++++++++++------- .../java/kale/adapter/BasePagerAdapter.java | 48 +++---- .../java/kale/adapter/CommonPagerAdapter.java | 37 ++++-- .../java/kale/adapter/CommonRcvAdapter.java | 10 +- .../commonadapter/ListViewTestActivity.java | 4 +- .../commonadapter/ViewPagerTestActivity.java | 34 ++++- .../kale/commonadapter/item/ButtonItem.java | 16 ++- ...ttonViewModel.java => ButtonViewData.java} | 17 ++- .../kale/commonadapter/item/ImageItem2.java | 32 ++++- .../kale/commonadapter/item/TextItem.java | 3 + app/src/main/res/layout/demo_item_button.xml | 3 +- app/src/main/res/layout/demo_item_image.xml | 1 + app/src/main/res/layout/demo_item_text.xml | 3 +- 13 files changed, 214 insertions(+), 119 deletions(-) rename app/src/main/java/kale/commonadapter/item/{ButtonViewModel.java => ButtonViewData.java} (51%) diff --git a/README.md b/README.md index 6155851..14c611a 100644 --- a/README.md +++ b/README.md @@ -2,46 +2,55 @@ [![Android Arsenal](https://img.shields.io/badge/Android%20Arsenal-CommonAdapter-brightgreen.svg?style=flat)](http://android-arsenal.com/details/1/1861) -通过封装BaseAdapter和RecyclerView.Adapter得到的通用的,简易的Adapter对象。 +通过封装BaseAdapter和RecyclerView.Adapter得到的通用、简易的Adapter对象。 +### 添加依赖 -### 添加依赖 1.在项目外层的build.gradle中添加JitPack仓库 -``` +``` repositories { maven { url "https://jitpack.io" } } -``` +``` + 2.在用到的项目中添加依赖 -``` +``` dependencies { compile 'com.github.tianzhijiexian:CommonAdapter:1.1.5' } ``` -### 示例 + +### 已解决的问题 + +- [x] 提升item的独立性,完美支持item被多处复用 +- [x] item会根据type来做自动复用 +- [x] 支持多种类型的item +- [x] 仅仅会在item创建完毕后调用一次配置item的操作,不会避免重复建立监听器 +- [x] 一个item仅会触发一次绑定视图的操作 +- [x] ​支持dataBinding和其他第三方注入框架 +- [x] 提供了getView()方法来代替findViewById +- [x] 支持通过item的构造方法来传入Activity对象 +- [x] 支持通过item的构造方法来传入item中事件的回调 +- [x] 提供了getConvertedData(data, type)方法来对item传入的数据做转换,方便拆包和提升item的复用性 +- [x] 支持viewpager的正常加载模式和懒加载 +- [x] 支持快速将listview的适配器切换为recyclerView的适配器 +- [ ] 支持recyclerView的添加头部和底部(下个版本支持) + +### 示例 + ![](./demo/demo.png) -### ListView+GridView的通用适配器——CommonAdapter +---- -**1. Adapter中的Item实现`AdapterItem`这个接口** +### 零、重要接口 -接口的源码如下: +adapter的item必须实现此接口,接口源码如下: -```java -/** - * Adapter的所有item必须实现的接口.
- * - * 通过{@link #getLayoutResId()}初始化view;
- * 在{@link #bindViews(View)}中就初始化item的内部视图
- * 在{@link #handleData(Object, int)}中处理每一行的数据

- * - * @author Jack Tony - * @date 2015/5/15 - */ +```java public interface AdapterItem { /** @@ -69,11 +78,11 @@ public interface AdapterItem { void handleData(T model, int position); } -``` - +``` + 例子: -```java +```java public class TextItem implements AdapterItem { @Override @@ -95,42 +104,59 @@ public class TextItem implements AdapterItem { public void handleData(DemoModel model, int position) { textView.setText(model.content); } - } -``` +``` -**2. 通过继承`CommonAdapter`来实现适配器** -现在所需要做的只剩下继承CommonAdapter实现自己的适配器了,下面是一个简单的例子: +### 一、ListView+GridView的通用适配器——CommonAdapter +只需继承CommonAdapter便可实现适配器: ```java listView.setAdapter(new CommonAdapter(data) { - @Override public AdapterItem createItem(Object type) { return new TextItem(); } }); ``` -### RecyclerView的通用适配器——CommonRcvAdapter -1. Adapter中的每个Item需要实现`AdapterItem`这个接口(同上) -2. 通过继承`CommonRcvAdapter`来实现适配器 +### 二、RecyclerView的通用适配器——CommonRcvAdapter +通过继承`CommonRcvAdapter`来实现适配器: + +```java +mAdapter = new CommonRcvAdapter(data) { + public AdapterItem createItem(Object type) { + return new TextItem(); + } +}; +``` + +### 三、ViewPager的通用适配器——CommonPagerAdapter +通过继承`CommonPagerAdapter`来实现适配器: + +```java +viewPager.setAdapter(new CommonPagerAdapter() { + public AdapterItem createItem(Object type) { + return new TextItem(); + } +}); +``` - -### 设计思路 -其实现在的效果和原本的adapter差不多,只是做了点小的重构,这种重构最终保持了和原本一样的可扩展性。下面我来分析下具体的细节: +### 设计思路 **1. Adapter** -因为adapter原始的代码很多,所以如果你把adapter作为activity的内部类的话很别扭,而且如果adapter中如果有多个类型的Item,你就必须在getView()中写很多if-else语句,而且里面都是一些设置view的方法,很乱,你要更换Item的话还需要去删减代码,而现在我让adapter的代码量减少到一个方法,如果你需要更新item或者添加一个新的item你直接在initItem中返回即可,实现了可插拔化。最关键的是item现在作为一个独立的对象,内部view的设置完全可以和adapter独立出来。 + +因为adapter原始的代码很多,所以如果你把adapter作为activity的内部类的话很别扭,而且如果adapter中如果有多个类型的Item,你就必须在getView()中写很多if-else语句,而且里面都是一些设置view的方法,很乱。你要更换Item的话还需要去删减代码,而现在我让adapter的代码量减少到一个方法,如果你需要更新item或者添加一个新的item你直接在initItem中返回即可,实现了可插拔化。最关键的是item现在作为一个独立的对象,item内部的设置完全可以和adapter独立出来。 **2. AdapterItem** -和原来方式最为不同的就是我把adapter的item作为了一个实体,这种方式借鉴了RecyclerView的ViewHolder的设计。把Item作为实体的好处有很多,就不细说了。 -**3. One more thing** -如果你是一个倾向于MVP的开发者,你完全可以把原本项目中独立的adapter变成activity的内部类,这样做增加了adapter和activity的聚合性,同时减少了项目中的众多adapter类。这样的坏处是什么呢?activity现在和adapter的聚合度高了,而现在adapter中仅仅有view,这样activity和view的聚合度也会很高。如果你认为activity是一个controler,那么请千万不要用我的做法,因为这样会让你的项目层次出现混乱。但如果你认为activity就是一个view管理对象,逻辑是写在presenter中的,那么你可以放心的用这种方式。欢迎大家来继续讨论。 +和原来方式最为不同的就是我把adapter的item作为了一个实体,这种方式借鉴了RecyclerView的ViewHolder的设计。把Item作为实体的好处有很多,比如复用啊,封装啊,其余的就不细说了。 +**3. 分层** + +在使用过程中,我发现如果adapter放在view层,那就会影响view层的独立性。因为adapter中有很多数据处理,比如通过type选择item,数据的拆包、转换等操作。于是我还是推荐把adapter放在mvp的p层,或者是mvvm的vm层。通过在实际的项目中使用来看,放在vm或p层的效果较好,view的复用也比较好做。 ## 开发者 + ![](https://avatars3.githubusercontent.com/u/9552155?v=3&s=460) Jack Tony: @@ -138,18 +164,19 @@ Jack Tony: ## License - Copyright 2015 Jack Tony +``` - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at +Copyright 2015 Jack Tony - http://www.apache.org/licenses/LICENSE-2.0 +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. + http://www.apache.org/licenses/LICENSE-2.0 - +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +``` diff --git a/adapter/src/main/java/kale/adapter/BasePagerAdapter.java b/adapter/src/main/java/kale/adapter/BasePagerAdapter.java index 80dba2b..da224a6 100644 --- a/adapter/src/main/java/kale/adapter/BasePagerAdapter.java +++ b/adapter/src/main/java/kale/adapter/BasePagerAdapter.java @@ -1,5 +1,6 @@ package kale.adapter; +import android.support.annotation.NonNull; import android.support.v4.util.ArrayMap; import android.support.v4.view.PagerAdapter; import android.support.v4.view.ViewPager; @@ -19,11 +20,9 @@ */ public abstract class BasePagerAdapter extends PagerAdapter { - public static final String TAG = "BasePagerAdapter"; - private int mChildCount = 0; - protected T currentItem; + protected T currentItem = null; /** * 这的cache的最大大小是:type * pageSize @@ -39,16 +38,17 @@ public BasePagerAdapter() { */ @Override public boolean isViewFromObject(View view, Object obj) { - return view == getViewFromItem((T) obj); + return view == getViewFromItem((T) obj, 0); } @Override public T instantiateItem(ViewGroup container, int position) { - T item = mCache.getItem(getItemType(position)); + T item = mCache.getItem(getItemType(position)); // get item from type if (item == null) { item = createItem((ViewPager) container, position); } - View view = getWillBeAddedView(item, position); + // 通过item得到将要被add到viewpager中的view + View view = getViewFromItem(item, position); if (view.getParent() != null) { ((ViewGroup) view.getParent()).removeView(view); } @@ -69,7 +69,10 @@ public void setPrimaryItem(ViewGroup container, int position, Object object) { public void destroyItem(ViewGroup container, int position, Object object) { T item = (T) object; Object type = getItemType(position); - container.removeView(getWillBeDestroyedView(item, position)); + + // 缓存的大小不够时,会移出最早的item。 + // 现在通过item拿到其中的view,然后remove掉 + container.removeView(getViewFromItem(item, position)); mCache.putItem(type, item); } @@ -101,25 +104,25 @@ protected PagerCache getCache() { return mCache; } - /** - * @return obj中的view对象 - */ - protected abstract View getViewFromItem(T item); - - /** - * 得到初始化后的item中的view - */ - protected abstract View getWillBeAddedView(T item, int position); + /////////////////////////////////////////////////////////////////////////// + // 交给子类的实现 + /////////////////////////////////////////////////////////////////////////// /** - * 当{@link ViewPager#getOffscreenPageLimit()}缓存的大小不够时,会移出最早显示的item + * 这里要实现一个从item拿到view的规则 * - * @return 被移除的item中view的对象(如果item是view那么直接返回即可) + * @param item 包含view的item对象 + * @param position item所处的位置 + * @return item中的view对象 */ - protected abstract View getWillBeDestroyedView(T item, int position); + protected abstract + @NonNull + View getViewFromItem(T item, int position); /** - * 当缓存中无法得到所需item时才会调用,这返回需要放入容器的view。 + * 当缓存中无法得到所需item时才会调用 + * + * @return 需要放入容器的view */ protected abstract T createItem(ViewPager viewPager, int position); @@ -137,7 +140,7 @@ public PagerCache() { /** * @param type item type - * @return + * @return cache中的item,如果拿不到就返回null */ public T getItem(Object type) { Queue queue; @@ -149,8 +152,7 @@ public T getItem(Object type) { } /** - * @param type item type - * @param item item + * @param type item's type */ public void putItem(Object type, T item) { Queue queue; diff --git a/adapter/src/main/java/kale/adapter/CommonPagerAdapter.java b/adapter/src/main/java/kale/adapter/CommonPagerAdapter.java index 225d2b9..3d50a85 100644 --- a/adapter/src/main/java/kale/adapter/CommonPagerAdapter.java +++ b/adapter/src/main/java/kale/adapter/CommonPagerAdapter.java @@ -21,13 +21,20 @@ public abstract class CommonPagerAdapter extends BasePagerAdapter imple private List mDataList; - LayoutInflater mInflater; + private LayoutInflater mInflater; + + private boolean mIsLazy = false; public CommonPagerAdapter(@Nullable List data) { + this(data, false); + } + + public CommonPagerAdapter(@Nullable List data, boolean isLazy) { if (data == null) { data = new ArrayList<>(); } mDataList = data; + mIsLazy = isLazy; } @Override @@ -35,25 +42,27 @@ public int getCount() { return mDataList.size(); } + @NonNull @Override - protected View getViewFromItem(View item) { - return item; - } - - @Override - protected View getWillBeAddedView(View item, int position) { + protected View getViewFromItem(View item, int pos) { return item; } @Override - protected View getWillBeDestroyedView(View item, int position) { - return item; + public View instantiateItem(ViewGroup container, int position) { + View view = super.instantiateItem(container, position); + if (!mIsLazy) { + AdapterItem item = (AdapterItem) view.getTag(R.id.tag_item); + // 如果不是懒加载,那么在初始化时就做数据的处理 + item.handleData(getConvertedData(mDataList.get(position), getItemType(position)), position); + } + return view; } @Override public void setPrimaryItem(ViewGroup container, int position, @NonNull Object object) { - // 这里应该放置数据更新的操作 - if (object != currentItem) { + if (mIsLazy && object != currentItem) { + // 如果是懒加载,那么这里应该放置数据更新的操作 AdapterItem item = (AdapterItem) ((View) object).getTag(R.id.tag_item); item.handleData(getConvertedData(mDataList.get(position), getItemType(position)), position); } @@ -67,12 +76,16 @@ protected View createItem(ViewPager viewPager, int position) { } AdapterItem item = createItem(getItemType(position)); View view = mInflater.inflate(item.getLayoutResId(), null); - view.setTag(R.id.tag_item, item); // 万一你要用到这个item可以通过这个tag拿到 + view.setTag(R.id.tag_item, item); item.bindViews(view); item.setViews(); return view; } + public void setIsLazy(boolean isLazy) { + mIsLazy = isLazy; + } + @NonNull @Override public Object getConvertedData(T data, Object type) { diff --git a/adapter/src/main/java/kale/adapter/CommonRcvAdapter.java b/adapter/src/main/java/kale/adapter/CommonRcvAdapter.java index 27398ab..ec876e7 100644 --- a/adapter/src/main/java/kale/adapter/CommonRcvAdapter.java +++ b/adapter/src/main/java/kale/adapter/CommonRcvAdapter.java @@ -111,13 +111,11 @@ protected RcvAdapterItem(Context context, ViewGroup parent, AdapterItem item) { // For debug /////////////////////////////////////////////////////////////////////////// - private final boolean DEBUG = false; - private void debug(RcvAdapterItem holder) { - if (DEBUG) { - RcvAdapterItem item = holder; - item.itemView.setBackgroundColor(item.isNew ? 0xffff0000 : 0xff00ff00); - item.isNew = false; + boolean debug = false; + if (debug) { + holder.itemView.setBackgroundColor(holder.isNew ? 0xffff0000 : 0xff00ff00); + holder.isNew = false; } } diff --git a/app/src/main/java/kale/commonadapter/ListViewTestActivity.java b/app/src/main/java/kale/commonadapter/ListViewTestActivity.java index b6bffaa..fc1b569 100644 --- a/app/src/main/java/kale/commonadapter/ListViewTestActivity.java +++ b/app/src/main/java/kale/commonadapter/ListViewTestActivity.java @@ -106,9 +106,9 @@ private CommonAdapter test03(List data) { @NonNull @Override public AdapterItem createItem(Object type) { - return new ImageItem2(ListViewTestActivity.this, new View.OnClickListener() { + return new ImageItem2(ListViewTestActivity.this, new ImageItem2.ImageItemCallback(){ @Override - public void onClick(View v) { + public void onImageClick(View view) { Toast.makeText(ListViewTestActivity.this, "click", Toast.LENGTH_SHORT).show(); } }); diff --git a/app/src/main/java/kale/commonadapter/ViewPagerTestActivity.java b/app/src/main/java/kale/commonadapter/ViewPagerTestActivity.java index 5c91dcd..c78227a 100644 --- a/app/src/main/java/kale/commonadapter/ViewPagerTestActivity.java +++ b/app/src/main/java/kale/commonadapter/ViewPagerTestActivity.java @@ -22,12 +22,12 @@ * * 这里演示的是viewpager的适配器. * 有懒加载和正常加载两种的情况. + * + * 正常加载:是在viewpager初始化item的时候就进行数据的更新操作; + * 懒加载:指当一页真正出现在用户眼前时才做数据的更新操作 */ -@Deprecated public class ViewPagerTestActivity extends AppCompatActivity { - // TODO: 2016/1/28 这里还有一些问题,正在处理。目前不推荐用viewpager的适配器。 - @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -40,12 +40,11 @@ protected void onCreate(Bundle savedInstanceState) { setContentView(viewPager); final List data = DataManager.loadData(getBaseContext()); - viewPager.setAdapter(test01(data)); } /** - * 懒加载 + * 正常加载 */ private CommonPagerAdapter test01(List data) { return new CommonPagerAdapter(data) { @@ -73,10 +72,31 @@ public AdapterItem createItem(Object type) { } /** - * 正常加载 + * 懒加载 */ private CommonPagerAdapter test02(List data) { - return null; + return new CommonPagerAdapter(data, true) { + + @Override + public Object getItemType(DemoModel demoModel) { + return demoModel.type; + } + + @NonNull + @Override + public AdapterItem createItem(Object type) { + switch (((String) type)) { + case "text": + return new TextItem(); + case "button": + return new ButtonItem(); + case "image": + return new ImageItem(); + default: + throw new IllegalArgumentException("不合法的type"); + } + } + }; } } diff --git a/app/src/main/java/kale/commonadapter/item/ButtonItem.java b/app/src/main/java/kale/commonadapter/item/ButtonItem.java index 7042412..d2b4602 100644 --- a/app/src/main/java/kale/commonadapter/item/ButtonItem.java +++ b/app/src/main/java/kale/commonadapter/item/ButtonItem.java @@ -11,15 +11,16 @@ import kale.commonadapter.model.DemoModel; /** - * @tips - * 优化小技巧:这个就等于一个viewHolder,用于复用,所以不会重复建立对象 + * @tips 优化小技巧:这个就等于一个viewHolder,用于复用,所以不会重复建立对象 */ public class ButtonItem implements AdapterItem { + private static final String TAG = "ButtonItem"; + private int mPosition; private DemoItemButtonBinding b; - + @Override public int getLayoutResId() { return R.layout.demo_item_button; @@ -28,17 +29,17 @@ public int getLayoutResId() { @Override public void bindViews(final View root) { b = DataBindingUtil.bind(root); - b.setVm(new ButtonViewModel()); + b.setVm(new ButtonViewData()); //b.executePendingBindings(); // 不知这个方法是否需要 } /** - * 优化小技巧:在这里直接设置按钮的监听器。 + * @tips: 优化小技巧:在这里直接设置按钮的监听器。 * 因为这个方法仅仅在item建立时才调用,所以不会重复建立监听器。 */ @Override public void setViews() { - Log.d(ButtonItem.class.getSimpleName(), "setViews--------->"); + Log.d(TAG, "setViews--------->"); // 这个方法仅仅在item构建时才会触发,所以在这里也仅仅建立一次监听器,不会重复建立 b.button.setOnClickListener(new View.OnClickListener() { @Override @@ -50,9 +51,10 @@ public void onClick(View v) { @Override public void handleData(DemoModel model, int position) { + Log.d(TAG, "handleData: " + model.content); // 在每次适配器getView的时候就会触发,这里避免做耗时的操作 mPosition = position; - + b.getVm().setText(model.content); // 直接操作的是vm } diff --git a/app/src/main/java/kale/commonadapter/item/ButtonViewModel.java b/app/src/main/java/kale/commonadapter/item/ButtonViewData.java similarity index 51% rename from app/src/main/java/kale/commonadapter/item/ButtonViewModel.java rename to app/src/main/java/kale/commonadapter/item/ButtonViewData.java index a82427f..374ddb9 100644 --- a/app/src/main/java/kale/commonadapter/item/ButtonViewModel.java +++ b/app/src/main/java/kale/commonadapter/item/ButtonViewData.java @@ -1,19 +1,26 @@ package kale.commonadapter.item; +import android.databinding.BaseObservable; +import android.databinding.Bindable; + +import kale.commonadapter.BR; + /** * @author Kale * @date 2016/1/5 */ -public class ButtonViewModel { +public class ButtonViewData extends BaseObservable{ private String text; - public String getText() { - return text; - } - public void setText(String text) { this.text = text; + notifyPropertyChanged(BR.text); + } + + @Bindable + public String getText() { + return text; } } diff --git a/app/src/main/java/kale/commonadapter/item/ImageItem2.java b/app/src/main/java/kale/commonadapter/item/ImageItem2.java index 21f393a..f51801c 100644 --- a/app/src/main/java/kale/commonadapter/item/ImageItem2.java +++ b/app/src/main/java/kale/commonadapter/item/ImageItem2.java @@ -20,17 +20,18 @@ public class ImageItem2 extends BaseAdapterItem { private Activity mActivity; - private View.OnClickListener mListener; + private ImageItemCallback mListener; /** * @param activity 可以通过构造方法得到Activity的引用,然后就可以做很多事情了。 - * @param listener 一般的点击事件可以在内部处理,如果需要通知到外部的事件。可以通过构造函数传入监听器, + * 需要注意的是这里不应该做长期持有activity的操作,item中应该避免对activity做异步处理。 + * @param callback 一般的点击事件可以在内部处理,如果需要通知到外部的事件。可以通过构造函数传入监听器, * 或者是通过public方法set监听器。 * @Tips 通过构造方法可以做很多事情 */ - public ImageItem2(Activity activity, View.OnClickListener listener) { + public ImageItem2(Activity activity, ImageItemCallback callback) { mActivity = activity; - mListener = listener; + mListener = callback; } @Override @@ -52,7 +53,7 @@ public void setViews() { mImageView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { - mListener.onClick(v); + mListener.onImageClick(v); } }); Log.d(ImageItem2.class.getSimpleName(), "setViews--------->"); @@ -67,4 +68,25 @@ public void handleData(Integer drawableId, int position) { } + /** + * 作为item的回调可以放一个内部类在这里,然后从外部传入callback的实现。 + * + * 为什么做空实现,而不是一个接口呢?如果item被多个页面复用了,而且多个页面接收到的回调是不同的, + * 那么别的页面可以针对性的实现某方法即可,不用全部实现。 + */ + public static class ImageItemCallback { + + /** + * 这个名字一定要取得和item中具体的事务有关,不要叫的太抽象。比如onClick就不好了。 + */ + public void onImageClick(View view) { + // do nothing + } + + public void otherListener() { + // do noting + } + } + + } diff --git a/app/src/main/java/kale/commonadapter/item/TextItem.java b/app/src/main/java/kale/commonadapter/item/TextItem.java index 406a315..e3c317b 100644 --- a/app/src/main/java/kale/commonadapter/item/TextItem.java +++ b/app/src/main/java/kale/commonadapter/item/TextItem.java @@ -15,6 +15,8 @@ */ public class TextItem implements AdapterItem { + private static final String TAG = "TextItem"; + @Override public int getLayoutResId() { return R.layout.demo_item_text; @@ -34,6 +36,7 @@ public void setViews() { @Override public void handleData(DemoModel model, int position) { + Log.d(TAG, "handleData: " + model.content); textView.setText(model.content); } diff --git a/app/src/main/res/layout/demo_item_button.xml b/app/src/main/res/layout/demo_item_button.xml index 3a849ff..cce921c 100644 --- a/app/src/main/res/layout/demo_item_button.xml +++ b/app/src/main/res/layout/demo_item_button.xml @@ -5,13 +5,14 @@ diff --git a/app/src/main/res/layout/demo_item_image.xml b/app/src/main/res/layout/demo_item_image.xml index ed4e05f..3937ad4 100644 --- a/app/src/main/res/layout/demo_item_image.xml +++ b/app/src/main/res/layout/demo_item_image.xml @@ -5,6 +5,7 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" + android:gravity="center" > -