2015-01-25 3 views
-1

내 ListView의 각 뷰에 ProgressBar를 표시하려고합니다.ListView의 각 행에 ProgressBar를 업데이트하고 표시하는 방법

보기의 진행률 막대를 업데이트하기 위해 AsyncTask를 확장하는 홀더 클래스를 만들었습니다.

ListView를 스크롤하지 않으면 현재 구현이 작동합니다. 스크롤 한 후 잘못된 진행 막대가 업데이트되고 이전에 완료된 진행 막대 중 일부는 현재 실행중인 위치에서 시작됩니다.

public class ProgressBarTask extends AsyncTask<Void, Integer, Void> { 

    private static final String TAG = ProgressBarTask.class.getName().toString(); 

    private String title; 

    public TextView mProgressTitle; 
    public ProgressBar mProgressBar; 
    public TextView mProgressPercent; 


    public ProgressBarTask(String text){ 
     title = text; 
    } 

    public void setViews(View base){ 
     mProgressTitle = (TextView) base.findViewById(R.id.progress_title); 
     mProgressBar = (ProgressBar) base.findViewById(R.id.progress_horizontal); 
     mProgressPercent = (TextView) base.findViewById(R.id.progress_percent); 

    @Override 
    protected Void doInBackground(Void... ignore) { 
     for (int i = 0; !isCancelled() && i < 100; i++) { 
      if(i%5 == 0){ 
       Log.i(TAG, title + " publishProgress(" + i + "%)"); 
      } 
      try { 
       Thread.sleep(100); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
      publishProgress(i); 
     } 
     return null; 
    } 


    @Override 
    protected void onProgressUpdate(Integer... percent) { 
     if(percent[0]%5 == 0){ 
      Log.i(TAG, title +" onProgressUpdate(" + percent[0] + "%)"); 
     } 
     mProgressBar.setProgress(percent[0] * mProgressBar.getMax()/100); 
     mProgressPercent.setText(percent[0] + "%"); 
    } 
... 
... 
} 

를 다음과 같이 내 LIST_ITEM이 설명되어 다음과 같이

@Override 
    public View getView(int position, View convertView, ViewGroup parent) { 

     View view = convertView; 

     if (convertView == null) { 
      LayoutInflater li = (LayoutInflater) mContext 
        .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      view = li.inflate(R.layout.list_item, null); 
     } 

     ProgressBarTask asyncViewHolder = mList.get(position); 
     if(asyncViewHolder != null){ 

      asyncViewHolder.setViews(view); 

      if (asyncViewHolder.getStatus() == AsyncTask.Status.PENDING) { 
       asyncViewHolder.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); 
      } 

     } 

     return view; 
    } 

내 비동기 홀더 클래스는 다음과 같이 내가 BaseAdapter를 확장하고

내의 getView의 방법은

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/list_item" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:orientation="vertical"> 

    <TextView 
     android:id="@+id/progress_title" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_gravity="start" 
     android:paddingLeft="8dp" 
     android:paddingTop="8dp" 
     android:text="Progress:" 
     android:textAppearance="?android:attr/textAppearanceLarge" /> 

    <ProgressBar 
     android:id="@+id/progress_horizontal" 
     style="?android:attr/progressBarStyleHorizontal" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_gravity="center" 
     android:max="213" 
     android:padding="8dp" /> 

    <TextView 
     android:id="@+id/progress_percent" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_gravity="center" 
     android:paddingBottom="8dp" 
     android:text="0%" 
     android:textAppearance="?android:attr/textAppearanceLarge" /> 

</LinearLayout> 

나는이 작업을하기 위해 여러 가지 방법을 시도했다. 누군가 내가 잘못하고있는 것을 나에게 설명해 줄 수 있습니까?

감사합니다.

+0

어떻게'mList'가 생성되고 그 내용이 전달됩니까? 텍스트가 움직이거나 진행 막대 만 움직입니까? – MeetTitan

+0

mList는 ProgressBarTasks의 목록입니다. 다른 단편에서 버튼을 클릭하면 새 목록 항목 (행)이 mList에 추가되고 ProgressBar가 즉시 시작됩니다. –

+0

반환 된 'ProgessBarTask'가 예상했던 것과 다를 수 있습니까? 진행률 텍스트가 너무 섞여 있거나 진행 막대 만 섞여 있습니까? – MeetTitan

답변

0

문제는 스크롤 할 때 position 5에 있었던 것이 이제는 1에 있습니다.

코드는 다음 mList.get(1), mList에 저장하는 경우가 position 5에서 만들었 기 때문에 당신이 실제로 찾고있는 ProgressBarTaskmList.get(5) 말합니다.

요약하면 한 페이지 미만인 경우 에 대한 올바른 색인 인 position 만 해당합니다. 스크롤하면 인덱스가 "동기화되지 않음"이됩니다.

ArrayAdapter을 사용하면 편리합니다.

+0

그래, 고마워, 나는 BaseAdapter 대신 ArrayAdapter를 시도 할 것이다. –

+0

@McGee, 내가 당신을 도왔다 고 생각한다면 내 대답을 받아 들일 것을 고려하십시오. – MeetTitan

관련 문제