Kevin Learn RecyclerView--> 实现二级列表

Posted Kevin_小飞象

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Kevin Learn RecyclerView--> 实现二级列表相关的知识,希望对你有一定的参考价值。

简介

【GitHub 地址】
自定义 RecyclerView 适配器,用于扩展和折叠组,支持多种视图类型。

效果图

使用

1. 添加依赖
compile 'com.thoughtbot:expandablerecyclerview:1.3'
compile 'com.thoughtbot:expandablecheckrecyclerview:1.4'

2. 自定义 ExpandableGroup 类

public class Genre extends ExpandableGroup<Artist> 
    private int iconResId;

    public Genre(String title, List<Artist> items, int iconResId) 
        super(title, items);
        this.iconResId = iconResId;
    

    public int getIconResId() 
        return iconResId;
    

    @Override
    public boolean equals(Object o) 
        if (this == o) 
            return true;
        
        if (!(o instanceof Genre)) 
            return false;
        

        Genre genre = (Genre) o;

        return getIconResId() == genre.getIconResId();

    

    @Override
    public int hashCode() 
        return getIconResId();
    


/**
 * Created on 2019/5/15 4:56 PM
 *
 * @author Kevin
 */
public class Artist implements Parcelable 
    private String name;
    private boolean isFavorite;

    public Artist(String name, boolean isFavorite) 
        this.name = name;
        this.isFavorite = isFavorite;
    

    protected Artist(Parcel in) 
        name = in.readString();
    

    public String getName() 
        return name;
    

    public boolean isFavorite() 
        return isFavorite;
    

    @Override
    public boolean equals(Object o) 
        if (this == o) return true;
        if (!(o instanceof Artist)) return false;

        Artist artist = (Artist) o;

        if (isFavorite() != artist.isFavorite()) return false;
        return getName() != null ? getName().equals(artist.getName()) : artist.getName() == null;

    

    @Override
    public int hashCode() 
        int result = getName() != null ? getName().hashCode() : 0;
        result = 31 * result + (isFavorite() ? 1 : 0);
        return result;
    

    @Override
    public void writeToParcel(Parcel dest, int flags) 
        dest.writeString(name);
    

    @Override
    public int describeContents() 
        return 0;
    

    public static final Creator<Artist> CREATOR = new Creator<Artist>() 
        @Override
        public Artist createFromParcel(Parcel in) 
            return new Artist(in);
        

        @Override
        public Artist[] newArray(int size) 
            return new Artist[size];
        
    ;

3. 创建 ChildViewHolder 和 HeaderViewHolder 。

/**
 * Created on 2019/5/15 4:52 PM
 *
 * @author Kevin
 */
public class HeaderViewHolder extends GroupViewHolder 
    private TextView genreName;
    private ImageView arrow;
    private ImageView icon;
    public HeaderViewHolder(View itemView) 
        super(itemView);

        genreName = itemView.findViewById(R.id.list_item_genre_name);
        arrow = itemView.findViewById(R.id.list_item_genre_arrow);
        icon = itemView.findViewById(R.id.list_item_genre_icon);
    

    public void setGenreTitle(ExpandableGroup genre) 
        if (genre instanceof Genre) 
            genreName.setText(genre.getTitle());
            icon.setBackgroundResource(((Genre) genre).getIconResId());
        

    

    @Override
    public void expand() 
        animateExpand();
    

    @Override
    public void collapse() 
        animateCollapse();
    

    private void animateExpand() 
        RotateAnimation rotate =
                new RotateAnimation(360, 180, RELATIVE_TO_SELF, 0.5f, RELATIVE_TO_SELF, 0.5f);
        rotate.setDuration(300);
        rotate.setFillAfter(true);
        arrow.setAnimation(rotate);
    

    private void animateCollapse() 
        RotateAnimation rotate =
                new RotateAnimation(180, 360, RELATIVE_TO_SELF, 0.5f, RELATIVE_TO_SELF, 0.5f);
        rotate.setDuration(300);
        rotate.setFillAfter(true);
        arrow.setAnimation(rotate);
    



/**
 * Created on 2019/5/15 4:59 PM
 *
 * @author Kevin
 */
public class ItemViewHolder extends ChildViewHolder 
    public TextView childTextView;

    public ItemViewHolder(View itemView) 
        super(itemView);
        childTextView = itemView.findViewById(R.id.list_item_artist_name);
    

    public void setArtistName(String name) 
        childTextView.setText(name);
    

    /**
     * 子 item 的点击事件。
     * @param position
     */
    public void click(final int position) 
        childTextView.setOnClickListener(new View.OnClickListener() 
            @Override
            public void onClick(View v) 
                Log.d("TAG", "onClick: " + position);
            
        );
    


4. 创建 GenreAdapter 类

/**
 * Created on 2019/5/15 5:00 PM
 *
 * @author Kevin
 */
public class GenreAdapter extends ExpandableRecyclerViewAdapter<HeaderViewHolder,ItemViewHolder> 
    public GenreAdapter(List<? extends ExpandableGroup> groups) 
        super(groups);
    

    @Override
    public HeaderViewHolder onCreateGroupViewHolder(ViewGroup parent, int viewType) 
        View view = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.list_item_genre, parent, false);
        return new HeaderViewHolder(view);
    

    @Override
    public ItemViewHolder onCreateChildViewHolder(ViewGroup parent, int viewType) 
        View view = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.list_item_artist, parent, false);
        return new ItemViewHolder(view);
    

    @Override
    public void onBindChildViewHolder(ItemViewHolder holder, final int flatPosition,
                                      ExpandableGroup group, final int childIndex) 

        final Artist artist = ((Genre) group).getItems().get(childIndex);
        holder.setArtistName(artist.getName());

        holder.click(childIndex);


    

    @Override
    public void onBindGroupViewHolder(HeaderViewHolder holder, int flatPosition,
                                      ExpandableGroup group) 

        holder.setGenreTitle(group);
    


5. 在 Activity 中使用

public class ExpandActivity extends AppCompatActivity 
    public GenreAdapter adapter;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_expand);
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        getSupportActionBar().setTitle(getClass().getSimpleName());

        RecyclerView recyclerView = findViewById(R.id.recycler_view);
        LinearLayoutManager layoutManager = new LinearLayoutManager(this);

        RecyclerView.ItemAnimator animator = recyclerView.getItemAnimator();
        if (animator instanceof DefaultItemAnimator) 
            ((DefaultItemAnimator) animator).setSupportsChangeAnimations(false);
        

        adapter = new GenreAdapter(makeGenres());
        recyclerView.setLayoutManager(layoutManager);
        recyclerView.setAdapter(adapter);

        Button clear = findViewById(R.id.toggle_button);
        clear.setOnClickListener(new View.OnClickListener() 
            @Override
            public void onClick(View v) 
                adapter.toggleGroup(makeJazzGenre());
            
        );
    

    @Override
    protected void onSaveInstanceState(Bundle outState) 
        super.onSaveInstanceState(outState);
        adapter.onSaveInstanceState(outState);
    

    @Override
    protected void onRestoreInstanceState(Bundle savedInstanceState) 
        super.onRestoreInstanceState(savedInstanceState);
        adapter.onRestoreInstanceState(savedInstanceState);
    


6. MainActivity 跳转到 ExpandActivity

private void initView() 
        Button expand = (Button) findViewById(R.id.expand_button);
        expand.setOnClickListener(navogateTo(ExpandActivity.class));

    

    public View.OnClickListener navogateTo(final Class<?> clazz) 
        return new View.OnClickListener() 
            @Override
            public void onClick(View v) 
                Intent intent = new Intent(MainActivity.this,clazz);
                startActivity(intent);
            
        ;
    

7. 模拟数据的封装

/**
 * Created on 2019/5/15 5:14 PM
 *
 * @author Kevin
 */
public class GenreDataFactory 
    public static List<Genre> makeGenres() 
        return Arrays.asList(makeRockGenre(),
                makeJazzGenre(),
                makeClassicGenre());
    

    public static Genre makeRockGenre() 
        return new Genre("水果", makeRockArtists(), R.drawable.ic_banjo);
    

    public static List<Artist> makeRockArtists() 
        Artist queen = new Artist("西瓜", true);
        Artist styx = new Artist("苹果", false);
        Artist reoSpeedwagon = new Artist("香蕉", false);
        Artist boston = new Artist("圣女果", true);

        return Arrays.asList(queen, styx, reoSpeedwagon, boston);
    

    public static Genre makeJazzGenre() 
        return new Genre("游戏", makeJazzArtists(), R.drawable.ic_banjo);
    

    public static List<Artist> makeJazzArtists() 
        Artist milesDavis = new Artist("王者荣耀", true);
        Artist ellaFitzgerald = new Artist("英雄联盟", true);
        Artist billieHoliday = new Artist("吃鸡", false);

        return Arrays.asList(milesDavis, ellaFitzgerald, billieHoliday);
    


    public static Genre makeClassicGenre() 
        return new Genre("运动", makeClassicArtists(), R.drawable.ic_banjo);
    

    public static List<Artist> makeClassicArtists() 
        Artist beethoven = new Artist("篮球", false);
        Artist bach = new Artist("足球", true);
        Artist brahms = new Artist("乒乓球", false);
        Artist puccini = new Artist("羽毛球", false);

        return Arrays.asList(beethoven, bach, brahms, puccini);
    


以上是关于Kevin Learn RecyclerView--> 实现二级列表的主要内容,如果未能解决你的问题,请参考以下文章

Kevin Learn RecyclerView--> 实现二级列表

Kevin Learn Recyclerview-->Leanback 中的 HorizontalGridView

Kevin Learn Recyclerview-->UltimateRecyclerView 的基本使用

Kevin Learn RecyclerView--> Retrofit + RxJava + OkHttp 网络请求

Kevin Learn Recyclerview-->SpringView (下拉刷新)的基本使用

Kevin Learn Kotlin:函数