在scrolllistview上加载记录

时间:2012-02-16 09:01:26

标签: android

我需要在自定义列表视图中防止延迟加载。所以我发现scrollview onscroll listner是有帮助的,我已经尝试过但没有成功实现这个功能。

代码:

lviewAdapter = new ListViewAdapter(SaxParser2.this, Arr_ActivityName, Arr_AudioScript,Arr_RequestID,Arr_FolderPath,Arr_RequestTo);
    lview.setOnScrollListener(SaxParser2.this);       

@Override
public void onScroll(AbsListView arg0, int arg1, int arg2, int arg3) {
    // TODO Auto-generated method stub
     lview.setAdapter(lviewAdapter);
}
@Override
public void onScrollStateChanged(AbsListView arg0, int arg1) {
    // TODO Auto-generated method stub      
}

这是我的BaseAdapter

package com.RecordingApp;

import it.sauronsoftware.ftp4j.FTPClient;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.io.Writer;
import java.net.HttpURLConnection;
import java.net.URL;

import android.app.Activity;
import android.app.AlertDialog;
import android.app.ProgressDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.graphics.Typeface;
import android.graphics.drawable.AnimationDrawable;
import android.media.MediaPlayer;
import android.media.MediaRecorder;
import android.os.AsyncTask;
import android.os.CountDownTimer;
import android.os.Environment;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

import com.Sharedpreferance.GMailSender;

public class ListViewAdapter extends BaseAdapter {
    public static Activity context;

    String title[];
    String description[];
    String RequestId[];
    String Folderpath[];
    String RequestTo[];

    boolean b_Flag_Record_or_not = false;
    boolean b_upload_or_not = false;
    boolean start_or_not = false;
    boolean start_play = false;
    boolean upload_or_not = false;
    boolean b_play_or_not = false;
    boolean isplaying2 = false;

    Thread welcomeThread,welcomeThread2;
    int glob_position;
    MediaPlayer mPlayer2;
    int flag_stop_position;
    AudioRecorder recorder;
    AnimationDrawable frameAnimation, frameAnimation_play;
    private static String mFileName = null;
    private MediaRecorder mRecorder = null;
    private MediaPlayer mPlayer = null;
    Recording login = new Recording();


    MediaPlayer MP_completeRequest = new MediaPlayer();

    public ListViewAdapter(Activity context, String[] title,
            String[] description, String[] req_id, String[] FolderPath,
            String[] Arr_RequestTo) {
        super();
        this.context = context;
        this.title = title;
        this.description = description;
        this.RequestId = req_id;
        this.Folderpath = FolderPath;
        this.RequestTo = Arr_RequestTo;
    }

    public int getCount() {
        // TODO Auto-generated method stub
        return title.length;
    }

    public Object getItem(int position) {
        // TODO Auto-generated method stub
        return null;
    }

    public long getItemId(int position) {
        // TODO Auto-generated method stub
        return 0;
    }

    private class ViewHolder {
        TextView txtViewTitle;
        TextView txtViewDescription;
        Button record, stop, play, upload;
    }

    public View getView(final int position, View convertView, ViewGroup parent) {
        // TODO Auto-generated method stub
        final ViewHolder holder;
        LayoutInflater inflater = context.getLayoutInflater();
        glob_position = position;
        if (convertView == null) {
            convertView = inflater.inflate(R.layout.listitem_row, null);
            holder = new ViewHolder();
            holder.txtViewTitle = (TextView) convertView
                    .findViewById(R.id.textView1);
            holder.txtViewDescription = (TextView) convertView
                    .findViewById(R.id.textView2);
            holder.record = (Button) convertView.findViewById(R.id.record);

            holder.stop = (Button) convertView.findViewById(R.id.stop);
            holder.play = (Button) convertView.findViewById(R.id.play1);
            holder.upload = (Button) convertView
                    .findViewById(R.id.audio_upload);

            holder.record.setOnClickListener(new View.OnClickListener() {
                public void onClick(View v) {

                    if (isplaying2 == true) {

                    } else {
                        if (b_Flag_Record_or_not == true) {
                        } else {
                            try {

                                holder.record.setBackgroundResource(R.drawable.record_green);
                                b_Flag_Record_or_not = true;
                                b_play_or_not = true;

                                flag_stop_position = position;
                                AuthHandler dataHandler = new AuthHandler();
                                AuthDataset dataset = dataHandler
                                        .getParsednewJobdtl_DataSet();


                                // Login l = new Login();
                                String str_useid = RequestTo[position];
                                recorder = new AudioRecorder(
                                        "/audiometer/shanesh"
                                                + RequestId[position] + "-"
                                                + str_useid);
                                start_or_not = true;
                                recorder.start();
                                Toast.makeText(context, "Recording Started",
                                        Toast.LENGTH_LONG).show();
                                CountDownTimer countDowntimer = new CountDownTimer(
                                        120000000, 1000) {
                                    public void onTick(long millisUntilFinished) {
                                    }

                                    public void onFinish() {
                                        try {
                                            Toast.makeText(
                                                    context,
                                                    "Stop recording Automatically ",
                                                    Toast.LENGTH_LONG).show();
                                            recorder.stop();
                                        } catch (Exception e) {
                                            // TODO Auto-generated catch block
                                            e.printStackTrace();
                                        }
                                    }
                                };
                                countDowntimer.start();

                            } catch (IOException e) {
                                gotoGmail(e);
                            } catch (Exception e) {
                                gotoGmail(e);
                            }
                        }

                    }
                }
            });

            convertView.setTag(holder);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }
        try {

            Typeface face = Typeface.createFromAsset(context.getAssets(),
                    "fonts/tahoma.ttf");
            holder.txtViewTitle.setTypeface(face);

            holder.txtViewTitle.setText(title[position]);
            holder.txtViewDescription.setText(description[position]);

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

        holder.stop.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                try {
                    if (isplaying2 == true) {
                        mPlayer2.stop();

                        isplaying2 = false;
                    } else {
                    holder.record.setBackgroundResource(R.drawable.page7_15);
                        if (flag_stop_position == position) {
                            b_Flag_Record_or_not = false;
                            if (start_or_not == true) {
                                b_play_or_not = false;

                                recorder.stop();
                                upload_or_not = true;
                                start_play = true;
                                Toast.makeText(context, "Stoped Recording",
                                        Toast.LENGTH_LONG).show();
                            } else {
                                Toast.makeText(context,
                                        " Please Start recording ",
                                        Toast.LENGTH_LONG).show();

                            }
                        } else {

                        }

                    }

                } catch (Exception e) {
                    gotoGmail(e);
                }
            }
        });
        holder.play.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                String temp = SaxParser2.str_completeORpendingFlag;

                if (temp.equalsIgnoreCase("c")) {
                    try {

                        final MediaPlayer mPlayer = new MediaPlayer();
                        try {

                            mPlayer.setDataSource(Folderpath[position]);

                            mPlayer.prepare();

                            final int welcomeScreenDisplay = mPlayer
                                    .getDuration();
                            welcomeThread = new Thread() {
                                int wait = 0;

                                @Override
                                public void run() {
                                    try {
                                        isplaying2 = true;
                                        mPlayer.start();
                                        while (wait < welcomeScreenDisplay) {
                                            sleep(100);
                                            wait += 100;
                                        }
                                    } catch (Exception e) {

                                    } finally {
                                        isplaying2 = false;
                                    }
                                }
                            };
                            welcomeThread.start();

                        } catch (Exception e) {
                            gotoGmail(e);
                        }

                    } catch (Exception e) {
                        gotoGmail(e);
                    }
                } else if (temp.equalsIgnoreCase("p")) {
                    try {

                        if (b_play_or_not == true) {

                        } else {

                            String str_useid = RequestTo[position];
                            java.io.File file = new java.io.File(Environment
                                    .getExternalStorageDirectory()
                                    + "/audiometer/", "shanesh"
                                    + RequestId[position] + "-" + str_useid
                                    + ".amr");
                            if (file.exists()) {

                                Toast.makeText(context, "Playing",
                                        Toast.LENGTH_LONG).show();

                                mPlayer2 = new MediaPlayer();
                                try {
                                    mPlayer2.setDataSource(Environment
                                            .getExternalStorageDirectory()
                                            + "/audiometer/shanesh"
                                            + RequestId[position]
                                            + "-"
                                            + str_useid + ".amr");
                                    mPlayer2.prepare();
                                    mPlayer2.start();
                                    isplaying2 = true;

                                    final int welcomeScreenDisplay = mPlayer2
                                            .getDuration();
                                    /**
                                     * create a thread to show splash up to
                                     * splash time
                                     */
                                    welcomeThread = new Thread() {
                                        int wait = 0;

                                        @Override
                                        public void run() {
                                            try {mPlayer2.prepare();

                                                while (wait < welcomeScreenDisplay) {
                                                    sleep(100);
                                                    wait += 100;
                                                }
                                            } catch (Exception e) {

                                            } finally {
                                                welcomeThread2 = new Thread() {
                                                    int wait = 0;

                                                    @Override
                                                    public void run() {
                                                        try {
                                                            mPlayer2.start();
                                                            while (wait < welcomeScreenDisplay) {
                                                                sleep(100);
                                                                wait += 100;
                                                            }
                                                        } catch (Exception e) {

                                                        } finally {
                                                            // frameAnimation_play.stop();
                                                            isplaying2 = false;
                                                        }
                                                    }
                                                };
                                                welcomeThread2.start();

                                            }
                                        }
                                    };
                                    welcomeThread.start();


                                } catch (Exception e) {
                                    gotoGmail(e);
                                }
                            } else {
                                Toast.makeText(context, " File Not Found ",
                                        Toast.LENGTH_LONG).show();

                            }
                        }

                    } catch (Exception e) {

                        gotoGmail(e);
                    }
                }

            }
        });

        holder.upload.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                glob_position = position;
                // String str_useid = RequestTo[position];
                if (upload_or_not == true) {
                    try {
                        new xyz().execute();

                    } catch (Exception e) {
                        gotoGmail(e);
                    }
                }

            }

        });
        return convertView;
    }

    private class xyz extends AsyncTask<Void, Void, Void> {
        private final ProgressDialog dialog = new ProgressDialog(context);

        protected void onPreExecute() {
            try {
                this.dialog.setMessage("Uploading...Please Wait..");
                dialog.setIndeterminate(true);
                dialog.setCancelable(false);
                this.dialog.show();

                // put your code which preload with processDialog
            } catch (Exception e) {
                gotoGmail(e);
            }
        }

        @Override
        protected Void doInBackground(Void... arg0) {
            for (int i = 0; i < 100000; i++) {

            }
            it.sauronsoftware.ftp4j.FTPClient con = new it.sauronsoftware.ftp4j.FTPClient();
            try {
                String str_useid = RequestTo[glob_position];
                con.connect("URL");
                con.login("as", "asdasd");
                con.changeDirectory("/rangam/RequestContent/audio");
                con.setPassive(true);
                con.setType(FTPClient.TYPE_BINARY);

                con.upload(new java.io.File(Environment
                        .getExternalStorageDirectory()
                        + "/audiometer/shanesh"
                        + RequestId[glob_position] + "-" + str_useid + ".amr"));

                String filename = "/shanesh" + RequestId[glob_position] + "-"
                        + str_useid + ".amr";
                con.logout();
                con.disconnect(true);
                String MachineName = Machinelist.str_Machinename;
                sendFlagToServer(RequestId[glob_position], filename,
                        MachineName);

            } catch (Exception e) {
                gotoGmail(e);
            }

            return null;

        }

        protected void onPostExecute(final Void unused) {

            if (this.dialog.isShowing()) {
                try {
                    this.dialog.dismiss();
                    AlertDialog.Builder alertbox = new AlertDialog.Builder(
                            context);
                    alertbox.setTitle("Message");
                    alertbox.setMessage(":: Uploaded Successfully  ::");
                    alertbox.setPositiveButton("OK",
                            new DialogInterface.OnClickListener() {
                                public void onClick(DialogInterface arg0,
                                        int arg1) {
                                    Intent intent_request = new Intent(context,
                                            SaxParser2.class);
                                    intent_request.putExtra("value", Machinelist.str_UIDValue);
                                    intent_request.putExtra("machineName",
                                            Machinelist.str_Machinename);
                                    intent_request.putExtra("captureBack_or_not", 2);
                                    context.startActivity(intent_request);
                                    context.finish();
                                }
                            });
                    alertbox.show();

                } catch (Exception e) {
                    gotoGmail(e);
                }
            }

        }
    }

    private void sendFlagToServer(String requestID, String filename,
            String machineName) {
        HttpURLConnection connection;
        OutputStreamWriter request = null;
        String MachineName = Machinelist.str_Machinename;
        URL url = null;
        String parameters = "RequestID=" + requestID + "&FileName=" + filename
                + "&MachineName=" + MachineName + "&RequestType=A";
        try {
            url = new URL(
                    "URL");
            connection = (HttpURLConnection) url.openConnection();
            connection.setDoOutput(true);
            connection.setRequestProperty("Content-Type",
                    "application/x-www-form-urlencoded");
            connection.setRequestMethod("POST");

            request = new OutputStreamWriter(connection.getOutputStream());
            request.write(parameters);
            request.flush();
            request.close();
            String line = "";
            InputStreamReader isr = new InputStreamReader(
                    connection.getInputStream());
            BufferedReader reader = new BufferedReader(isr);
            StringBuilder sb = new StringBuilder();
            while ((line = reader.readLine()) != null) {
                sb.append(line + "\n");
            }

            isr.close();
            reader.close();

        } catch (Exception e) {
            gotoGmail(e);
        }

    }

    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if ((keyCode == KeyEvent.KEYCODE_BACK)) {

            try {

                context.finish();
            } catch (Exception e) {
                gotoGmail(e);
            }

        }
        return false;
    }
     void gotoGmail(Exception e) {
        Writer writer = new StringWriter();
        PrintWriter printWriter = new PrintWriter(writer);
        e.printStackTrace(printWriter);
        String s = writer.toString();

    }

}

2 个答案:

答案 0 :(得分:1)

确定,

首先,您必须定义“我需要加载的视图数量是多少,以便我的用户不要看到它是延迟加载的?” :

比方说,你想要加载20行......

现在你在onscroll上,或者在你想要的任何地方,但在滚动或Adapter.getView上,你必须知道屏幕上显示的是什么......让我解释一下:

我想加载20行,因此我的用户没有注意到, 我显示了其中10个 其中10个只是隐藏(如果这个人不滚动则不显示。)

现在,当这个家伙刚刚进入我的第15排时,我还要加载10个 什么是最好的方法呢???

嗯,让我们看看,试图找到一些能够返回屏幕上显示的最后一行(ABSOLUTE)号的东西 - 这可能是一个不错的解决方案。 一个重要的解决方案可能是您的第10行或第15行是屏幕上显示的第一行吗?

等等...

我觉得这样的东西应该可以解决问题。 ;)

答案 1 :(得分:0)

以下是我从Net抓起的一个示例。它是按listening to the Scroll的{​​{1}}加载项目。对于示例,它在ListView中加载日期。到达最终位置后,它将加载接下来的15个日期。它是ListView。您可以将适配器修改为自定义适配器。这个概念是:

  1. 您有一组数据
  2. 首先加载项目
  3. 将滚动侦听器设置为listview
  4. 如果滚动到达Listview中的Last Visible Item,则触发工作线程加载其他m个项目。
  5. 从UI线程通知listview。

    Never Ending List
  6. 修改 您可以获得教程和完整项目here