在 activity 开始时使用列表视图获取选项卡中两个选项卡的相同列表
Getting same list for two tabs in tabs with listview on start of activity
所以,我有这个 activity,其中包含带有列表视图的选项卡,我面临的问题是:
第一个和第二个选项卡具有相同的内容,即第二个选项卡应该具有的内容在第一个和第二个选项卡中。
第三个选项卡的内容正确,但这是因为它最初只实例化了第一个和第二个选项卡。
当我设置
mViewPager.setOffscreenPageLimit(2);
三个标签的内容都是一样的,也就是第三个标签的内容
但是在我滚动到第三个选项卡然后滚动回第一个选项卡后,第一个选项卡会刷新并显示正确的内容。
此外,下一个问题是第二个选项卡永远不会刷新,因为它总是在打开的选项卡的右侧或左侧。
我希望标签每次打开时都刷新,因为我会不断更改列表中的 material。
package com.towntrot.anil.towntrot_eventmanager_02;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ListView;
import android.widget.Toast;
import java.util.ArrayList;
public class SlidingTabsBasicFragment extends Fragment {
ListView list;
public ArrayList<ListModel> CustomListViewValuesArr = new ArrayList<ListModel>();
public guestlist gg;
private SlidingTabLayout mSlidingTabLayout;
private ViewPager mViewPager;
private String[] eventtype={"CHECKED IN","CHECKED OUT","WAITING"};
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_sample, container, false);
}
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
mViewPager = (ViewPager) view.findViewById(R.id.viewpager);
mViewPager.setAdapter(new SamplePagerAdapter());
mSlidingTabLayout = (SlidingTabLayout) view.findViewById(R.id.sliding_tabs);
mSlidingTabLayout.setViewPager(mViewPager);
}
class SamplePagerAdapter extends PagerAdapter {
@Override
public int getCount() {
return 3;
}
@Override
public boolean isViewFromObject(View view, Object o) {
return o == view;
}
@Override
public CharSequence getPageTitle(int position) {
return eventtype[position];
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
View view = getActivity().getLayoutInflater().inflate(R.layout.pager_item,
container, false);
guestlist gg=(guestlist)getActivity();
StringBuilder sb = new StringBuilder();
sb.append("");
sb.append(position);
String strI = sb.toString();
Toast.makeText(getActivity(),strI,Toast.LENGTH_LONG).show();
setListData(gg.getNamelist(), gg.getStatuslist(), gg.getNo0fPeople(), position);
list= ( ListView )view.findViewById(R.id.list);
CustomAdapter adapter;
adapter=new CustomAdapter( getActivity(), CustomListViewValuesArr);
list.setAdapter(adapter);
container.addView(view);
return view;
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
container.removeView((View) object);
}
}
public void setListData(String[] string,String[] status,int no,int pos) {
CustomListViewValuesArr.clear();
for (int i = 0; i < no; i++) {
final ListModel name = new ListModel();
int x=Integer.parseInt(status[i]);
if(pos==x){ name.setCompanyName(string[i]);
CustomListViewValuesArr.add(name);}
}
}
}
请帮帮我,我看了很多答案,但无法解决这个问题。任何帮助表示赞赏。
问题是每次实例化寻呼机项目时,您都在调用 setListData
,这又会用给定位置的数据填充 CustomListViewValuesArr
。然后你的列表适配器直接使用这个数组,因为它是在你的片段中定义的,并且根据最后一个实例化的项目,它的内容会改变。
将CustomListViewValuesArr
改为局部变量;在您的 setListData
方法中创建一个新的 ArrayList<ListModel>
对象并 return 它,使用 returned 对象作为您的 CustomAdapter
构造函数参数。
所以,我有这个 activity,其中包含带有列表视图的选项卡,我面临的问题是:
第一个和第二个选项卡具有相同的内容,即第二个选项卡应该具有的内容在第一个和第二个选项卡中。
第三个选项卡的内容正确,但这是因为它最初只实例化了第一个和第二个选项卡。
当我设置
mViewPager.setOffscreenPageLimit(2);
三个标签的内容都是一样的,也就是第三个标签的内容
但是在我滚动到第三个选项卡然后滚动回第一个选项卡后,第一个选项卡会刷新并显示正确的内容。
此外,下一个问题是第二个选项卡永远不会刷新,因为它总是在打开的选项卡的右侧或左侧。 我希望标签每次打开时都刷新,因为我会不断更改列表中的 material。
package com.towntrot.anil.towntrot_eventmanager_02;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ListView;
import android.widget.Toast;
import java.util.ArrayList;
public class SlidingTabsBasicFragment extends Fragment {
ListView list;
public ArrayList<ListModel> CustomListViewValuesArr = new ArrayList<ListModel>();
public guestlist gg;
private SlidingTabLayout mSlidingTabLayout;
private ViewPager mViewPager;
private String[] eventtype={"CHECKED IN","CHECKED OUT","WAITING"};
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_sample, container, false);
}
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
mViewPager = (ViewPager) view.findViewById(R.id.viewpager);
mViewPager.setAdapter(new SamplePagerAdapter());
mSlidingTabLayout = (SlidingTabLayout) view.findViewById(R.id.sliding_tabs);
mSlidingTabLayout.setViewPager(mViewPager);
}
class SamplePagerAdapter extends PagerAdapter {
@Override
public int getCount() {
return 3;
}
@Override
public boolean isViewFromObject(View view, Object o) {
return o == view;
}
@Override
public CharSequence getPageTitle(int position) {
return eventtype[position];
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
View view = getActivity().getLayoutInflater().inflate(R.layout.pager_item,
container, false);
guestlist gg=(guestlist)getActivity();
StringBuilder sb = new StringBuilder();
sb.append("");
sb.append(position);
String strI = sb.toString();
Toast.makeText(getActivity(),strI,Toast.LENGTH_LONG).show();
setListData(gg.getNamelist(), gg.getStatuslist(), gg.getNo0fPeople(), position);
list= ( ListView )view.findViewById(R.id.list);
CustomAdapter adapter;
adapter=new CustomAdapter( getActivity(), CustomListViewValuesArr);
list.setAdapter(adapter);
container.addView(view);
return view;
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
container.removeView((View) object);
}
}
public void setListData(String[] string,String[] status,int no,int pos) {
CustomListViewValuesArr.clear();
for (int i = 0; i < no; i++) {
final ListModel name = new ListModel();
int x=Integer.parseInt(status[i]);
if(pos==x){ name.setCompanyName(string[i]);
CustomListViewValuesArr.add(name);}
}
}
}
请帮帮我,我看了很多答案,但无法解决这个问题。任何帮助表示赞赏。
问题是每次实例化寻呼机项目时,您都在调用 setListData
,这又会用给定位置的数据填充 CustomListViewValuesArr
。然后你的列表适配器直接使用这个数组,因为它是在你的片段中定义的,并且根据最后一个实例化的项目,它的内容会改变。
将CustomListViewValuesArr
改为局部变量;在您的 setListData
方法中创建一个新的 ArrayList<ListModel>
对象并 return 它,使用 returned 对象作为您的 CustomAdapter
构造函数参数。