#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 в отдельнои потоке, так как ссылка при перерисовке на обьект класса изменяется.
Комментариев нет:
Отправить комментарий