Giter VIP home page Giter VIP logo

recyclerview's Introduction

RefreshRecyclerView

  • RecyclerAdapter : 支持下拉刷新,上拉加载,添加Header,Footer
  • MultiTypeAdapter/CustomMultiTypeAdapter : 针对 复杂数据类型列表 展示Adapter

注意 所有的 adapter 可以配合任意的 RecyclerView 或者 它的子类 使用,而不是仅仅局限于 RefreshRecyclerView 这个组件。

使用方法

  • gradle依赖
   compile 'cn.lemon:RefreshRecyclerView:2.0.0'
   compile 'com.android.support:recyclerview-v7:25.4.0'
  • xml布局文件
<cn.lemon.view.RefreshRecyclerView
    android:id="@+id/recycler_view"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    app:refresh_able="true"
    app:load_more_able="false"/>
  • java代码
mRecyclerView = (RefreshRecyclerView) findViewById(R.id.recycler_view);
mRecyclerView.setSwipeRefreshColors(0xFF437845,0xFFE44F98,0xFF2FAC21);
mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
mRecyclerView.setAdapter(mAdapter);
mRecyclerView.addRefreshAction(new Action() {
    @Override
    public void onAction() {
        // TODO:刷新数据
    }
});

mRecyclerView.addLoadMoreAction(new Action() {
    @Override
    public void onAction() {
        // TODO:加载更多
    }
});
mRecyclerView.addLoadMoreErrorAction(new Action() {
   @Override
   public void onAction() {
       // TODO:加载更多错误,点击重新加载
   }
});
// Header 和 Footer 支持
mAdapter.setHeader(textView);
mAdapter.setFooter(footer);

RecyclerAdapter

针对相同数据类型列表,可添加 Header,Footer

自定义 Adapter 应该继承 RecyclerAdapter,如:

class CardRecordAdapter extends RecyclerAdapter<Consumption> {

    public CardRecordAdapter(Context context) {
        super(context);
    }

    @Override
    public BaseViewHolder<Consumption> onCreateBaseViewHolder(ViewGroup parent, int viewType) {
        return new CardRecordHolder(parent);
    }
}

MultiTypeAdapter

复杂数据类型列表的 Adapter,没有 Header,Footer 的概念,每个 Item 对应一个 ViewHolder 注意:通过反射实现,支持 ViewHolder 的带有一个参数(ViewGroup)和无参两种形式构造函数,性能方面微小的损耗。 构造函数为保证反射时能获取到,应该写成 public 静态内部类 或者 public 的单独类。

private MultiTypeAdapter mAdapter = new MultiTypeAdapter(this);
mAdapter.add(ImageViewHolder.class, getImageVirtualData());
mAdapter.addAll(TextViewHolder.class, getTextVirtualData());
mAdapter.addAll(TextImageViewHolder.class, getTextImageVirualData());
mAdapter.addAll(CardRecordHolder.class, getRecordVirtualData());

CustomMultiTypeAdapter (推荐使用)

功能和 MultiTypeAdapter 一样,但避免了反射带来的弊端,需要实现 IViewHolderFactory 接口类来管理viewtype 和 ViewHolder 的映射关系。

// 映射 viewtype 和 ViewHolder
@Override
public <V extends BaseViewHolder> V getViewHolder(ViewGroup parent, int viewType) {
    switch (viewType) {
        case VIEW_TYPE_TEXT:
            return (V) new TextViewHolder(parent);
        case VIEW_TYPE_IAMGE:
            return (V) new ImageViewHolder(parent);
        case VIEW_TYPE_TEXT_IMAGE:
            return (V) new TextImageViewHolder(parent);
        case VIEW_TYPE_CARD:
            return (V) new CardRecordHolder(parent);
        default:
            return (V) new TextViewHolder(parent);
    }
}

// 绑定数据
mAdapter.add(getImageVirtualData(), VIEW_TYPE_IAMGE);
mAdapter.addAll(getTextVirtualData(), VIEW_TYPE_TEXT);
mAdapter.addAll(getTextImageVirualData(), VIEW_TYPE_TEXT_IMAGE);
mAdapter.addAll(getRecordVirtualData(), VIEW_TYPE_CARD);

ViewHolder

自定义 ViewHolder 需继承 BaseViewHolder,如:

class CardRecordHolder extends BaseViewHolder<Consumption> {

//当使用MultiTypeAdapter时,务必加上此构造方法
public CardRecordHolder(ViewGroup parent) {
    super(parent, R.layout.holder_consume);
}

@Override
public void setData(Consumption object) {
    super.setData(object);
    name.setText("Demo");
    //UI绑定数据
}

@Override
public void onInitializeView() {
    super.onInitializeView();
    name = findViewById(R.id.name);
    //初始化View
}

@Override
public void onItemViewClick(Consumption object) {
    super.onItemViewClick(object);
    //点击事件
}
}

详细用法请看Demo

recyclerview's People

Contributors

zhazhaxin avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

recyclerview's Issues

图片加载位置错乱,怎么解决?

给imageView设置占位符、settag的方式好像是不行了,请问您有什么方法吗?

@OverRide
public void onInitializeView() {
super.onInitializeView();
//初始化View
mNewImg = findViewById(R.id.news_img);
// mNewImg.setImageDrawable(mContext.getDrawable());
// mNewImg.setTag(mUrl);
mNewsTitle = findViewById(R.id.news_title);
mNewsDesc = findViewById(R.id.news_desc);
mNewsTime = findViewById(R.id.news_time);
}

@Override
public void setData(NewsBean data) {
    super.setData(data);
    //Ui绑定数据
    mUrl = data.getPicUrl();
    String realUrl = mUrl.replace("_ss", "");

// if (mUrl.equals(mNewImg.getTag())){
Glide.with(mContext).load(realUrl).into(mNewImg);
// }
mNewsTitle.setText(data.getTitle());
mNewsDesc.setText(data.getDescription());
mNewsTime.setText(data.getCtime());

定位position如何定位

我需要position,就像onBindViewHolder里面的position。 但是我不知道您的这个该如何拿到position。

使用ButterKnife没反应

当我把onInitializeView这个方法去掉,然后直接在BaseViewHolder的构造函数中加了一句
image
请问为什么setdata之后,所有的控件都没有被设置上数据

Missing local.properties

I'm using windows OS, and when I try to run the following:

gradlew clean

the following happens:

* Where:
Script 'https://raw.githubusercontent.com/llxdaxia/GradleScript/master/bintray_v1.gradle' line: 35

* What went wrong:
A problem occurred evaluating script.
... \llxdaxia\RecyclerView\local.properties (The system cannot find the file specified)

I think you should either remove the bintray_v1.gradle or add the file local.properties that the bintray_v1.gradle is expecting

I belive it has something related with this line on your bintray_v1.gradle

properties.load(project.rootProject.file('local.properties').newDataInputStream())

引入 compile 'cn.lemon:RefreshRecyclerView:1.1.9'编译报错

引入 compile 'cn.lemon:RefreshRecyclerView:1.1.9'编译报错,各种方法试了都不行。
错误:Error converting bytecode to dex:
Cause: com.android.dex.DexException: Multiple dex files define Landroid/support/v4/accessibilityservice/AccessibilityServiceInfoCompat$AccessibilityServiceInfoVersionImpl;
错误:Execution failed for task ':app:transformClassesWithDexForDebug'.

com.android.build.api.transform.TransformException: com.android.ide.common.process.ProcessException: java.util.concurrent.ExecutionException: java.lang.UnsupportedOperationException

remove error

when it includes header and remove item,report java.lang.IllegalArgumentException: Called attach on a child which is not detached: ViewHolder{3dfd2352 position=0 id=-1, oldPos=-1, pLpos:-1 no parent}

那个$开头的id报错说找不到

这种依赖就正常,project(':RefreshRecyclerView')
但是maven依赖就报错, 'cn.lemon:RefreshRecyclerView:1.2.0'
为什么要美元$开头呢?

Caused by: java.lang.NoSuchFieldError: No field $_recycler_view of type I in class Lcn/lemon/view/R$id; or its superclasses (declaration of 'cn.lemon.view.R$id' appears in /data/app/cn.lemon.recyclerview-1/split_lib_slice_4_apk.apk)
at cn.lemon.view.RefreshRecyclerView.(RefreshRecyclerView.java:42)

这个库 as由2.3.3升到3.0.1后报错

这个库用的1.1.9

升级前:
as 2.3.3
compileSdkVersion 25
buildToolsVersion "25.0.2"

正常

升级后:
as 3.0.1
compileSdkVersion 26
buildToolsVersion "26.0.2"

这个库用的1.1.9

报错主要是定位到:
Caused by: java.lang.NoSuchFieldError: No static field $_recycler_view1 of type I in class Lcn/lemon/view/R$id; or its superclasses (declaration of 'cn.lemon.view.R$id' appears in /data/app/com.cdc.zor.zorapplication-1/split_lib_slice_5_apk.apk)
at cn.lemon.view.RefreshRecyclerView.(RefreshRecyclerView.java:41)
at cn.lemon.view.RefreshRecyclerView.(RefreshRecyclerView.java:0)
at java.lang.reflect.Constructor.newInstance(Native Method) 

定位到代码中:cn.lemon.view.RefreshRecyclerView 这个自定义控件的40行

mRecyclerView = (RecyclerView) view.findViewById(R.id.$_recycler_view1);

这一句,网上查说是我的主项目 和 这个库有 xml文件名或控件id重名 修改也无效

改回 升级前配置能完美运行。。。。。。

不只是什么原因,请指教,谢谢!

报错全文如下:

E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.cdc.zor.zorapplication, PID: 18693
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.cdc.zor.zorapplication/com.cdc.zor.zorapplication.activity.LoadingContainerSaveActivity}: android.view.InflateException: Binary XML file line #0: Binary XML file line #0: Error inflating class cn.lemon.view.RefreshRecyclerView
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2585)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2667)
at android.app.ActivityThread.-wrap11(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1494)
at android.os.Handler.dispatchMessage(Handler.java:111)
at android.os.Looper.loop(Looper.java:207)
at android.app.ActivityThread.main(ActivityThread.java:5770)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:679)
Caused by: android.view.InflateException: Binary XML file line #0: Binary XML file line #0: Error inflating class cn.lemon.view.RefreshRecyclerView
at android.view.LayoutInflater.inflate(LayoutInflater.java:539)
at android.view.LayoutInflater.inflate(LayoutInflater.java:423)
at android.view.LayoutInflater.inflate(LayoutInflater.java:374)
at android.support.v7.app.AppCompatDelegateImplV9.setContentView(AppCompatDelegateImplV9.java:292)
at android.support.v7.app.AppCompatActivity.setContentView(AppCompatActivity.java:140)
at com.cdc.zor.zorapplication.activity.BaseActivity.onCreate(BaseActivity.java:17)
at android.app.Activity.performCreate(Activity.java:6582)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1114)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2532)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2667) 
at android.app.ActivityThread.-wrap11(ActivityThread.java) 
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1494) 
at android.os.Handler.dispatchMessage(Handler.java:111) 
at android.os.Looper.loop(Looper.java:207) 
at android.app.ActivityThread.main(ActivityThread.java:5770) 
at java.lang.reflect.Method.invoke(Native Method) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:679) 
Caused by: android.view.InflateException: Binary XML file line #0: Error inflating class cn.lemon.view.RefreshRecyclerView
at android.view.LayoutInflater.createView(LayoutInflater.java:645)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:764)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:704)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:835)
at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:798)
at android.view.LayoutInflater.inflate(LayoutInflater.java:515)
at android.view.LayoutInflater.inflate(LayoutInflater.java:423) 
at android.view.LayoutInflater.inflate(LayoutInflater.java:374) 
at android.support.v7.app.AppCompatDelegateImplV9.setContentView(AppCompatDelegateImplV9.java:292) 
at android.support.v7.app.AppCompatActivity.setContentView(AppCompatActivity.java:140) 
at com.cdc.zor.zorapplication.activity.BaseActivity.onCreate(BaseActivity.java:17) 
at android.app.Activity.performCreate(Activity.java:6582) 
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1114) 
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2532) 
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2667) 
at android.app.ActivityThread.-wrap11(ActivityThread.java) 
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1494) 
at android.os.Handler.dispatchMessage(Handler.java:111) 
at android.os.Looper.loop(Looper.java:207) 
at android.app.ActivityThread.main(ActivityThread.java:5770) 
at java.lang.reflect.Method.invoke(Native Method) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:679) 
Caused by: java.lang.reflect.InvocationTargetException
at java.lang.reflect.Constructor.newInstance(Native Method)
at android.view.LayoutInflater.createView(LayoutInflater.java:619)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:764) 
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:704) 
at android.view.LayoutInflater.rInflate(LayoutInflater.java:835) 
at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:798) 
at android.view.LayoutInflater.inflate(LayoutInflater.java:515) 
at android.view.LayoutInflater.inflate(LayoutInflater.java:423) 
at android.view.LayoutInflater.inflate(LayoutInflater.java:374) 
at android.support.v7.app.AppCompatDelegateImplV9.setContentView(AppCompatDelegateImplV9.java:292) 
at android.support.v7.app.AppCompatActivity.setContentView(AppCompatActivity.java:140) 
at com.cdc.zor.zorapplication.activity.BaseActivity.onCreate(BaseActivity.java:17) 
at android.app.Activity.performCreate(Activity.java:6582) 
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1114) 
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2532) 
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2667) 
at android.app.ActivityThread.-wrap11(ActivityThread.java) 
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1494) 
at android.os.Handler.dispatchMessage(Handler.java:111) 
at android.os.Looper.loop(Looper.java:207) 
at android.app.ActivityThread.main(ActivityThread.java:5770) 
at java.lang.reflect.Method.invoke(Native Method) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:679) 
Caused by: java.lang.NoSuchFieldError: No static field $_recycler_view1 of type I in class Lcn/lemon/view/R$id; or its superclasses (declaration of 'cn.lemon.view.R$id' appears in /data/app/com.cdc.zor.zorapplication-1/split_lib_slice_5_apk.apk)
at cn.lemon.view.RefreshRecyclerView.(RefreshRecyclerView.java:41)
at cn.lemon.view.RefreshRecyclerView.(RefreshRecyclerView.java:0)
at java.lang.reflect.Constructor.newInstance(Native Method) 
at android.view.LayoutInflater.createView(LayoutInflater.java:619) 
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:764) 
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:704) 
at android.view.LayoutInflater.rInflate(LayoutInflater.java:835) 
at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:798) 
at android.view.LayoutInflater.inflate(LayoutInflater.java:515) 
at android.view.LayoutInflater.inflate(LayoutInflater.java:423) 
at android.view.LayoutInflater.inflate(LayoutInflater.java:374) 
at android.support.v7.app.AppCompatDelegateImplV9.setContentView(AppCompatDelegateImplV9.java:292) 
at android.support.v7.app.AppCompatActivity.setContentView(AppCompatActivity.java:140) 
at com.cdc.zor.zorapplication.activity.BaseActivity.onCreate(BaseActivity.java:17) 
at android.app.Activity.performCreate(Activity.java:6582) 
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1114) 
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2532) 
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2667) 
at android.app.ActivityThread.-wrap11(ActivityThread.java) 
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1494) 
at android.os.Handler.dispatchMessage(Handler.java:111) 
at android.os.Looper.loop(Looper.java:207) 
at android.app.ActivityThread.main(ActivityThread.java:5770) 
at java.lang.reflect.Method.invoke(Native Method) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:679) 

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.