2016-09-27 4 views
0

저는 스택 오버플로에서 비슷한 문제에 대한 해결책을 여러 개 읽고 시도했지만 그 중 아무 것도 내 문제를 해결하지 못했습니다. 여기 있습니다.CustomListAdapter 목록 항목이 서로를 모방합니다.

나는 CustomListAdapter을 사용하는 listview이며, 각 목록 항목에는 progress bar, 다운로드 버튼, 제목 텍스트 등이 있습니다. 다운로드 button을 클릭하면 다운로드 조작이 수행되고, 다운로드 결과 (성공 또는 실패 여부)에 따라 해당 목록 항목이 업데이트됩니다 (UI, 다운로드 완료 버튼 숨기기, progress bar의 업데이트 진행 중) 다운로드)

first four items on display

문제가 UI 변경 항목으로 될 때마다 항목 1 (인덱스 0) 5도 할 항목을 말할 것입니다 모든 주어진 시간에 네 개의 항목 The listview 표시

똑같은 변화가있다. o 항목 3, 항목 7은 이러한 변경을 수용합니다. 요약 항목 N + 4는 항상 내 getView()에보기 내가 알려진 모든 상자를 확인하신 후 알려드립니다 항목 N.에게

changes of item zero, duplicated by item 5

을 모방. 이 문제를 해결하기 위해

@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

가장 쉬운 방법은 그 목록 당신이 당신의 어댑터에 전달하는 모델 클래스에 몇 가지 추가 필드를 추가하고있다.

다운로드 버튼 (또는 임의의 다른 원하는 이벤트)에 대한 사용자 클릭이 주어진 위치에서 모델 개체 거짓 showDownloadButtonboolean 값을 변경 adapter.notifyDatasetChanged() 전화 따라 버튼의 가시성을 관리 그래서

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

추천 귀하의 어댑터에.

및 aswell보기 볼과 사라 조건을 모두 추가해야 할

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

Nitesh의 대답 권리 떨어져 당신이 모델 클래스

를 작성하지 않으려면 할 수있는 또 다른 방법이에서이다

고유 한 행을 식별하고 해당 ID를 솔루션의 진행률 막대에 지정하려면 setId 및 getId를 사용하십시오.

관련 문제