2016-09-27 2 views
0

Я прочитал и попробовал несколько решений для подобных проблем здесь при переполнении стека, но ни одна из них не решила мою проблему. Вот что.Элементы списка CustomListAdapter подражают друг другу

У меня есть listview, который использует CustomListAdapter, каждый элемент списка имеет progress bar, кнопку загрузки, текст заголовка и так далее. При нажатии на загрузку button выполняется операция загрузки и на основе результата загрузки (независимо от того, успешна или неудачна) элемент списка связан с обновлением (UI изменений, например, если кнопка скрыть скрытую загрузку, обновить ход progress bar во время скачать)

The listview отображает четыре элемента в каждый данный момент

first four items on display

проблема в том, что всякий раз, когда UI сделано изменение пункта сказать пункт 1 (с индексом 0) пункта 5 также будет имеют те же самые изменения, аналогично, если изменение сделано t o пункт 3, элемент 7 принимает эти изменения. В итоге элемент N + 4 всегда подражает товаром N.

changes of item zero, duplicated by item 5

Посмотрите на мой getView() будет сказать, что я проверил все известные коробки.

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    View view = convertView; 
    ViewHolder holder; 

    if (convertView == null) { 
     view = inflater.inflate(R.layout.item_mylibrarylist, null); 
     holder = new ViewHolder(); 

     holder.name = (TextView)view.findViewById(R.id.name); 
     holder.name.setTypeface(MainActivity.font_bahamas); 

     holder.author = (TextView)view.findViewById(R.id.author); 
     holder.author.setTypeface(MainActivity.font_bahamas); 

     holder.worktype = (TextView)view.findViewById(R.id.worktype); 
     holder.worktype.setTypeface(MainActivity.font_bahamas); 

     holder.coverPic = (TextView)view.findViewById(R.id.coverPic); 
     holder.downloadBt = (TextView)view.findViewById(R.id.downloadBt); 
     holder.progressBar = (ProgressBar)view.findViewById(R.id.progressBar2); 

     holder.menuBt = (ImageView)view.findViewById(R.id.menuBt); 

     holder.position = position; 

     view.setTag(holder); 

    } else { 
     holder = (ViewHolder) view.getTag(); 

    } 

    if(holder.position == position) { 
     setValuesForListItemViews(holder, position, view); 
    } 
    return view; 
} 

Метод для установки каждого из элементов списка ..

private void setValuesForListItemViews(ViewHolder holder, int position, View view) { 

    if (!data.isEmpty()) { 
     // set the list item elements here 
     final CreativeWork creativeWork = data.get(position); 

     holder.name.setText(creativeWork.getName().toLowerCase()); 
     holder.author.setText("by " + creativeWork.getOriginal_authors().toLowerCase()); 
     holder.worktype.setText(creativeWork.getWork_type().toLowerCase()); 

     Drawable draw = res.getDrawable(R.drawable.custom_progressbar2); 
     holder.progressBar.setProgressDrawable(draw); 
     holder.progressBar.setMax(100); 
     holder.progressBar.setVisibility(View.INVISIBLE); 

     holder.menuBt.setOnClickListener(new OnItemClickedListener(view, position, 1, creativeWork, holder.progressBar, holder.downloadBt)); 
     holder.menuBt.setOnCreateContextMenuListener(new MContextMenuListener(creativeWork, holder.progressBar, holder.downloadBt, false)); 


     //load image url 
     ImageLoader2 imgLoader12 = new ImageLoader2(activity); 
     imgLoader12.DisplayImage(creativeWork.getName(), R.drawable.downloads, holder.downloadBt); 

     ImageLoader imgLoader = new ImageLoader(activity); 
     imgLoader.DisplayImage(SLService.END_POINT + creativeWork.getImage_url(), R.drawable.soul_lounge, holder.coverPic); 

     //check if file already exist and switch off download button 
     DBHelper helper = new DBHelper(activity); 
     CreativeWork cw = helper.getCreativeWork(creativeWork); 

     if (cw != null) { 
      File file = new File(cw.getFilePath()); 
      if (file.exists()) { 
       holder.menuBt.setOnCreateContextMenuListener(new MContextMenuListener(creativeWork, holder.progressBar, holder.downloadBt, true)); 

       //check if the file download was complete 
       if (cw != null) { 
        if (cw.getFileSize() > file.length()) { 
         holder.progressBar.setProgressDrawable(activity.getResources().getDrawable(R.drawable.custom_progressbar3)); 

         ImageLoader2 imgLoader2 = new ImageLoader2(activity); 
         imgLoader2.DisplayImage(cw.getName(), R.drawable.restart, holder.downloadBt); 

         holder.progressBar.setProgress((int) ((file.length() * 100)/cw.getFileSize())); 
         holder.progressBar.setVisibility(View.VISIBLE); 
        } else { 
         holder.downloadBt.setVisibility(View.INVISIBLE); 
        } 
       } 
      } 
     } 
     holder.downloadBt.setOnClickListener(new OnItemClickedListener(view, position, creativeWork, holder.progressBar, holder.downloadBt, 0)); 
    } 
} 
+0

Пожалуйста, отправьте код настройки. [Первые четыре элемента и следующий цикл] –

ответ

1

Самый простой способ решить это добавить некоторые дополнительные поля для вашей модели класса список которого вы передаете к адаптеру.

как

boolean showDownloadButton; //default is true 
int progress;// default is 0 

Так что, когда пользователь нажимает на кнопку загрузки (или любого другого желаемого события) изменить значение showDownloadButtonboolean ложь для модели объекта в данной позиции и вызвать adapter.notifyDatasetChanged() и управлять видимостью кнопки соответственно в вашем адаптере.

и не забудьте добавить как видимое и Gone условие зрения как хорошо

if(modelList.get(position).getShowDownloadButton()) 
{ 
    btnDownload.setVisibility(View.VISIBLE) 
} 
else 
{ 
    btnDownload.setVisibility(View.GONE) 
} 
0

ответ Nitesh является правильным, кроме этого есть еще один способ сделать, если вы не хотите, чтобы создать модель класса

Используйте setId и getId с позицией, чтобы идентифицировать уникальную строку и назначить этот идентификатор на прогрессбар для решения

Смежные вопросы