ViewPager로 처음 호출하면서 이미지를 불러오는 작업을 하고 있습니다
근데 좌우로 넘기고 다시 이미지있는 뷰로 돌아오면 다시받아오느라 시간이 걸리네요...
이미지 받아올때는 AsyncTask를 이용해서 외부url을 통해 bitmap형식으로 변환시켜 뿌려주는 방식입니다..
되돌아오면 다시 받는게 AsyncTask 때문인지...아니면 getView에서 재활용(?)시켜서 그런건지...이해가 안갑니다...
소스를 봐주시고 해결방법좀 알려주시면 감사드리겠습니다...(__)
짧은 댓글 하나에도 소중이 받겠습니다...
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mPos = getArguments() != null ? getArguments().getInt("position") : 0;
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
imageLoader = new ImageLoader(TestFragment.this.getActivity());
fade = AnimationUtils.loadAnimation(getActivity(), R.anim.fade);
vi = (LayoutInflater)getActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
// 각각의 페이지마다 다른 뷰를 호출합니다...
(1,2번 페이지에서만 AsyncTask 를 통해서 이미지를 적용시킵니다..
if(mPos == 0){
v = inflater.inflate(R.layout.category_list, null, false);
....
}else if(mPos == 1){
v = inflater.inflate(R.layout.array_button, null, false);
....
new ATask().execute("1", "1", "1");
}else if(mPos == 2){
v = inflater.inflate(R.layout.array_button, null, false);
...
new ATask().execute("2", "2", "2");
}else if(mPos == 3){
v = inflater.inflate(R.layout.category_list, null, false);
...
}
return v;
}
// List 목록 받아오기
class ATask extends AsyncTask<String, String, String>{
@Override // 작업이 시작하기 전에 호출 되는 Callback
protected void onPreExecute(){
super.onPreExecute();
pd = new ProgressDialog(getActivity());
pd.setCancelable(false);
pd.setMax(100);
pd.setMessage(Html.fromHtml("목록을 불러오는 중입니다"));
pd.show();
}
@Override // 내부에서 하는 작업
protected String doInBackground(String... arg0) {
URL url_ = null;
String result = null;
String readLine = null;
BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize = 2;
try {
if(arg0[0].toString().equals("1")){
state = "1";
url_ = new URL("...); // 해당 url을 받아서 bitmap 으로이미지화 시킵니다
StringBuffer sb = new StringBuffer();
...
}
} catch (MalformedURLException e) {
e.printStackTrace();
}
return result;
}
@Override // 작업이 끝난 후 호출 되는 Callback
protected void onPostExecute(String result){
if(state.toString().equals("1")){
imageLoader.DisplayImage(path1.get(0), game_iv1);
...
imageLoader.DisplayImage(path1.get(13), game_iv14);
}else if(state.toString().equals("2")){
imageLoader.DisplayImage(path2.get(0), game_iv1);
...
imageLoader.DisplayImage(path2.get(13), game_iv14);
}
super.onPostExecute(result);
}
@Override // 취소할때 호출되는 Callback
protected void onCancelled(){
super.onCancelled();
}
}
private class ListAdapter extends ArrayAdapter<CustomClass> {
private ArrayList<CustomClass> items;
Context con;
public ListAdapter(Context con, int textViewResourceId, ArrayList<CustomClass> items) {
super(con, textViewResourceId, items);
this.con = con;
this.items = items;
}
class ViewHolder{
LinearLayout ll;
ImageView iv;
TextView tv1;
TextView tv2;
TextView good_tv;
TextView down_count_tv;
TextView category;
}
public View getView(final int position, View convertView, ViewGroup parent) {
ViewHolder holder = null;
if(convertView == null){
holder = new ViewHolder();
LayoutInflater vi = (LayoutInflater)con.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = vi.inflate(R.layout.list_adapter, null);
convertView.setTag(holder);
}else{
holder = (ViewHolder) convertView.getTag();
}
CustomClass p = items.get(position);
holder.category = (TextView)convertView.findViewById(R.id.category);
holder.category.setVisibility(View.VISIBLE);
holder.category.setTextSize(18);
holder.category.setTextColor(Color.WHITE);
holder.category.setText(Html.fromHtml(p.getSubject()));
// 쓰지않는 View
holder.ll = (LinearLayout)convertView.findViewById(R.id.ll);
holder.iv = (ImageView)convertView.findViewById(R.id.iv);
holder.tv1 = (TextView)convertView.findViewById(R.id.tv1);
holder.tv2 = (TextView)convertView.findViewById(R.id.tv2);
holder.good_tv = (TextView)convertView.findViewById(R.id.good_tv);
holder.down_count_tv = (TextView)convertView.findViewById(R.id.down_count_tv);
holder.ll.setVisibility(View.GONE); holder.iv.setVisibility(View.GONE);
holder.tv1.setVisibility(View.GONE); holder.tv2.setVisibility(View.GONE);
holder.good_tv.setVisibility(View.GONE); holder.down_count_tv.setVisibility(View.GONE);
return convertView;
}
}




음.. 제가 알고있는게 맞는지는 잘 모르겠는데
ViewPager에서 fragment를 유지하고 있는 view들은 현재 보이는 fragment와 바로 좌, 우 fragment만
유지하는 걸로 알고 있습니다.
만약 그림이 있는 페이지(fragment)가 맨 첫페이지이라면
1,2 페이지를 유지하고 있다가
3페이지를 보게 된다면 양 옆인 2,3,4 페이지만 유지하고 1페이지는 pause 상태로 돌아갈겁니다
그상태에서 다시 2페이지나 1페이지로 갔다고 한다면 다시 fragment 생명주기상
onPause -> onStop -> onDestroyView -> onCreateView() -> 순으로 돌아가서
다시 이미지를 불러오게 되는거 같습니다..