如何使用动态内容构建两个同步 ListView

Posted

技术标签:

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

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

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

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

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

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

任何帮助将不胜感激。

【问题讨论】:

【参考方案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);


【讨论】:

以上是关于如何使用动态内容构建两个同步 ListView的主要内容,如果未能解决你的问题,请参考以下文章

如何修复动态适配器包装器 Android 中的 notifyDataSetChanged/ListView 问题

如何在颤动中使用listview builder制作动态单选按钮?

请问 WPF中如何动态改变 ListView中 某一个值 颜色。

C# wpf listview 如何动态添加 高手回答下

如何构建包含 ListView.Builder 的自定义行,以在颤动中构建 ElevatedButton?

如何同步无限的 UIScrollView?