try
 
字母索引(城市和通讯录)
 
IndexableRecyclerView
 
城市索引
 
 
通讯录索引
 
 
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              xmlns:app="http://schemas.android.com/apk/res-auto"
              android:layout_width="match_parent"
              android:layout_height="match_parent"
              android:orientation="vertical">
    
    <me.yokeyword.indexablerv.IndexableLayout
        android:id="@+id/indexableLayout"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:indexBar_background="#08000000"
        app:indexBar_layout_width="50dp"
        app:indexBar_textColor="@android:color/black"
        app:indexBar_textSpace="8dp"/>
</LinearLayout> 
public class FragmentMovie extends BaseFragment {
    private List<CityEntity> mDatas;
    
private SimpleHeaderAdapter<CityEntity> mHotCityAdapter;
    
@Override
    protected int getLayoutId() {
        
return R.layout.fragment_movie;
    }
    
@Override
    protected void initView(View view) {
        IndexableLayout indexableLayout = (IndexableLayout) view.findViewById(R.id.indexableLayout);
        indexableLayout.setLayoutManager(
new GridLayoutManager(
this.getContext(), 
1));
        
        CityAdapter adapter = 
new CityAdapter(
this.getContext());
        indexableLayout.setAdapter(adapter);
        
        mDatas = initDatas();
        
        indexableLayout.setCompareMode(IndexableLayout.MODE_FAST);
        adapter.setDatas(mDatas, 
new IndexableAdapter.IndexCallback<CityEntity>() {
            
@Override
            public void onFinished(List<EntityWrapper<CityEntity>> datas) {
                
            }
        });
        
adapter.setOnItemContentClickListener(
new IndexableAdapter.OnItemContentClickListener<CityEntity>() {
    
@Override
    public void onItemClick(View v, 
int originalPosition, 
int currentPosition, CityEntity entity) {
    }
});
        
        adapter.setOnItemContentClickListener(
new IndexableAdapter.OnItemContentClickListener<CityEntity>() {
            
@Override
            public void onItemClick(View v, 
int originalPosition, 
int currentPosition, CityEntity entity) {
                
if (originalPosition >= 
0) {
                    ToastUtil.showShort(getContext(), 
"选中:" + entity.getName() + 
"  当前位置:" + currentPosition + 
"  原始所在数组位置:" + originalPosition);
                } 
else {
                    ToastUtil.showShort(getContext(), 
"选中Header:" + entity.getName() + 
"  当前位置:" + currentPosition);
                }
            }
        });
        adapter.setOnItemTitleClickListener(
new IndexableAdapter.OnItemTitleClickListener() {
            
@Override
            public void onItemClick(View v, 
int currentPosition, String indexTitle) {
                ToastUtil.showShort(getContext(), 
"选中:" + indexTitle + 
"  当前位置:" + currentPosition);
            }
        });
        
        
        mHotCityAdapter = 
new SimpleHeaderAdapter<>(adapter, 
"热门", 
"热门城市", iniyHotCityDatas());
        
        indexableLayout.addHeaderAdapter(mHotCityAdapter);
        
        
final List<CityEntity> gpsCity = iniyGPSCityDatas();
        
final SimpleHeaderAdapter gpsHeaderAdapter = 
new SimpleHeaderAdapter<>(adapter, 
"定位", 
"当前城市", gpsCity);
        indexableLayout.addHeaderAdapter(gpsHeaderAdapter);
        
        
        indexableLayout.postDelayed(
new Runnable() {
            
@Override
            public void run() {
                gpsCity.get(
0).setName(
"杭州市");
                gpsHeaderAdapter.notifyDataSetChanged();
            }
        }, 
3000);
        
    }
    
private List<CityEntity> 
iniyGPSCityDatas() {
        List<CityEntity> list = 
new ArrayList<>();
        list.add(
new CityEntity(
"定位中..."));
        
return list;
    }
    
private List<CityEntity> 
initDatas() {
        List<CityEntity> list = 
new ArrayList<>();
        List<String> cityStrings = Arrays.asList(getResources().getStringArray(R.array.city_array));
        
for (String item : cityStrings) {
            CityEntity cityEntity = 
new CityEntity();
            cityEntity.setName(item);
            list.add(cityEntity);
        }
        
return list;
    }
    
private List<CityEntity> 
iniyHotCityDatas() {
        List<CityEntity> list = 
new ArrayList<>();
        list.add(
new CityEntity(
"杭州市"));
        list.add(
new CityEntity(
"北京市"));
        list.add(
new CityEntity(
"上海市"));
        list.add(
new CityEntity(
"广州市"));
        
return list;
    }
} 
CityAdapter
 
package com.mine.moviedemo.entity;
import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import com.mine.moviedemo.R;
import me.yokeyword.indexablerv.IndexableAdapter;
/**
 * Created by YoKey on 16/10/7.
 */
public 
class CityAdapter extends IndexableAdapter<CityEntity> {
    private LayoutInflater mInflater;
    public CityAdapter(Context context) {
        mInflater = LayoutInflater.from(context);
    }
    
@Override
    public RecyclerView.ViewHolder onCreateTitleViewHolder(ViewGroup parent) {
        View view = mInflater.inflate(R.layout.item_index_city, parent, 
false);
        
return new IndexVH(view);
    }
    
@Override
    public RecyclerView.ViewHolder onCreateContentViewHolder(ViewGroup parent) {
        View view = mInflater.inflate(R.layout.item_city, parent, 
false);
        
return new ContentVH(view);
    }
    
@Override
    public void onBindTitleViewHolder(RecyclerView.ViewHolder holder, String indexTitle) {
        IndexVH vh = (IndexVH) holder;
        vh.tv.setText(indexTitle);
    }
    
@Override
    public void onBindContentViewHolder(RecyclerView.ViewHolder holder, CityEntity entity) {
        ContentVH vh = (ContentVH) holder;
        vh.tv.setText(entity.getName());
    }
    
private class IndexVH extends RecyclerView.ViewHolder {
        TextView tv;
        public IndexVH(View itemView) {
            
super(itemView);
            tv = (TextView) itemView.findViewById(R.id.tv_index);
        }
    }
    
private class ContentVH extends RecyclerView.ViewHolder {
        TextView tv;
        public ContentVH(View itemView) {
            
super(itemView);
            tv = (TextView) itemView.findViewById(R.id.tv_name);
        }
    }
}
 
CityEntity
 
package com.mine.moviedemo.entity;
import me.yokeyword.indexablerv.IndexableEntity;
/**
 * Created by a on 2017/4/14.
 */
public class CityEntity implements IndexableEntity {
    private long id;
    
private String name;
    
private String pinyin;
    
public CityEntity() {
    }
    
public CityEntity(String name) {
        
this.name = name;
    }
    
public long getId() {
        
return id;
    }
    
public void setId(
long id) {
        
this.id = id;
    }
    
public String 
getName() {
        
return name;
    }
    
public void setName(String name) {
        
this.name = name;
    }
    
public String 
getPinyin() {
        
return pinyin;
    }
    
public void setPinyin(String pinyin) {
        
this.pinyin = pinyin;
    }
    
@Override
    public String 
getFieldIndexBy() {
        
return name;
    }
    
@Override
    public void setFieldIndexBy(String indexByField) {
        
this.name = indexByField;
    }
    
@Override
    public void setFieldPinyinIndexBy(String pinyin) {
        
this.pinyin = pinyin;
    }
}
 
EasyRecyclerView
 
将开发中常用的RecyclerView的各种需求封装进库。  并且adapter支持数据管理,Header与Footer添加,加载更多。没有更多。加载错误  
 
轮播图
 
android图片轮播效果,RollViewPager的简单使用  RollViewPager的github
 
另一个轮播图Android广告图片轮播控件,支持无限循环和多种主题,可以灵活设置轮播样式、动画、轮播和切换时间、位置、图片加载框架等!
 
 
 导入第三方的moudle时,最好先把三方的demo先导入一次,导入demo时,修改所有的(项目的gradle和moudle的gradle都要改)  ‘compileSdkVersion 25  buildToolsVersion “25.0.3”’  然后修改项目的gradle目录下的两个文件,用本地文件去替换他们  这样就可以运行这个demo了  运行无误后,把这个改装后的moudle导入自己的项目即可,记得  ’ compile project(‘:banner’)’,  这是还可能有错误,就需要对照原demo中的gradle文件,去添加一些代码
 
 
 
<?xml version=
"1.0" encoding=
"utf-8"?>
<android
.support.v4
.widget.SwipeRefreshLayout
    xmlns:android=
"http://schemas.android.com/apk/res/android"
    xmlns:app=
"http://schemas.android.com/apk/res-auto"
    android:id=
"@+id/refresh"
    android:layout_width=
"match_parent"
    android:layout_height=
"match_parent"
    android:orientation=
"vertical">
    <android
.support.v4
.widget.NestedScrollView
        android:layout_width=
"match_parent"
        android:layout_height=
"match_parent">
        <LinearLayout
            android:layout_width=
"match_parent"
            android:layout_height=
"match_parent"
            android:orientation=
"vertical">
           ★ <
com.jude.rollviewpager.RollPagerView
                android:id=
"@+id/rollPager"
                android:layout_width=
"match_parent"
                android:layout_height=
"180dp"
                app:rollviewpager_play_delay=
"3000"/>
            <TextView
                android:layout_width=
"match_parent"
                android:layout_height=
"match_parent"
                android:text=
"@string/content"/>
        </LinearLayout>
    </android
.support.v4
.widget.NestedScrollView>
</android
.support.v4
.widget.SwipeRefreshLayout> 
package com.mine.moviedemo.fragment;
import android.graphics.Color;
import android.support.v4.widget.SwipeRefreshLayout;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.Toast;
import com.jude.rollviewpager.RollPagerView;
import com.jude.rollviewpager.adapter.StaticPagerAdapter;
import com.jude.rollviewpager.hintview.ColorPointHintView;
import com.mine.moviedemo.R;
import com.mine.moviedemo.base.BaseFragment;
/**
 * Created by a on 2017/4/13.
 */
public class FragmentHome extends BaseFragment implements SwipeRefreshLayout.OnRefreshListener {
    private SwipeRefreshLayout mRefresh;
    
private View view;
    
private RollPagerView mRollViewPager;
    
@Override
    protected void initView(View view) {
        
this.view = view;
        mRefresh = (SwipeRefreshLayout) view.findViewById(R.id.refresh);
        mRefresh.setOnRefreshListener(
this);
        mRollViewPager = (RollPagerView) view.findViewById(R.id.rollPager);
        
        mRollViewPager.setPlayDelay(
1000);
        
        mRollViewPager.setAnimationDurtion(
500);
        
        mRollViewPager.setAdapter(
new TestNormalAdapter());
        
        
        
        
        
        
        mRollViewPager.setHintView(
new ColorPointHintView(getContext(), Color.YELLOW, Color.WHITE));
        
        
    }
    
private class TestNormalAdapter extends StaticPagerAdapter {
        private int[] imgs = {
                R.mipmap.img1,
                R.mipmap.img2,
                R.mipmap.img3,
        };
        
@Override
        public View 
getView(ViewGroup container, 
int position) {
            ImageView view = 
new ImageView(container.getContext());
            view.setImageResource(imgs[position]);
            view.setScaleType(ImageView.ScaleType.CENTER_CROP);
            view.setLayoutParams(
new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
            
return view;
        }
        
@Override
        public int getCount() {
            
return imgs.length;
        }
    }
    
@Override
    protected int getLayoutId() {
        
return R.layout.fragment_home;
    }
    
@Override
    public void onRefresh() {
        Toast.makeText(getContext(), 
"开始刷新", Toast.LENGTH_SHORT).show();
        view.postDelayed(
new Runnable() {
            
@Override
            public void run() {
                Toast.makeText(getContext(), 
"开始完毕", Toast.LENGTH_SHORT).show();
                mRefresh.setRefreshing(
false);
            }
        }, 
1500);
    }
}