【问题标题】:Refreshing data display on a fragment在片段上刷新数据显示
【发布时间】:2015-07-22 13:33:04
【问题描述】:

我在视图寻呼机上有两个片段。 我曾经不得不将数据从片段 B 移动到 A 并刷新 A 上显示的数据,我使用 getItemPosition 来完成。 由于某种原因,当我尝试重置所有数据时,相同的方法不起作用..

在我的适配器中,我有:

public void refresh()
    {
        notifyDataSetChanged();
    }

    @Override
    public int getItemPosition( Object obj ) 
    {
        return POSITION_NONE; 
    }

在我点击“重置”的片段中:

@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() );
                        }
                    }   

【问题讨论】:

  • 你的进展如何?我注意到您最近没有回复。
  • 使用接口进行两个片段之间的通信,它会这样工作.....

标签: android android-fragments refresh


【解决方案1】:

PagerActivity被当作静态类对待,只能通过这种方式访问​​静态方法和成员数据和对象。关于代码:

notTriedPasswordsList = PagerActivity.mainList;

注意:所以现在PagerActivity 可以访问静态mainList 对象,或者notTriedPasswordsList(共享相同的内存)。但这是您可以访问的唯一对象,因为您的代码引用了静态方法。

在代码PagerActivity.viewPagerAdapter.refresh() 上,我不清楚这会刷新哪些数据,因为我没有看到足够的代码,同样refresh() 必须是静态方法。对于代码notifyDataSetChanged(),viewPagerAdapter 和数据对象之间必须有直接链接,可能是 ArrayList。当然,我看不出两者之间有任何直接关系。

也许你想要这样的代码:

viewPagerAdapter pagerAdapter = new viewPagerAdapter();

这样您就可以在适配器和可能的 ArrayList 对象之间建立关系。使用 new 创建实例的好处是它以对象的形式在类中保存数据和状态,在我的示例中为 pagerAdapter

我目前无法建议特定的代码集,因为我没有看到足够数量的代码供我修复。也许你可以先修复代码,然后我们都可以贡献。

【讨论】:

  • @BVtp,为了清楚起见,我认为您应该发布与适配器相关的更多相关代码。
【解决方案2】:

您对PagerActivity.viewPagerAdapter.refresh(); 的调用不会导致您的片段被重绘。相反,您应该直接访问您的片段并在其中创建自定义 refreshUI() 方法。

public void refreshUI(){
     nextCodeDisplay.setText( notTriedPasswordsList.get( 0 ).getPasswordString() );
}

【讨论】:

  • 你甚至可以在适配器上调用 clear 吗?我收到一个错误.. the method getAdapter() is undefined for the type ...
  • 什么是mainList和historyList(ListView?ArrayList?)?重置数据是什么意思?仅清除列表还是清除并重新填充默认项目?
  • 它们都是数组列表。通过重置,我将删除 historyList 中的所有内容,并将其中的内容移回 mainList ,这是向用户显示的内容。
  • 那么您的代码似乎只是在修改数据而不是 UI。你能把代码贴在你第一次显示密码的地方吗?
  • 我已经编辑了原始帖子并将其添加到那里。谢谢。
【解决方案3】:

我建议改变你的方法。我已经将一个简单的项目上传到我的dropbox public folder。在这里,您可以找到由 ViewPager 管理的两个片段如何共享信息的参考实现。第一个 Fragment - Fragment#1 - 仅显示由 Fragment#2 生成的字符串。 Fragment#2 有一个按钮,单击该按钮时,会通过 Activity 向 Fragment#1 发送一个随机字符串。无需刷新viewpager,无需静态方法,简单有效。我想你可以根据你的需要调整这个例子。

【讨论】:

    【解决方案4】:

    正如您所说的要刷新数据,我个人建议使用滑动刷新布局。它将对此非常有用,并且也很时尚。以下是代码。

    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);
        }
    

    现在在覆盖刷新方法中,您可以刷新或加载数据。我希望这对您的支持非常有帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-02-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-07
      • 2019-06-16
      • 2018-12-04
      • 1970-01-01
      相关资源
      最近更新 更多