【问题标题】:How to build Two Synchronous ListView with Dynamic Contents如何使用动态内容构建两个同步 ListView
【发布时间】:2020-06-03 22:09:32
【问题描述】:

我想创建一个ScrollView,它本身有一个动态内容,其中包含两列。

并且右列的项目与左列的项目交叉定位。 (就像这个第一列项目y坐标:[(0,100),(100,200),(200,300)] - 第二列项目y坐标:[(50,150),(150,250)])

使用ScrollViewListView 是不可能的,因为它们不能像我所知的那样放置两列。所以,我有两个解决方案。这些解决方法有不同的问题。

这是我的第一个解决方案:
- ScrollView 中的动态自定义视图。
- 这种方法的问题是我不知道如何更新ScrollView 和动态自定义视图,所以它不会滚动。

我的第二个解决方案:
- 两个单独连接的listview(如果你滑动一个,另一个同步自动滑动到相同的位置)。
- 这个解决方案的问题是我找不到将它们相互连接的方法。

任何帮助将不胜感激。

【问题讨论】:

    标签: android android-layout android-listview android-custom-view android-scrollview


    【解决方案1】:

    对于任何可能需要答案的人,我在here 中找到了解决方案。我用that 改进了这个(这是不正确的)(实际上我修复了它)。这是我的最终解决方案:

    MyScrollView.java

    public class MyScrollView extends ScrollView implements IScrollListener {
    
        private static final String TAG = "MyScrollView";
        private IScrollListener listener;
    
        public MyScrollView(Context context) {
            super(context);
        }
    
        public MyScrollView(Context context, AttributeSet attrs) {
            super(context, attrs);
        }
    
        public MyScrollView(Context context, AttributeSet attrs, int defStyleAttr) {
            super(context, attrs, defStyleAttr);
        }
    
        public void setScrollViewListener(IScrollListener listener) {
            this.listener = listener;
        }
    
        @Override
        protected void onScrollChanged(int x, int y, int oldX, int oldY) {
            super.onScrollChanged(x, y, oldX, oldY);
            if (listener != null) {
                listener.onScrollChanged(this, x, y, oldX, oldY);
            } else {
                Log.i(TAG, "asdasd");
            }
        }
    
        @Override
        public void onScrollChanged(IScrollListener scrollView, int x, int y, int oldX, int oldY) {
            super.onScrollChanged(x, y, oldX, oldY);
            if (listener != null) {
                listener.onScrollChanged(this, x, y, oldX, oldY);
            } else {
                Log.i(TAG, "asdasd");
            }
        }
    }
    

    MyActivity.java

    public class MyActivity extends AppCompatActivity implements IScrollListener {
        @Override
        protected void onCreate(Bundle savedInstanceState) {
    
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_multi_position);
    
            .
            .
            .
    
            scrollViewLeft = (MyScrollView) this.findViewById(R.id.scrollViewLeft);
            scrollViewRight = (MyScrollView) this.findViewById(R.id.scrollViewRight);
    
            .
            .
    
            scrollViewLeft.setScrollViewListener(this);
            scrollViewRight.setScrollViewListener(this);
    
            .
            .
            LayoutInflater vi = (LayoutInflater) getApplicationContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            View viewLeft = vi.inflate(R.layout.target_item, null);
            View viewRight = vi.inflate(R.layout.target_item_right, null);
    
            // insert into left view
            ViewGroup insertPointLeft = (ViewGroup) findViewById(R.id.leftLinearLayout);
            insertPointLeft.addView(viewLeft, 0, new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT));
    
            // insert into right view
            ViewGroup insertPointRight = (ViewGroup) findViewById(R.id.rightLinearLayout);
            insertPointRight.addView(viewRight, targets.size(), new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT));
    
            // fill in any details dynamically here
            TextView number = (TextView) viewLeft.findViewById(R.id.number);
            number.setText("1");
            TextView name = (TextView) viewLeft.findViewById(R.id.name);
            name.setText("Muhammed Aydogan");
    
            // fill in any details dynamically here
            TextView number2 = (TextView) viewRight.findViewById(R.id.number);
            number2.setText("2");
            TextView name2 = (TextView) viewRight.findViewById(R.id.name);
            name2.setText("Muhammed Aydogan");*/
        }
    
        @Override
        public void onScrollChanged(IScrollListener scrollView, int x, int y, int oldX, int oldY) {
            if (scrollViewLeft.equals(scrollView)) {
                scrollViewRight.scrollTo(x, y);
            } else if (scrollViewRight.equals(scrollView)) {
                scrollViewLeft.scrollTo(x, y);
            }
        }
    }
    

    IScrollListener.java

    public interface IScrollListener {
        void onScrollChanged(IScrollListener scrollView, int x, int y, int oldX, int oldY);
    }
    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-08-08
      • 2017-01-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-31
      • 1970-01-01
      相关资源
      最近更新 更多