2013-08-02 3 views
2

조각이 있는데 조각에 listview를 설정하고 있습니다.안드로이드의 방향 변경 진행률 표시 줄 업데이트

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 + "%"); 



    } 


} 

} 

참고 : 이것은 내가하는 방식을 보여주기위한 것입니다. 이것은 단지 엿볼 수 있습니다. 내가 올바른 길을 가고 있는지 아닌지를 알아야합니다.

오리엔테이션이 변경되면 진행률 막대가 방향을 바꿀 위치를 유지하고 진행을 시작할 수 없습니다. 사전

+0

어플 리케이션 대상 SDK 버전은 무엇입니까? – TheFlash

+0

내 응용 프로그램 타겟 버전은 다음과 같습니다. android-14 –

+0

ur 활동에이 줄을 추가하십시오 : configChanges = "orientation | screenSize | keyboardHidden" – TheFlash

답변

0

완료 ...이 문제에 직면 해 있거나 앞으로이를 직시하는 모든 사람들에게.

보기를 다시 만들지 마십시오. onCreate() 메서드에서 listview를 한 번 팽창하십시오.

왜냐하면 oncreate 및 ondestroy 메서드는 조각을 유지할 때 한 번만 호출되기 때문입니다. 진행 표시 줄의 상태를 유지하려면 increate 메소드에 코드를 넣으십시오.

1

에서

덕분에 (포함 및 조각) 방향 변경, 활동을 다시 생성합니다. 그래서 당신은 다시 AsyncTask를 호출하고 0으로 진행 상황을 설정하는 것 :

holder.progressBarStatus = 0; 

솔루션 : 조각의 onSaveInstanceState (의 진행 상황을 저장), onCreateView에서 resotre() ANS AsyncTask를 초기 진행 설정에 대해이 값을 사용합니다.

+0

조각에 setRetainInstance (true) –

+0

이있는 경우 조각이 재생성되지 않습니다 .its보기가 다시 생성됩니다 –

+0

방향을 변경하면보기가 만들어지고 따라서 뷰 소유자가 다시 초기화되는 문제가 있습니다. . 이전에 실행 중이던 asynctask가 이전 뷰 홀더 참조를가집니다. 그래서 특정 목록 뷰 인덱스에 대한 뷰 소유자의 상태를 저장해야합니까? –

관련 문제