2017-01-08 6 views
0

AsyncTask에서 실행되는 동안 ViewGroup의 특정 요소의 속성을 업데이트하는 가장 좋은 방법은 무엇입니까? 예 : 목록보기의 TextView 항목에서 파일의 다운로드 진행률을 업데이트합니다. 내 코드에는 가장 관련성이 높은 부분 만 남았습니다. FetchDataParams 클래스는 기본적인 청사진만을 제공하며이 문제는 아무 것도 흥미롭지 않습니다.AsyncTask BaseAdapter (ListAdapter)의 ViewGroup 속성을 변경하십시오.

ViewHolder 클래스 :

static class ViewHolder { 
    ProgressBar progressBar; 
    TextView progress; 
    TextView size; 
    ToggleButton toggleBtn; 
    int position; 
} 

BaseAdapter/ListAdapter 클래스 :

public class RouteItemAdapter extends BaseAdapter implements ListAdapter { 
    @Override 
    public View getView(final int position, View convertView, ViewGroup parent) { 
    View view = convertView; 
    if (view == null) { 
     LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     view = inflater.inflate(R.layout.routeitem, null); 
    } 

    routeItem = (TextView)view.findViewById(R.id.routeItem); 
    routeItem.setText(list.get(position).nameShort); 

    toggleBtn = (ToggleButton)view.findViewById(R.id.toggleButton); 

    ViewHolder holder = new ViewHolder(); 
    holder.progressBar = (ProgressBar)view.findViewById(R.id.progressBar); 
    holder.progress = (TextView)view.findViewById(R.id.progress); 
    holder.size = (TextView)view.findViewById(R.id.size); 
    holder.toggleBtn = toggleBtn; 
    view.setTag(R.id.routeItem, holder); 

    toggleBtn.setTag(R.id.toggleButton, this.getItem(position)); 
    toggleBtn.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 
     @Override 
     public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
//Download offline route data in AsyncTask 
     if (isChecked) { 
      RouteItem rItem = (RouteItem)buttonView.getTag(R.id.toggleButton); 
      String routeSelected = rItem.name; 
      FetchData FetchData = new FetchData(); 
      FetchData.execute(routeSelected); 
     } else { 

     } 
     } 
    }); 

    return view; 
    } 

    public void setFileSize(long fileSize) { 
    String sizeOfFile = readableFileSize(fileSize); 
    size.setText("Size: " + sizeOfFile); 
    } 

    public void setProgressBar(int a) { 
    progressBar.setProgress(a); 
    } 

    public void setTextProgress(String a) { 
    progress.setText(a); 
    } 

가 여기에 문제가 온다. AsyncTask를 통해 setFileSize, setProgressBar 및 SetTextProgress를 호출하려면 어떻게해야합니까?

AsyncTask를 코드

private class FetchData extends AsyncTask<String, FetchDataParams, String> { 

    @Override 
    protected String doInBackground(String... routeSelected) { 
     //code removed here... 

     int progress = (int)((i/(float)totalpoints) * 100); 
     String progressString = progress + "/100%"; 
     publishProgress(new FetchDataParams(outputFile.length(), progress, progressString)); 

     //code removed here... 
     return filePath; 
    } 
    //This is what I figured it should be doing, this does not work inside a listAdapter 
    protected void onProgressUpdate(FetchDataParams... params) { 
     setFileSize(params[0].fileLength); 
     setProgressBar(params[0].progress); 
     setTextProgress(params[0].progressString); 
    } 

    @Override 
    protected void onPostExecute(String routeSelected) { 
     super.onPostExecute(routeSelected);  
    } 
    } 

답변

1

당신은 당신의 AsyncTask 업데이트 그것에 view's objectonPostExecute에 보내야합니다. 처럼 :

private class FetchData extends AsyncTask<String, FetchDataParams, String> { 

    View parentView; 

    public FetchData(View parentView){ 
     this.parentView = parentView; 
    } 

    @Override 
    protected String doInBackground(String... routeSelected) { 
     //code removed here... 

     int progress = (int)((i/(float)totalpoints) * 100); 
     String progressString = progress + "/100%"; 
     publishProgress(new FetchDataParams(outputFile.length(), progress, progressString)); 

     //code removed here... 
     return filePath; 
    } 
    //This is what I figured it should be doing, this does not work inside a listAdapter 
    protected void onProgressUpdate(FetchDataParams... params) { 
     setFileSize(parentView, params[0].fileLength); 
     setProgressBar(parentView, params[0].progress); 
     setTextProgress(parentView, params[0].progressString); 
    } 

    @Override 
    protected void onPostExecute(String routeSelected) { 
     super.onPostExecute(routeSelected);  
    } 
    } 

다른 방법 :

public void setFileSize(View view, long fileSize) { 
    String sizeOfFile = readableFileSize(fileSize); 

    size = (TextView)view.findViewById(R.id.size); 

    size.setText("Size: " + sizeOfFile); 
    } 

    public void setProgressBar(View view,int a) { 
    holder.progressBar = (ProgressBar)view.findViewById(R.id.progressBar); 
    progressBar.setProgress(a); 
    } 

    public void setTextProgress(View view,String a) { 
    progress = (TextView)view.findViewById(R.id.progress); 
    progress.setText(a); 
    } 
+0

감사 @NehaK이 매력 – Fullhdpixel

+0

환영 @Fullhdpixel처럼 작동 – NehaK