Android Listview-在线程上加载每一行

时间:2018-12-13 12:57:16

标签: java android multithreading listview

在Java中是否可以对列表视图中的每一行进行多线程处理? 我的列表项是对文件的描述,当有数百个文件时,加载时间太长。我希望它是多线程的,这样我就可以看到加载的项。

这是我的代码。

    Controller_Listrecord adapter;
    ListView lstposts = (ListView) findViewById(R.id.lstviewrecordlist);
    ArrayList<HashMap<String,String>> details = new ArrayList<HashMap<String, String>>();
    File f2 = new File(getFilesDir().getAbsolutePath()); // The location where you want your WAV file

    File[] files = f2.listFiles();
    String text="";
    HashMap<String,String> map=null;
    for(int i=0;i<files.length;i++){

        byte[] data = Base64.decode(files[i].getName(), Base64.DEFAULT);
        try {
            text = new String(data, "UTF-8");
            //text = files[i].getName();
            map = new HashMap<String,String>();
            File file = new File(getFilesDir().getAbsolutePath()+"/"+files[i].getName());
            mplayer = MediaPlayer.create(this, Uri.parse(getFilesDir().getAbsolutePath()+"/"+files[i].getName()));


            Date lastModDate = new Date(file.lastModified());


            map.put("recordingtitle",text);
            map.put("recordingduration", mplayer.getDuration()+"");

            String thedate ;//= DateFormat.getDateInstance(DateFormat.FULL).format(lastModDate);

            thedate = android.text.format.DateFormat.format("MMMM dd, yyyy, hh:mm a", lastModDate)+"";

            map.put("recordingdate",thedate);

            details.add(map);

        } catch (UnsupportedEncodingException e){
            e.printStackTrace();
        }
    }

    adapter = new Controller_Listrecord(this,details);
    lstposts.setAdapter(adapter);

1 个答案:

答案 0 :(得分:0)

假设您有

ArrayAdapter<String> adapter;

比您可以添加一个同步功能(以避免冲突),该功能将一个项目添加到该适配器:

public synchronized void addItemToList(String item){
    adapter.add(item);
    runOnUiThread(new Runnable() {
        @Override
        public void run() {
            adapter.notifyDataSetChanged();
        }
    });
}

然后在每次接收到项目时在函数中调用该函数:

public void runOnBackground(){
    new Thread(new Runnable() {
        @Override
        public void run() {
            while(true) {
                String item = getItemFromSomwhere();
                addItemToList(item);
            }
        }
    }).start();
}