Android ListView动态加载内容

Android ListView动态加载内容,android,android-listview,Android,Android Listview,你好 我需要的是: 我需要创建一个带有自定义行的ListView,当用户在这些行上滚动时,它将异步加载信息到这些行中。 像- 我们打开布局,显示了5行 我对这些进行异步加载,例如加载照片 用户向下滚动,再打开3个 我加载这3项的数据 问题: 谁能描述一个模式,以及我应该使用的元素来实现这一点 尝试: 基于…布局创建自定义视图(FrameLayout f.e.) 将此自定义视图作为行布局中的根元素 覆盖该视图的onDraw事件 我得到的是: 每次渲染ListView时都会对该事件进行快照,并且

你好

我需要的是: 我需要创建一个带有自定义行的ListView,当用户在这些行上滚动时,它将异步加载信息到这些行中。 像-

  • 我们打开布局,显示了5行
  • 我对这些进行异步加载,例如加载照片
  • 用户向下滚动,再打开3个
  • 我加载这3项的数据
  • 问题: 谁能描述一个模式,以及我应该使用的元素来实现这一点

    尝试:

    • 基于…布局创建自定义视图(FrameLayout f.e.)
    • 将此自定义视图作为行布局中的根元素
    • 覆盖该视图的onDraw事件
    我得到的是:

    每次渲染ListView时都会对该事件进行快照,并且从一开始就对每个项目进行快照

    如有任何建议,将不胜感激,谢谢

    一些代码

    活动,onResume事件

    @Override
    protected void onResume() {
        // TODO Auto-generated method stub
        super.onResume();
        tvl = (TextView) findViewById(R.id.tvLog);
        LinearLayout lv = (LinearLayout) findViewById(R.id.Ll1);
    
        LinkedList<String> ll = new LinkedList<>();
        for (int i = 0; i < 30; i++) {
            ll.add("s"+i);
        }
    
    
        CommonCheckRowAdapter cma = new CommonCheckRowAdapter(getApplication(), ll);
        int adapterCount = cma.getCount();
        for (int i = 0; i < adapterCount; i++) {
            View item = cma.getView(i, null, null);
            lv.addView(item);
        }
    }
    
    适配器的getView(rest-按手册提供)

    和科摩罗排版

    <?xml version="1.0" encoding="utf-8"?>
        <com.example.testscroll.CView xmlns:android="http://schemas.android.com/apk/res/android"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content" >
    
            <TextView
                android:id="@+id/tv1"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:layout_gravity="center_vertical|center_horizontal"
                android:layout_margin="10dp"
                android:gravity="center_horizontal|center_vertical"
                android:minLines="2"
                android:text="www"
                android:textSize="50sp" >
            </TextView>
    </com.example.testscroll.CView>
    
    
    
    适配器:

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        // TODO Auto-generated method stub
        View vi = convertView;
            if (vi == null)
                vi = inflater.inflate(R.layout.common_row, null);
        //Fill
        ((TextView)vi.findViewById(R.id.tv1)).setText(data.get(position));
        ((vi)vi).update();
        return vi;
        }
    

    我用过的和我用过的是:当你在wifi或更高的网络上时,使用一个带有自定义缓存执行器池的异步加载程序来下载所有东西。当您在较慢的网络上时,使用异步任务,并在某些谓词上触发3-4个线程的固定线程池执行器,例如查看加载,或单击刷新按钮并添加滚动侦听器或“加载更多”页脚按钮以加载更多。Hmmm,这绝对是一个解决方案。谢谢它实现了我想要的功能(所有视图都是从一开始创建的,但是加载它们的时间会延长,这样性能就足够了)。我将等待更优雅的解决方案,但如果没有出现-这回答了我的问题。谢谢:)P.S.我想我只是错过了一些东西,cus我需要的是——捕捉CustomView向用户显示的时间,然后将数据加载到其中。。。在Listview中,必须有或多或少的OOB方式,这很棘手。ListView根据屏幕上显示的视图回收其视图。所以,如果屏幕上只能显示4个视图,那么listview将只创建4个视图,并重用它们来显示所有列表项。当用户在后面加载时滚动列表时,这会产生同步问题。这意味着,当您在适配器的getView方法中决定加载模式时,用户可能会完全滚动出视图。处理listview的最佳方法是不要与之抗争。如果网络连接更快,请加载数据并保存在列表中。否则仅按需加载数据。这不会破坏用户体验,也可以防止同步错误。好的,我知道这是一个标准的WF。但是为什么,在这种情况下,我要对我添加到列表中的所有元素进行onDraw激发?从逻辑上讲,我只有一个布局,可能只有一个,但只有4个。。。那样的话,我就用onDraw。。。我之所以这样做(创建项目,然后在需要时填充数据)是因为这种方法允许我最大限度地减少所需的工作量,为我在项目中拥有的所有元素实现这种加速。确实很优雅,但是-它无法完成工作。我想这是因为我没有很好地解释我想要达到的目标。。。我需要的是一种调用asynctask的方法,当用户开始“看到”一行LinearLayout(在我的情况下,我必须从ListView切换到LinearLayout)时,这就是我希望onDraw的原因,这就是为什么我仍然想知道我是否误解了文档中所说的内容(至少我认为是这样说的)onDraw仅在视图对用户可见(点击屏幕)时才会拍摄
    <?xml version="1.0" encoding="utf-8"?>
        <com.example.testscroll.CView xmlns:android="http://schemas.android.com/apk/res/android"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content" >
    
            <TextView
                android:id="@+id/tv1"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:layout_gravity="center_vertical|center_horizontal"
                android:layout_margin="10dp"
                android:gravity="center_horizontal|center_vertical"
                android:minLines="2"
                android:text="www"
                android:textSize="50sp" >
            </TextView>
    </com.example.testscroll.CView>
    
    private String text = "";
    
    public CView(Context context, AttributeSet attrs, int defStyleAttr) {
            super(context, attrs, defStyleAttr);
            this.setWillNotDraw(false);
        }
        public CView(Context context, AttributeSet attrs) {
            super(context, attrs);
            this.setWillNotDraw(false);
        }
        public CView(Context context) {
            super(context);
            this.setWillNotDraw(false);
        }
    
        private void initView(Context context){
            View.inflate(context, R.layout.common_row, this);
        }
    
    
    
        @Override
        protected void onDraw(Canvas canvas) {
            //super.onDraw(canvas);
            //Do what you want.
            //Toast.makeText(getContext(), "Showing.", Toast.LENGTH_SHORT).show();
            //Toast.makeText(getContext(), "Showing " + ((TextView)findViewById(R.id.tv1)).getText().toString(), Toast.LENGTH_SHORT).show();
            MainActivity.tvl.setText(text);
        }
    
    
        @Override
        protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
            super.onLayout(changed, left, top, right, bottom);
        }
    
    public void update(){
       text = MainActivity.tvl.getText().toString() + " "+ ((TextView)findViewById(R.id.tv1)).getText().toString();
    }
    
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        // TODO Auto-generated method stub
        View vi = convertView;
            if (vi == null)
                vi = inflater.inflate(R.layout.common_row, null);
        //Fill
        ((TextView)vi.findViewById(R.id.tv1)).setText(data.get(position));
        ((vi)vi).update();
        return vi;
        }