2

フラグメントがあり、フラグメントにリストビューを設定しています。

コードは次のとおりです。

public class AttachmentsFragment extends Fragment {

ListView lstView = null;

@Override
public void onActivityCreated(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onActivityCreated(savedInstanceState);
}

@Override
public void onAttach(Activity activity) {
    // TODO Auto-generated method stub
    super.onAttach(activity);

}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    //retains fragment instance across Activity re-creation
    setRetainInstance(true);
    objects = new ArrayList<AttachModel>();

}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {

    View view = null;

    view = inflater.inflate(R.layout.tab_attachment, container, false);

    lstView = (ListView) view.findViewById(R.id.listViewAttachment);
    adapter = new AttachAdapter(getActivity(), 0, 0, objects);
    lstView.setAdapter(adapter);

    return view;
}

}

アダプターには、進行状況バーと進行状況バーの進行状況を表示するテキストビューがあります。プログレスバーを開始および停止するボタン

public class AttachAdapter extends ArrayAdapter<AttachModel> implements OnClickListener {

Context context;
ArrayList<AttachModel> objects = new ArrayList<AttachModel>();

AttachModel info;

//Activity act;

AttachModel model;

public AttachmentsAdapter(Context context, int resource,
        int textViewResourceId, ArrayList<AttachmentsModel> objects) {
    super(context, textViewResourceId, textViewResourceId, objects);

    this.context = context;
    this.objects = objects;

} 

// no. of attachments available
@Override
public int getCount() {

    return objects.size();
}

@Override
public AttachmentsModel getItem(int position) {

    return objects.get(position);
}

@Override
public long getItemId(int position) {

    return position;
}

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

    View row = convertView;
    ViewHolder holder = null;

    if(null == row) {
      LayoutInflater inflater = (LayoutInflater)getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
      row = inflater.inflate(R.layout.attachment_list_item, parent, false);


      //textview for showing progress
      holder.textViewProgress = (TextView) row.findViewById(R.id.txtViewPg);

      //progress bar to show the progress
      holder.progressBar = (ProgressBar) row.findViewById(R.id.pgBar);
      holder.progressBar.setTag(position);

      holder.textViewProgress.setVisibility(TextView.VISIBLE);
      holder.img_view_fileIcon.setVisibility(ImageView.VISIBLE);

      holder.progressBar.setVisibility(ProgressBar.VISIBLE);

      //to start stop the progress bar                
      holder.button = (Button)row.findViewById(R.id.img_btn_download);
      holder.button.setVisibility(Button.VISIBLE);

      holder.button.setTag(position);
      holder.button.setOnClickListener(this);

      row.setTag(holder);


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

    }


    return row;
}

private class ViewHolder {
    TextView textViewProgress;
    ProgressBar progressBar;
    Button button;

    boolean downloadFlag = false;

}

@Override
public void onClick(View v) {

    View vParent=(View) v.getParent();

    ViewHolder tempHolder = null;

    tempHolder=(ViewHolder) vParent.getTag();

    //toggle button like functionality
    if(!tempHolder.downloadFlag) {

        tempHolder.downloadFlag = true;
        tempHolder.progressBarStatus = 0;

        async = new AsyncTaskAttachments(tempHolder, objects.get(Integer.parseInt(v.getTag().toString())).getFilePath());

        tempHolder.async.execute();

        objects.get((Integer)tempHolder.progressBar.getTag()).setAsyncTask(tempHolder.async);

    }else {

        tempHolder.downloadFlag = false;
        tempHolder.progressBar.setProgress(0);

        tempHolder.textViewProgress.setVisibility(TextView.GONE);
        tempHolder.textViewProgress.setText("");
        tempHolder.progressBarStatus = 0;

        tempHolder.async.cancel(true);



    }

}

public class AsyncTaskAttachments extends AsyncTask<Void, Void, Void> {

    private ViewHolder holder;

    public AsyncTaskAttachments(ViewHolder holder, String filePath) {
        this.holder = holder;
        this.filePath = filePath;           

    }

    public void attach(Activity act) {
        this.act = act;
    }

    @Override
    protected Void doInBackground(Void... params) {
        // TODO Auto-generated method stub


        holder.progressBarStatus = 0;

        for(int i=0; i<=10; i++) {
            try {
                Thread.sleep(1000);
                holder.progressBarStatus = i*10;


                    if(isCancelled()) {
                        break;
                    }


                publishProgress();
            }catch (Exception e) {
                // TODO: handle exception
            }

        }

        return null;
    }

    /* (non-Javadoc)
     * @see android.os.AsyncTask#onPostExecute(java.lang.Object)
     */
    @Override
    protected void onPostExecute(Void result) {
        // TODO Auto-generated method stub
        super.onPostExecute(result);

    }

    /* (non-Javadoc)
     * @see android.os.AsyncTask#onPreExecute()
     */
    @Override
    protected void onPreExecute() {
        // TODO Auto-generated method stub
        super.onPreExecute();

            holder.progressBarStatus = 0;

            holder.textViewProgress.setText("" + holder.progressBarStatus + "%");

            holder.progressBar.setProgress(holder.progressBarStatus);


    }

    /* (non-Javadoc)
     * @see android.os.AsyncTask#onProgressUpdate(Progress[])
     */
    @Override
    protected void onProgressUpdate(Void... values) {
        // TODO Auto-generated method stub
        super.onProgressUpdate(values);

                // TODO Auto-generated method stub
                holder.progressBar.setProgress(holder.progressBarStatus);
                holder.textViewProgress.setText("" + holder.progressBarStatus + "%");



    }


}

}

注:これは、私が行っている方法を示すためのものです。これはほんの一例です。自分が正しい軌道に乗っているかどうかを知る必要があります。

向きの変更時に、進行状況バーが保持できず、向きが変わった場所から進行状況を開始できません。

前もって感謝します

4

3 に答える 3

1

向きが変わると、アクティビティ (および含まれているフラグメント) が再作成されます。したがって、 asyncTask を再度呼び出すと、進行状況がゼロに設定されます。

holder.progressBarStatus = 0;

解決策: フラグメントの onSaveInstanceState() で進行状況を保存し、onCreateView() で復元し、asyncTask が初期進行状況設定にこの値を使用するようにします。

于 2013-08-02T06:05:33.097 に答える
0

その完了.. この問題に直面している、または将来これに直面するすべての人のために。

ビューを再作成しようとしないでください。onCreate() メソッドでリストビューを 1 回インフレートするだけです。

oncreate および ondestroy メソッドは、フラグメントが保持されるときに 1 回だけ呼び出されるためです。したがって、進行状況バーの状態を維持するために、コードを oncreate メソッドに入れます。

于 2013-08-05T05:03:01.510 に答える