4

我在我的应用程序中使用滑动菜单/抽屉模式。所以主要活动有一个leftView,它是一个名为topicsFragment()的ListFragment,它加载一组主题项。单击项目/主题时,它会通过调用 FeedsFragment(tag) 替换主视图上的片段。FeedsFragment 使用 arraylist 适配器加载在每个列表项中具有各种可点击项的提要。当在列表项中单击一个项目时,我想在 feedsFragment(tag) 上获取另一个实例。

    holder.contextView= (TextView) newsView.findViewById(R.id.arcHeader);
    if (item.hasArc()) {
        holder.contextView.setVisibility(View.VISIBLE);
        String arc;
        try {
            arc=item.getarc();
            holder.contextView.setText(arc);

            holder.contextView.setOnClickListener(new View.OnClickListener() {

                //currently it loads a class
                @Override
                public void onClick(View v) { 
                   Intent i = new Intent(context, SomeClass.class); 
                   i.putExtra("tag", arc);
                   context.startActivity(i);
                }
            });
        } catch (JSONException e) {

            e.printStackTrace();
        }

    } else {
        holder.contextView.setVisibility(View.GONE);
    }

目前它加载了一个新类。我想定义一个片段,然后传递给主要活动以替换为当前视图,但我不能在适配器类中使用 getSupportFragmentManager(),而只能在片段或片段活动中使用。除了从适配器中扫入片段之外,应该有什么替代方法?

4

4 回答 4

3

我所做的是在我的主要活动中创建此方法,然后从其他类中调用它来更改片段:

public void switchContent(Fragment fragment) {
        mContent = fragment;
        getSupportFragmentManager().beginTransaction()
                .replace(R.id.fragment_container, fragment).commit();

        slidemenu.showContent();

    }
于 2013-02-09T04:34:21.703 回答
3

通过使用列表适配器中传递的上下文来解决它:

@Override
public void onClick(View v) {
    Fragment newFragment = new ListFragmentClass(tag);
    if (newFragment != null)
        switchFragment(newFragment);
}

private void switchFragment(Fragment newFragment) {
    if (context == null)
        return;
    if (context instanceof MainActivity) {
        MainActivity feeds = (MainActivity) context;
        feeds.switchContent(newFragment);
    }
}

这里 switchContent 是在您的主要活动中定义的用于切换/替换片段的方法,如 Justin V 在回答中给出的。

于 2013-02-11T22:08:54.570 回答
0

getFragmentManager()在适配器的构造函数中作为参数传递并使用它。

于 2014-06-27T13:10:11.577 回答
0

使用 anInterface将您的侧抽屉连接ListFragment到主要活动。例如:

public class LeftDrawer extends ListFragment{

    private DrawerCallback mCallback;

    public interface DrawerCallback{
        public void onListClick(String tag);
    }

    public void setCallback(DrawerCallback callback){
        mCallback = callback;
    }

} 

由于Fragments应该有一个空的构造函数,请在完成将回调添加到抽屉Fragment之前使用您的公共方法来设置回调。FragmentTransaction此时剩下的就是通知您Fragment发生了点击。您应该做的实际上是ListFragment直接捕获点击,而不是将 onClickListener 添加到适配器中的每个视图中。

 @Override
public void onListItemClick(ListView l, View v, int position, long id) {
    super.onListItemClick(l, v, position, id);

    /*
     * Get item at the clicked position from your adapter and
     * get its string tag before triggering interface
     */
   mCallback.onListClick(tag);
}

使用 onListItemClick 方法来执行此操作。您将获得被点击的列表位置,然后可以轻松地从适配器中获取该项目并获取其标记值以传递回您的主机活动。

于 2014-06-27T14:03:15.373 回答