android 模拟listview多线程下载进度条显示不干扰

时间:2022-05-20 19:37:56

闲来没事写了个模拟下载进度条显示的demo,点击开始下载,然后进度逐渐增加。代码如下:

TestActivity.java如下

package test.demo.com;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.ListView;
import android.widget.ProgressBar;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Timer;
import java.util.TimerTask;

/**
 * Created by Administrator on 2016/1/15.
 */
public class TestActivity extends Activity {
    private ListView lv;
    private TestAdapter mAdapter;
    private Map<Integer, ProgressBar> map;
    private Map<Integer, Integer> progress;
    private List<Integer> positionList;

    @Override
    protected void onCreate (Bundle savedInstanceState) {
        super.onCreate (savedInstanceState);
        setContentView (R.layout.activity_test);
        lv = (ListView) findViewById (R.id.text_lv);
        List<Integer> test = new ArrayList<> ();
        test.add (1);
        test.add (1);
        test.add (1);
        test.add (1);
        map = new HashMap<> ();
        progress = new HashMap<> ();
        positionList = new ArrayList<> ();
        mAdapter = new TestAdapter (this, test, R.layout.item_test, new TestAdapter.myOnClick () {
            @Override
            void myclick (View v, Integer position) {
                map.put (position, (ProgressBar) v);
                progress.put (position, 0);
                positionList.add (position);
                start ();
            }
        });
        lv.setAdapter (mAdapter);
    }

    private void start () {
        new Timer ().schedule (new TimerTask () {
            @Override
            public void run () {
                for (Integer item : positionList) {
                    map.get (item).setProgress (progress.get (item));
                    progress.put (item, progress.get (item) + 5);
                }
            }
        }, 1000, 1000 * 5);
    }

}

adapter如下:


package test.demo.com;

import android.content.Context;
import android.view.View;

import java.util.List;

/**
 * Created by Administrator on 2016/1/15.
 */
public class TestAdapter extends MyBaseAdapter<Integer> {
    public TestAdapter (Context context, List<Integer> datas, int layoutId, myOnClick onClick) {
        super (context, datas, layoutId);
        this.onClick = onClick;
    }

    private myOnClick onClick;

    @Override
    public void convert (ViewHolder holder, Integer integer) {
        holder.getView (R.id.item_test_pb).setOnClickListener (onClick);
        holder.getView (R.id.item_test_pb).setTag (position);
    }


    public static abstract class myOnClick implements View.OnClickListener {
        @Override
        public void onClick (View v) {
            myclick (v, (Integer) v.getTag ());
        }

        abstract void myclick (View v, Integer position);
    }
}
下面是布局文件:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:layout_width="match_parent"
              android:layout_height="match_parent"
              android:orientation="vertical">

    <ListView
        android:id="@+id/text_lv"
        android:layout_width="match_parent"
        android:layout_height="match_parent"></ListView>
</LinearLayout>

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:layout_width="match_parent"
              android:layout_height="match_parent"
              android:orientation="vertical">

    <ProgressBar
        android:id="@+id/item_test_pb"
        style="?android:attr/progressBarStyleHorizontal"
        android:layout_width="300dp"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:layout_margin="10dp"/>
</LinearLayout>

代码不多,很简单啦。

效果就是下图那样啦

android 模拟listview多线程下载进度条显示不干扰