Giter Site home page Giter Site logo

kelin-hong / scrollablepanel Goto Github PK

View Code? Open in Web Editor NEW
2.1K 39.0 309.0 3.49 MB

A flexible view for providing a limited rect window into a large data set,just like a two-dimensional RecyclerView. It different from RecyclerView is that it's two-dimensional(just like a Panel) and it pin the itemView of first row and first column in their original location.

Java 100.00%

scrollablepanel's Introduction

ScrollablePanel


A flexible view for providing a limited rect window into a large data set,just like a two-dimensional RecyclerView.

It different from RecyclerView is that it's two-dimensional(just like a Panel) and it pin the itemView of first row and first column in their original location.

ScrollablePanel Demo

Demo

Apk Download:ScrollablePanelDemo.apk

Download

  compile 'com.kelin.scrollablepanel:library:1.2.0' 

Usage

ScrollablePanel is very similar to the RecyclerView and we can use them in the same way.

####1、Initialize ScrollablePanel

<com.kelin.scrollablepanel.library.ScrollablePanel
        android:id="@+id/scrollable_panel"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

####2、Adapter

This adapter must extend a class called PanelAdapter,We now have to override following methods so that we can implement our logic.

public class TestPanelAdapter extends PanelAdapter {
    private List<List<String>> data;

    @Override
    public int getRowCount() {
        return data.size();
    }

    @Override
    public int getColumnCount() {
        return data.get(0).size();
    }

    @Override
    public int getItemViewType(int row, int column) {
        return super.getItemViewType(row, column);
    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int row, int column) {
        String title = data.get(row).get(column);
        TitleViewHolder titleViewHolder = (TitleViewHolder) holder;
        titleViewHolder.titleTextView.setText(title);
    }

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        return new TestPanelAdapter.TitleViewHolder(LayoutInflater.from(parent.getContext())
                .inflate(R.layout.listitem_title, parent, false));
    }

    private static class TitleViewHolder extends RecyclerView.ViewHolder {
        public TextView titleTextView;

        public TitleViewHolder(View view) {
            super(view);
            this.titleTextView = (TextView) view.findViewById(R.id.title);
        }
    }
}

####3、Set Adapter

@Override
protected void onCreate(Bundle savedInstanceState) {
   ...
   ...
   TestPanelAdapter testPanelAdapter = new TestPanelAdapter();
   ScrollablePanel scrollablePanel = (ScrollablePanel) findViewById(R.id.scrollable_panel);
   scrollablePanel.setPanelAdapter(testPanelAdapter);
   ...
   ...
}

ChangeLog

  • V1.0.1 (2016-12-01) fix header scroll bug
  • V1.1.0 (2016-12-21) fix desynchronisation between RV’s & fix dislocation of first column in every row!
  • V1.2.0 (2016-12-26) Add notifyDataSetChanged & Fix auto reset to original position when first time scroll down!

License

 Copyright 2016 Kelin Hong
 
 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
 
    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.
 

scrollablepanel's People

Contributors

kelin-hong 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  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

scrollablepanel's Issues

notifyDataSetChanged()频繁刷新oom?

目前测试横纵列数据每30秒更新一次,持续2小时,数据的话50行,50列,从无到有填充,内存从100M涨到G为单位,然后就oom了,去掉notifyDataSetChanged()不刷新数据后,内存没变过,发现notifyDataSetChanged()用的次数越多,内存涨的越快

刷新的时候怎么清空缓存

你好,请问一下,如果刷新数据,列数发生改变,该怎么使用呢,发现有缓存问题,列数还是不变

滑动复用问题

问题描述可能会非常模糊,当我使用这个控件的时候,自己封装了一些东西,然后导致了滑动的时候出现了复用的问题,就是fling操作没有问题,但是慢慢滑动的时候,就会出现数据错乱的状态

requestLayout() improperly called

I'm getting the following warnings, spammed in my console.

W/View: requestLayout() improperly called by com.kelin.scrollablepanel.library.PinFirstItemRecyclerView{d015c2c VFED..... ......ID 0,350-1440,525 #7f0e015c app:id/recycler_line_list} during layout: running second layout pass

If you need more specific information, please do reply

如何自适应宽高?

比如某一个单元格字数过多,使该单元格的宽高变大,如何使该单元格所在的行和列其他的单元格同步宽高?

顶栏可以单独滑动,这样会导致日期和下面的item不对齐

ScrollablePanel类中其他的RecyclerView都有initRecyclerView(RecyclerView),只有headerRecyclerView没有init,问题应该出在这里。

PinFirstItemRecyclerView这个类是精华,一开始我想不通你的第一项时怎么处理的,看了源码才知道原来可以这样,学习了,赞!

回顶部

刷新数据的时候, 可以直接回顶部吗?

单元格错位

image

向右滑半个单元格 然后慢慢向上滑几个单元格
可以复现该bug

 public void initRecyclerView(RecyclerView recyclerView) {
            observerList.add(recyclerView);
            recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
                int state;

                @Override
                public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
                    super.onScrolled(recyclerView, dx, dy);
                    if (state == RecyclerView.SCROLL_STATE_IDLE) {
                        return;
                    }
                    LinearLayoutManager linearLayoutManager = (LinearLayoutManager) recyclerView.getLayoutManager();
                    int firstPos = linearLayoutManager.findFirstVisibleItemPosition();
                    View firstVisibleItem = linearLayoutManager.getChildAt(0);
                    if (firstVisibleItem != null) {
                        int firstRight = linearLayoutManager.getDecoratedRight(firstVisibleItem);
                        for (RecyclerView rv : observerList) {
                            if (recyclerView != rv) {
                                LinearLayoutManager layoutManager = (LinearLayoutManager) rv.getLayoutManager();
                                if (layoutManager != null) {
                                    layoutManager.scrollToPositionWithOffset(firstPos + 1, firstRight);
                                }
                            }

                        }
                    }
                }

                @Override
                public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
                    super.onScrollStateChanged(recyclerView, newState);
                    state = newState;
                }
            });
        }

应该是这里的问题

if (state == RecyclerView.SCROLL_STATE_IDLE) {
                        return;
                    }

新加进来的item没有滑动到其他item所在的位置

Jitter left/right fling

Bug
Reproduce by flinging left on a row, then fling right on another row

This causes two flings to work against eachother and causes stutter / jittery behaviour

请教一个问题

你好,如果我想在此基础上再增加几级表头,请问有什么思路可以做出来呢

帮忙改个闪烁的bug

往左侧滑半个item再上下滑动闪烁:
public void initRecyclerView(RecyclerView recyclerView) {
recyclerView.setHasFixedSize(true);
LinearLayoutManager layoutManager = (LinearLayoutManager) recyclerView.getLayoutManager();
if (layoutManager != null && (firstPos > 0 || firstOffset > 0)) {//改的这里
layoutManager.scrollToPositionWithOffset(PanelLineAdapter.this.firstPos + 1, PanelLineAdapter.this.firstOffset);
}
。。。
}

Current day display

Enhancement
Its very useful to see the current day, a simple highlight possibly (light gray?)

滑动错位

当对title左滑同时content 部分右滑的时候,会发生错位抖动
download_style1_1

日期列显示会少一列

for (int i = 0; i < 14; i++) {
DateInfo dateInfo = new DateInfo();
String date = DAY_UI_MONTH_DAY_FORMAT.format(calendar.getTime());
String week = WEEK_FORMAT.format(calendar.getTime());
dateInfo.setDate(date);
dateInfo.setWeek(week);
dateInfoList.add(dateInfo);
calendar.add(Calendar.DAY_OF_MONTH, 1);
}

你这个代码生成的数据使用14列的但是实际只显示了13列

How can I get the Recycler View to load new data!?

It loads the data from a database correctly but in the instance I want the data to load real time and without me having to navigate out of the view and back into the view to see the data refreshed?

Would like it to refresh as the DB is updated, btw I am using firebase.

该library并没有用上RecyclerView的缓存机制

首先感谢作者的无私分享。

经过打印日志发现,不论是向下滑还是向右话,只要是没出现过的view,都会调用onCreateViewHolder方法去inflate视图,这样其实ViewHolder根本没发挥其视图缓存的功能,因为每次都是在加载新的视图。

才疏学浅,仅能提供一个hint给作者,希望作者有一天能够修复这个问题。

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.