#java #vkontakte_api #listview
Изучая Java, я хотел сделать что-то нормальное, ну и с помощью VKApi решил создать программу что бы скачивать музыку. Реализацию увидите ниже, но проблема в тому, что при листании списка progressBar лагает. Я создал свой adapter что бы заполнить список, 2 textView, imageButton и еще progressBar.Выглядит так : Далее я создал адаптер, которым заполняю, но есть одна проблема, когда я запускаю программу на тел. и начинаю скачивание программы, идет прогресс, но когда я листаю: Во время того, как тот элемент, который пропадает с экрана(скрывается выше отображаемого), то следующий элемент, который прорисовывается отображает прогресс progressBar’а(простите за каламбур), того, что пропал. Полный код адаптера(думаю проблема в getView()): public class MusicAdapter extends BaseAdapter { @Override public int getCount() { return musicList.size(); } @Override public Object getItem(int position) { return musicList.get(position); } @Override public long getItemId(int position) { return position; } VkAudioArray musicList; Context context; LayoutInflater lInflater; MusicAdapter(Context context, VkAudioArray musList) { this.context = context; musicList = musList; lInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); } @Override public View getView(final int position, View convertView, ViewGroup parent) { // используем созданные, но не используемые view View view = convertView; if (view == null) { view = lInflater.inflate(R.layout.item, parent, false); } final VKApiAudio p = (VKApiAudio) getItem(position); ((TextView) view.findViewById(R.id.artist)).setText(p.artist); ((TextView) view.findViewById(R.id.title)).setText(p.title); final ProgressBar prB = (ProgressBar) view.findViewById(R.id.progressBar); final ImageButton imgB = (ImageButton) view.findViewById(R.id.downloadImg); prB.setProgress(0); imgB.setOnClickListener(new View.OnClickListener() { @Override public void onClick(final View v) { v.setClickable(false); Runnable run = new Runnable() { @Override public void run() { String fileName = p.artist + " - " + p.title + ".mp3"; String filePath = Environment.getExternalStorageDirectory() + File.separator + "VixodiMusic" + File.separator; //The file that will be saved on your computer try { URL link = new URL(p.url); InputStream in = in = new BufferedInputStream(link.openStream()); final ByteArrayOutputStream out = new ByteArrayOutputStream(); byte[] buf = new byte[1024]; /*****************************************/ URL url = new URL(p.url); URLConnection connection = url.openConnection(); final int size = connection.getContentLength(); System.out.println("Размер: " + size + "байт."); System.out.println("Размер: " + size / 1024 + " кбайт."); System.out.println("Размер: " + size / 1024 / 1024 + " мбайт."); /****************************************/ int n = 0; prB.setVisibility(ProgressBar.VISIBLE); //Looper.prepare(); while (-1 != (n = in.read(buf))) { out.write(buf, 0, n); System.out.println((float) out.size() / (float) size * 100); prB.setProgress((int) ((float) out.size() / (float) size * 100)); } //Looper.loop(); out.close(); in.close(); byte[] response = out.toByteArray(); /**/ File file = new File(filePath + fileName); File dir = new File(filePath); dir.mkdir(); file.createNewFile(); /**/ FileOutputStream fos = new FileOutputStream(file); fos.write(response); fos.close(); imgB.post(new Runnable() { @Override public void run() { imgB.setImageResource(R.drawable.progressdone); } }); } catch (Exception a) { imgB.setClickable(true); imgB.setImageResource(R.drawable.progressstart); prB.setProgress(0); System.out.print(a.getMessage()); a.printStackTrace(); } } }; new Thread(run).start(); } }); return view; } String fileInFolder(){ return null; } void checkForExists(VKApiAudio p){ String fileName = p.artist + " - " + p.title + ".mp3"; String filePath = Environment.getExternalStorageDirectory() + File.separator + "VixodiMusic" + File.separator; File myFolder = new File(filePath); File[] files = myFolder.listFiles(); } }
Ответы
Ответ 1
Так, решил проблему, нужно было создать отдельный класс, который содержит всю нужную информацию о каждом с обьектов в listView, и не обновлять progressBar в отдельнои потоке, так как ссылка при перерисовке на обьект класса изменяется.
Комментариев нет:
Отправить комментарий