我在视图寻呼机上有两个片段。 我曾经不得不将数据从片段B移动到A并刷新A上显示的数据,我用getItemPosition完成了它。 出于某种原因,当我尝试重置所有数据时,同样的方法不起作用..
在我的适配器中我有:
public void refresh()
{
notifyDataSetChanged();
}
@Override
public int getItemPosition( Object obj )
{
return POSITION_NONE;
}
在片段中,我点击“重置”#39; :
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
notTriedPasswordsList = PagerActivity.mainList;
.....
....
resetButton.setOnClickListener( new View.OnClickListener() {
@Override
public void onClick( View v )
{
PagerActivity.resetPasswords();
PagerActivity.viewPagerAdapter.refresh();
}});
托管两个片段的viewPager活动:
public static void resetPasswords()
{
mainList.addAll( 0, historyList );
historyList.clear();
PagerActivity.viewPagerAdapter.refresh();
}
显示通行证的主要片段:
@Override
public View onCreateView( LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState )
{
View view = inflater.inflate(R.layout.fragment_main, container, false);
.....
nextCodeDisplay = ( TextView ) view.findViewById( R.id.passwordDisplayTextView );
nextCodeDisplay.setText( notTriedPasswordsList.get( 0 ).getPasswordString() );
....
nextButton.setOnClickListener(new View.OnClickListener() {
public void onClick(View v)
{
notTriedPasswordsList.remove( 0 );
if( notTriedPasswordsList.size() > 0 && !(notTriedPasswordsList.get( 0 ).getTried()) )
{
nextCodeDisplay.setText( notTriedPasswordsList.get( 0 ).getPasswordString() );
}
}
答案 0 :(得分:2)
PagerActivity
被视为静态类,您只能以这种方式访问静态方法和成员数据和对象。关于代码:
notTriedPasswordsList = PagerActivity.mainList;
注意:现在PagerActivity
可以访问静态mainList
对象,或notTriedPasswordsList
(共享相同的内存)。但是这是您可以访问的唯一对象,因为您的代码引用了静态方法。
在代码PagerActivity.viewPagerAdapter.refresh()
上,由于我没有看到足够的代码,我不清楚这次刷新的数据,同样refresh()
必须是静态方法。使用代码notifyDataSetChanged
(),viewPagerAdapter
和数据对象之间必须存在直接链接,可能是 ArrayList 。当然,我认为两者之间没有任何直接关系。
也许你想要的代码如下:
viewPagerAdapter pagerAdapter = new viewPagerAdapter();
这样,您可以拥有适配器和可能的ArrayList对象之间的关系。使用 new 创建实例的好处是,在pagerAdapter
的示例中,它以对象的形式将数据和状态保存在类中。
我现在无法建议具体的代码集,因为我没有看到足够数量的代码供我修复。也许你可以先修改代码,然后我们都可以做出贡献。
答案 1 :(得分:1)
您对PagerActivity.viewPagerAdapter.refresh();
的调用不会导致您的片段被重绘。相反,您应该直接访问您的片段并在其中创建自定义refreshUI()
方法。
public void refreshUI(){
nextCodeDisplay.setText( notTriedPasswordsList.get( 0 ).getPasswordString() );
}
答案 2 :(得分:1)
我建议改变你的做法。我已将一个简单的项目上传到我的dropbox public folder。在这里,您可以找到ViewPager管理的两个片段如何共享信息的参考实现。第一个片段 - 片段#1 - 只显示由片段#2生成的字符串。片段#2有一个按钮,单击该按钮时,会通过活动将随机字符串发送到片段#1。无需刷新viewpager,无需静态方法,简单而有效。我想你可以根据自己的需要调整这个例子。
答案 3 :(得分:0)
正如您所说想要刷新数据,我个人建议使用刷卡刷新布局。它对于这个目的非常有用,也很时尚。以下是代码。
Swipe_Refresh_layout.xml
<android.support.v4.widget.SwipeRefreshLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/swipe_container"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<ListView android:id="@+id/listview"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:clickable="true"
/>
</android.support.v4.widget.SwipeRefreshLayout>
以下是我用于此布局的活动。
public class LatestNewsFragment extends Fragment implements OnRefreshListener ,OnScrollListener{
SwipeRefreshLayout swipeLayout;
public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState)
{
=
View rootView = inflater.inflate(R.layout.Swipe_Refresh_layout, container, false);
swipeLayout = (SwipeRefreshLayout) rootView.findViewById(R.id.swipe_container);
swipeLayout.setOnRefreshListener(this);
swipeLayout.setColorScheme(android.R.color.holo_blue_bright,
android.R.color.holo_green_light,
android.R.color.holo_orange_light,
android.R.color.holo_red_light);
return rootView;
}
public void onRefresh() {
new Handler().postDelayed(new Runnable() {
@Override public void run() {
swipeLayout.setRefreshing(false);
additemstatus();
}
}, 5000);
}
现在,在重写刷新方法中,您可以刷新或加载数据。我希望这对你的支持非常有帮助。