0

JSONArray에서 오브젝트 수에 따라 동적 조각을 생성하고 싶습니다. json으로 예를 들어ViewPager에 뷰가있는 동적 조각 만들기

내가 배열 내에서 3 개체가 아래 :

 “JSONArray”: [ 
    { 
     "CurrentStep": false, 
     "Id": 1, 
     "MessageOne": "Confirm your location", 
     "MessageTwo": "Prrrrrrrrrrrr”, 
     "PercentageComplete": 100, 
     "StepName": "Prescription Created" 
    }, 
    { 
     "CurrentStep": true, 
     "Id": 2, 
     "MessageOne": "Location confirmed", 
     "MessageTwo": “rrrrrrrrrrrrrrrr”, 
     "PercentageComplete": 0, 
     "StepName": "Location Confirmed" 
    }, 
    { 
     "CurrentStep": false, 
     "Id": 3, 
     "MessageOne": "Pharmacies contacted", 
     "MessageTwo": “rrrrrrrrrrrr”, 
     "PercentageComplete": 0, 
     "StepName": "Pharmacies Contacted" 
    }, 
    { 
     "CurrentStep": false, 
     "Id": 10, 
     "MessageOne": "Ready for collection", 
     "MessageTwo": rrrrrrrrrr, 
     "PercentageComplete": 0, 
     "StepName": 

나는 것 싶습니다 결과를 뭔가 같은 : 당신이 볼 수 있듯이 그래서

So as you can see there are 3 fragemnts following the amount of objects in the JSONArray.

JSONArray에있는 객체의 양을 따르는 3 개의 단편입니다.

어떤 접근 방식을 따라야합니까? 어떤 아이디어?

+0

여기 내 대답을 확인하십시오 - http://stackoverflow.com/a/42758986/1649353 –

답변

0

loader pattern을 사용하여 데이터를로드하고 onDataSetChanged를 트리거하거나 그에 따라 어댑터를 설정하는 것이 좋습니다. 아래는 많은 프로젝트에서 사용하는 기본 뷰 페이지 클래스입니다.

public abstract class BaseDataPagerActivity extends BaseViewPagerActivity implements LoaderManager.LoaderCallbacks<List<BaseData>> { 


public static final String DATA_ID_KEY = "data_id"; 
private static final int DATA_LOADER_TASK_ID = 42; 

protected YourData mData; 
protected long mDataId; 
protected BasePagerAdapter mPagerAdapter; 

@Override 
protected void onCreate(@Nullable Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_view_pager); 
    mPager = (ViewPager) findViewById(R.id.view_pager); 
    setupLoader(getIntent()); 
} 

@Override 
protected void onResume() { 
    super.onResume(); 
    if (mData != null && mData.getCreatedAtDate() != null) { 
     getSupportLoaderManager().restartLoader(DATA_LOADER_TASK_ID, null, this); 
    } 
} 

@Override 
protected void onPause() { 
    super.onPause(); 
    saveData(); 
} 

protected abstract BaseDataPagerAdapter getPagerAdapter(FragmentManager fm, YourData data); 

protected void setupLoader(Intent intent) { 
    mDataId = intent.getLongExtra(DATA_ID_KEY, -1); 
    if (mData != null) { 
     setupAdapter(); 
    } else if (mDataId >= 0L) { 
     getSupportLoaderManager().initLoader(DATA_LOADER_TASK_ID, null, this); 
    } 
} 

public void nextPage() { 
    int pagerCount = mPagerAdapter.getCount(); 
    if (mPager.getCurrentItem() + 1 < pagerCount) { 
     mPager.setCurrentItem(mPager.getCurrentItem() + 1, true); 
    } else { 
     finish(); 
    } 
} 

private void saveData() { 
    if (mData != null) { 
     //TODO: DO something here to save data 
    } 
} 

private void setupAdapter() { 
    if (mData != null && mPager != null) { 
     if (mPagerAdapter != null) { 
      mPagerAdapter.notifyDataSetChanged(); 
     } else { 
      mPagerAdapter = getPagerAdapter(getSupportFragmentManager(), mData); 
      mPager.setAdapter(mPagerAdapter); 
     } 
    } 
} 

@Override 
public Loader<List<BaseData> onCreateLoader(int id, Bundle args) { 
    return new DataLoader(this, mDataId); 
} 

@Override 
public void onLoadFinished(Loader<List<BaseData>> loader, List<BaseData> data) { 
    mDataList = data; 
    setupAdapter(); 
} 

@Override 
public void onLoaderReset(Loader<List<BaseData>> loader) { 
    mData = null; 
} 
} 

여기에 유형에 따라 조각을 변경할 수있는 어댑터가 있습니다. getType 메소드를 가진 기본 클래스가 필요합니다.

public class BasicPagerAdapter extends FragmentStatePagerAdapter { 

private static final int TYPE_A_FRAGMENT = 0; 
private static final int TYPE_B_FRAGMENT = 1; 

List<BaseData> mDataList; 

private static class BaseData { 
    private int mType = -1; 

    public BaseData(int type) { 
     mType = type; 
    } 

    public int getType() { return mType; } 
} 



public BasicPagerAdapter(FragmentManager fm, List<BaseData> dataList) { 
    super(fm); 
    mDataList = dataList; 
} 


@Override 
public Fragment getItem(int position) { 
    Fragment result = null; 

    BaseData currentData = mDataList.get(position); 
    if(currentData.getType() != -1) { 
     switch (currentData.getType()) { 
      case TYPE_A_FRAGMENT: 
       result = TypeAFragment.newInstance(mDataList.get(position); 
       break; 
      case TYPE_B_FRAGMENT: 
       result = TypeBFragment.newInstance(mDataList.get(position)); 
       break; 
     } 
     return result; 
    } 
} 

@Override 
public int getCount() { 
    if(mDataList != null) { 
     mDataList.size(); 
    } 
} 
} 

참고 :이 코드는 이전 프로젝트에서 수정 한 것처럼 실행되지 않았습니다. 그러나 실무 사례는 제공된 것과 다를 수 없습니다. 위의 코드에 대한 질문 사항이 있으면 알려주십시오. 행운과 행복 코딩.