모두 환영합니다.ListView가있는 FragmentStatePagerAdapter ... 스크롤없이 목록 뷰의 내용을 업데이트하는 방법은 무엇입니까?
각 페이지에 Listview가있는 FragmentStatePagerAdapter가 있습니다. FragmentStatePagerAdapter는 매초마다 일부 페이지에 대한 새 데이터로 새로 고침됩니다 (각 페이지가 목록보기임을 기억하십시오).
StableArrayAdapter adapter = new StableArrayAdapter((MainActivity) getActivity(), R.layout.list_view_item, ((MainActivity) getActivity()).getData(mPage));
listView.setAdapter(adapter);
문제는, 그래서 모든 초 listView.setAdapter(adapter);
가 호출 될 때, 일부 페이지 콘텐츠 및 수직 스크롤을 많이 가지고있는의 스크롤입니다 :
문제는 이러한 솔루션은 일반 ViewPager 또는 일반 어댑터 위해 설계하고 시도 후 난 여전히 같은 문제를 가지고 있기 때문에, FragmentStatePageAdapter 또는 뭔가 작동하지 않을 수 있다는 것입니다 .
public class CollectionPagerAdapter extends FragmentStatePagerAdapter {
public CollectionPagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int position) {
return ObjectFragment.newInstance(position);
}
@Override
public int getCount() {
return infoTitlesArray.length;
}
@Override
public CharSequence getPageTitle(int position) {
return infoTitlesArray[position];
}
}
문제 갖는다 ViewPager : 조각의
<android.support.v4.view.ViewPager
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/pager"
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.v4.view.PagerTitleStrip
android:id="@+id/pager_title_strip"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="top"
android:paddingTop="4dp"
android:paddingBottom="4dp"
style="@style/CustomPagerTitleStrip"/>
</android.support.v4.view.ViewPager>
레이아웃 :
이
은 FragmentStatePagerAdapter 내 어댑터입니다<ListView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/listview"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
</ListView>
의 자바 코드 단편 :
public static class ObjectFragment extends Fragment implements DataUpdateListener {
private int mPage;
private ListView listView;
public static ObjectFragment newInstance(int page) {
ObjectFragment objectFragment = new ObjectFragment();
Bundle args = new Bundle();
args.putInt("page", page);
objectFragment.setArguments(args);
return objectFragment;
}
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mPage = getArguments().getInt("page");
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_collection_object, container, false);
((MainActivity) getActivity()).addDataUpdateListener(this);
listView = (ListView) rootView;
StableArrayAdapter adapter = new StableArrayAdapter((MainActivity) getActivity(), R.layout.list_view_item, ((MainActivity) getActivity()).getData(mPage));
listView.setAdapter(adapter);
return rootView;
}
@Override
public void onDestroyView() {
((MainActivity) getActivity()).removeDataUpdateListener(this);
super.onDestroyView();
}
//DataUpdateListener interface methods
@Override
public int getPage() {
return mPage;
}
@Override
public void onDataUpdated(ArrayList<String> data) {
StableArrayAdapter adapter = new StableArrayAdapter((MainActivity) getActivity(), R.layout.list_view_item, data);
listView.setAdapter(adapter);
}
}
(listview 인) 내용을 업데이트해야하는 경우 onDataUpdated 메소드가 매개 변수에 수신 된 새 컨텐츠와 함께 호출됩니다. 하려고
새 어댑터 :
이 Budius에서 코드 샘플을 사용하여 충돌을 발생 어댑터를 추가 :
private static class StableArrayAdapter extends ArrayAdapter<String> {
HashMap<String, Integer> mIdMap = new HashMap<String, Integer>();
public StableArrayAdapter(Context context, int textViewResourceId, List<String> objects) {
super(context, textViewResourceId, objects);
for (int i = 0; i < objects.size(); ++i) {
mIdMap.put(objects.get(i), i);
}
}
public void setData(List<String> objects){
mIdMap.clear();
for (int i = 0; i < objects.size(); ++i) {
mIdMap.put(objects.get(i), i);
}
}
@Override
public long getItemId(int position) {
String item = getItem(position);
return mIdMap.get(item);
}
@Override
public boolean hasStableIds() {
return true;
}
}
편집 2 도움
편집에 대한
감사합니다 Budius 솔루션을 사용하십시오. 그러나 그것은 효과가 없습니다. 콘텐츠가 새로 고쳐지지 않습니다.
private static class StableArrayAdapter extends ArrayAdapter<String> {
List<String> objects;
public StableArrayAdapter(Context context, int textViewResourceId, List<String> objects) {
super(context, textViewResourceId, objects);
this.objects = new ArrayList<>();
this.objects.addAll(objects);
}
public void setData(List<String> objects){
this.objects.clear();
this.objects.addAll(objects);
}
@Override
public long getItemId(int position) {
return Math.abs(objects.get(position).hashCode());
}
@Override
public boolean hasStableIds() {
return true;
}
}
안녕하세요, 답변 주셔서 감사합니다. 제발, 당신이 나에게 약간의 코드 예제 나 설명을 줄 수 있습니까? StableArrayAdapter 구현시 hasStableIds를 재정의하여 true를 반환하고 getItemId를 재정의하여 의미있는 값을 반환해야합니다. 데이터가 단순한 문자열이라는 점을 감안할 때 약간 힘들지만 Math.abs (value.hashCode)와 같은 것으로 충분해야합니다. " – NullPointerException
. 내 편집을 참조하십시오. – Budius
mmmm, java.lang.NullPointerException가 발생했습니다 : null 객체 참조에서 가상 메소드 'int java.lang.Integer.intValue()'을 호출하려고 시도했습니다. at com.myapp.activities.MainActivity $ StableArrayAdapter.getItemId – NullPointerException