2012-12-06 3 views
0

누군가가 도와 줄 수 있기를 바랍니다. 지원 라이브러리를 사용하여 여러 목록 조각을 호스팅하는 조각이 있습니다. 목록 조각은 부모 조각에서 비동기 작업을 검색하는 데이터를 표시합니다. 올바르게로드되지 않기 때문에 데이터를로드하는 방법을 정확하게 파악하려고했습니다.ListFragments 잘못된 데이터 이상한 호출기

목록 디스플레이 조각이 출시 될 때마다 얻을 수 및 각 목록 조각이 ArrayList의에서의 위치에서 데이터에 대한 부모 조각을 조회 ArrayList <ArrayList <HashMap <String, String> > >

으로 JSON을 구문 분석하는 비동기 작업을 예비 적. 예. 3 페이지 째에는 목록으로 표시 할 ArrayList가 포함 된 arrList [2]를 검색해야합니다.

호출기가 이상하게 작동합니다. 어쩌면 내가 파편의 수명주기 또는 호출기가 어떻게 사용하는지 이해하지 못할 수도 있습니다. 나는 7 개의 단편을 가지고있다. 만약 내가 frag3에서 시작하면 호출기는 데이터가없는 조각 3을 ​​보여줄 것입니다. 또한 데이터없이 조각 2와 4를로드합니다. 만약 내가 frag 1로 가면 조각 1을 정확하게 표시하고 조각 0을로드 할 것입니다. 나는 frag 0으로 바꿀 수 있지만 frag 2로 전환하면 frag 0에서 데이터를로드하고 frag 0의 데이터를 나머지 모든 조회수. 내가 앞뒤로 충분히 가면 모든 조각의 모든 데이터를 frag 0의 데이터로 대체 할 것입니다. 뷰 페이지가 시작될 때 데이터가 없으므로 데이터를 즉시로드하지 않는다고 생각합니다. 아직 비동기 작업을 기다리지 않았습니다.

필자는 각 조각이 뷰에서 충분히 멀리 떨어질 때마다 뷰가 다시 그려지는 것으로 생각했습니다. 그래서 나는 조각을 onCreateView()에 넣습니다. 나는 이것이 방금 잘못 놓은 작은 일이거나 그것을 간과하고있는 것처럼 느낍니다. 나는 FragmentStatePagerAdapter을 구현하려고했지만 그게 옳다고 생각하지 않습니다.

도움이 많이 감사합니다. 그리고 내가 끔찍한 일을 잘못하고 있다면 매우 열렬히 토론합니다. 나는 보통한다. 결코 실패하지 않습니다. 뭔가를 작성하여 모든 것을 다시 작성해야합니다.

public class ListFragmentDisplay extends SherlockFragment { 
public static final String TAG = "listFragmentDisplay"; 

Calendar calendar = Calendar.getInstance(); 
private int dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK); 
// listbyday is a list of hash maps each list of hash maps represents a day 
// of the week with items for that Object 
private ArrayList<ArrayList<HashMap<String, String>>> listByDay = null; 
private String objectName = null; 
private ViewPager pager; 
private FragAdapter adapter; 

public ArrayList<HashMap<String, String>> getList(int day) { 
    return listByDay.get(day); 

} 
private void getObjectName() { 
    barName = ((MainFragActivity) getActivity()).getobjectSelected(); 
} 
public static ListFragmentDisplay newInstance() { 
    return new ListFragmentDisplay(); 
} 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
} 
@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) { 
    // Inflate the ListView layout file. 
    initArrList(); 
    getObjectName(); 
    fillList(); 
    return inflater.inflate(R.layout.list_view, container, false); 
} 
@Override 
public void onViewCreated(View view, Bundle savedInstanceState) { 
    super.onViewCreated(view, savedInstanceState); 
    pager = (ViewPager) view.findViewById(R.id.viewPager); 
    adapter =new FragAdapter(getChildFragmentManager()); 
    if (pager.getAdapter() == null) 
     pager.setAdapter(adapter); 
    reload(); 
    pager.setOnPageChangeListener(new OnPageChangeListener() { 
     @Override 
     public void onPageScrollStateChanged(int arg0) {} 

     @Override 
     public void onPageScrolled(int arg0, float arg1, int arg2) {reload();} 

     @Override 
     public void onPageSelected(int arg0) { 
     } 
    }); 
    pager.setCurrentItem(dayOfWeek-1); 
} 
private void initArrList() { 
    if (listByDay == null) { 
     listByDay = new ArrayList<ArrayList<HashMap<String, String>>>(); 
    } else { 
     listByDay.clear(); 
    } 
    for (int i = 0; i < 7; i++) { 
     ArrayList<HashMap<String, String>> hm = new ArrayList<HashMap<String, String>>(); 
     listByDay.add(hm); 
    } 
} 
synchronized private void fillList() { 
    LoadWebTask lWT = new LoadWebTask(); 
    executeAsyncTask(lWT, getSherlockActivity().getApplicationContext()); 
} 

FragmentPager

public class FragAdapter extends FragmentPagerAdapter { 
private static final String[] CONTENT = new String[] { "frag0", "frag1", 
     "frag2", "frag3", "frag4", "frag5", "frag6" }; 
public FragAdapter(FragmentManager fm) { 
    super(fm); 

} 
@Override 
public Fragment getItem(int arg0) { 
    return MyListFragment.newInstance(arg0); 
} 
@Override 
public int getCount() { 
    return CONTENT.length; 
} 
@Override 
public CharSequence getPageTitle(int position) { 
    return CONTENT[position % CONTENT.length]; 
} 
} 

ListFragment

public class MyListFragment extends SherlockListFragment { 
public static final String NAME_TAG = "name"; 
public static final String DESCRIPTION_TAG = "description"; 
private static int dow; 
public static final String TAG = "listFragment"; 
// Keys used in Hashmap that will be mapped to the rows 
String[] dFrom = { NAME_TAG, DESCRIPTION_TAG }; 
private ArrayList<HashMap<String, String>> list; 
int[] dTo = { R.id.name, R.id.description }; 
    public void upDateList() { 
    //**************************Not really sure if this is how things are supposed 
      //** to be done. For my small data- set i feel like it will work but i would 
      //** be interested in knowing how else this might be done. 
       ListFragmentDisplay lFD = (ListFragmentDisplay) this 
      .getParentFragment(); 
     dList = lFD.getList(dow); 
} 
public static MyListFragment newInstance(int pos) { 
    MyListFragment frag = new MyListFragment(); 
    dow = pos; 
    return (frag); 
} 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
} 
@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) { 
    upDateList(); 
    View results = inflater.inflate(R.layout.list_fragment, container, 
      false); 
    SimpleAdapter adapter = new SimpleAdapter(getParentFragment() 
      .getActivity(), list, R.layout.listrow, dFrom, dTo); 
    setListAdapter(adapter); 
    return results; 
} 
} 

편집. 해결 된 코드 : 목록 조각 초기 질문이 해결되었습니다. 나는 ListFragmentDisplay에 onPostExecute 콜백을 구현하는 과정에만있다. 아주 멍청한 실수를 해결해 준 Luksprog에게 감사드립니다. 나는 그것의 영향을 알지 못하고 정적을 만들었다. 실제로 이클립스가 충돌을 해결하기 위해 제공 한 것이라고 생각합니다. 나는 그것을 더 가깝게 읽어야했다.

public class MyListFragment extends SherlockListFragment { 
public static final String NAME_TAG = "name"; 
public static final String DESCRIPTION_TAG = "description"; 

public static final String TAG = "listFragment"; 
// Keys used in Hashmap that will be mapped to the rows 
String[] dFrom = { NAME_TAG, DESCRIPTION_TAG }; 
private ArrayList<HashMap<String, String>> list; 
int[] dTo = { R.id.name, R.id.description }; 

    SimpleAdapter adapter = null; **NEW** 

    public void upDateList() { 
         ListFragmentDisplay lFD = (ListFragmentDisplay) this 
      .getParentFragment(); 
     dList = lFD.getList(getArguments().getInt(TAG)); **NEW** 
      if(adapter != null) **NEW** 
      adapter.notifyDataSetChanged(); **NEW** 
} 
public static MyListFragment newInstance(int pos) { 
    MyListFragment frag = new MyListFragment(); 

    Bundle args = new Bundle(); **NEW** 
    args.putInt(TAG, pos); **NEW** 
    frag.setArguments(args); **NEW** 

    return (frag); 
} 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
} 
@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) { 
    upDateList(); 
    View results = inflater.inflate(R.layout.list_fragment, container, 
      false); 
    adapter = new SimpleAdapter(getParentFragment() 
      .getActivity(), list, R.layout.listrow, dFrom, dTo); 
    setListAdapter(adapter); 
    return results; 
} 
} 
+0

[이 PagerAdapter] (http://stackoverflow.com/questions/9417808/updating-fragments-in-a-viewpager)와 같은 페이징 어댑터의 각 조각을 추적해야합니까? – doubleA

+0

나는 아무도 읽으려고하지 않거나 어리석은 질문을하고 있다고 가정 할 수 있습니다. :) – doubleA

답변

1

당신이 staticMyListFragment에서 dow 변수를 만든 이유는 어떤 이유가 있나요? static 키워드를 사용하면 ViewPager의 파편이 자신의 위치를 ​​공유하므로 대부분의 경우 잘못된 위치로 lFD.getList(dow); 메서드를 호출합니다. dow을 비공개 인스턴스 필드로 지정하십시오. private int dow;

나머지 코드는 위의 변경으로 문제가 해결되는지 확인합니다.내부 조각으로 데이터를 업데이트하려면이 시나리오에 따라 수 : ListFragmentDisplay 데이터의 빈 목록

  • 시작을
  • 처음 작업을 시작 내면의 ListFragmnents 데이터 목록이 너무 비어있는 것을 볼 수 있습니다 빈 목록으로 초기화합니다 (getList(int day) 메서드는 listByDay 필드에 데이터가없는 경우 빈 목록 만 반환해야 함)
  • 이제 작업이 완료됩니다. onPostExecute 메소드의 콜백이 AsyncTask이라고 가정 해 보겠습니다. 것을 콜백에서 ListFragmentDisplay 당신이있는 ViewPager에서 모든 Fragment를 업데이트 할 수 있습니다 구현할 중 현재 사용자에게 표시하거나 그래서 FragmentPagerAdapter살아 (null하지 않고 그 getView() 방법은 null를 반환하지 않는 각 Fragment에 있어요 ViewPager에서 업데이트됩니다). 다른 FragmentsonCreateView 메서드를 호출해야하고 사용자가 updateList 호출을하기 때문에 자체 업데이트됩니다.
  • 위의 경우 메서드를 호출하면 표시되는 Fragment이 업데이트되지 않으므로 해당 메서드에서 방금 조각의 목록을 업데이트하면 어댑터에 notifyDataSetChanged을 호출하지 않아서 데이터에 있음을 알 수 있습니다 변경되었습니다.
+0

고마워요. 멋져 보이지만 조각에서 static newInstance()를 어떻게 처리해야합니까? Bundle args = new Bundle(); args.putInt (POSITION, pos); frag.setArguments (args);'와 조각 인수를 통해 int에 액세스합니까? – doubleA

+0

@doubleA 네, 코드에서 그 것을 놓쳤습니다. (처음에'dow'를 정적으로 만든 방법이라고 생각합니다). 예, 번들 (Bundle)은가는 길입니다. 따라서 조각 (Fragment)이 그 위치를 유지할 것입니다. 그런 다음 필요할 때 (또는 라이프 사이클 메소드 중 하나에서) 인수 ('getArguments()')에서 위치를 검색하십시오. – Luksprog

+0

굉장합니다. 나는 이것을 시험해 보는 과정에있다. 나는 곧 당신에게 돌아갈 것이다. – doubleA