2017-01-08 5 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

関連する問題