Страницы

Поиск по вопросам

воскресенье, 12 января 2020 г.

ListView Adapter с ProgressBar и ImagеButton

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

Комментариев нет:

Отправить комментарий