我需要从DataAdapter android调用片段

时间:2014-04-10 11:37:56

标签: android

在这里,我的班级就像这样

public class TicketAdapter extends ArrayAdapter<Ticket> {
@Override
public View getView(int position, View convertView, ViewGroup parent) {
    View row = convertView;
    TicketHolder holder = null;

    LayoutInflater inflater = ((Activity) context).getLayoutInflater();
    row = inflater.inflate(layoutResourceId, parent, false);

    holder = new TicketHolder();
    holder.ticket = items.get(position);
    holder.removeTicketButton = (ImageButton)row.findViewById(R.id.ticket_remove);
    holder.removeTicketButton.setTag(holder.ticket);

    holder.settingTicketButton=(ImageButton)row.findViewById(R.id.ticket_setting);
    holder.settingTicketButton.setTag(holder.ticket);

    holder.settingTicketButton.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {



    holder.name = (TextView)row.findViewById(R.id.ticket_name);
    setNameTextChangeListener(holder);
//  holder.value = (TextView)row.findViewById(R.id.atomPay_value);
//  setValueTextListeners(holder);

    row.setTag(holder);

    setupItem(holder);
    return row;
}
}

我的另一个java文件是这样的

public class FreeFragment extends Fragment 

{

}

在这里,我想从TicketAdapter类调用FreeFragment类。点击(R.id.settingTicketButton)这个按钮时,需要调用FreeFragment。如何从DataAdapter调用此片段?可能吗?请帮忙。

5 个答案:

答案 0 :(得分:0)

最好的方法是将FreeFragment实例传递给TicketAdapter的构造函数中的变量,并将其存储在适配器中。

如果这不可行,您可以使用以下approch。

Fragment fragment = ((Activity)context).getfragmentmanager.findfragmentById(R.id.your_fragment_container_id);

在构造函数中添加此代码

答案 1 :(得分:0)

我无法直接从FreeFragment访问TicketAdapter,因为您不知道该片段是否已添加且可见。我将在所有者活动中定义一个方法,该方法将从适配器调用。在此方法中,首先检查片段是否为null,然后从片段调用任何方法。像(在父活动中)的东西:

public void callFragmentMethod() {
    FragmentManager fm = getFragmentManager();
    Fragment fragment = fm.findFragmentByTag("SOME_TAG");
    if(fragment != null) {
        FreeFragment ff = (FreeFragment) fragment;
        ff.callSomeMethod();
    }
}

将活动的引用传递给适配器,并从适配器调用上面的方法。或者,为了使代码更美观,更易于维护和扩展,使用上述方法定义和接口,有活动扩展接口并发送接口作为对适配器的引用。

答案 2 :(得分:0)

因此,如果您的适配器可以访问FragmentActivity,则必须调用FragmentManager并进一步调用片段

FragmentManager fragmentManager = yourFragmentActivity.getFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
// Create new fragment and transaction
FragmentTransaction transaction = getFragmentManager().beginTransaction();

// Replace whatever is in the fragment_container view with this fragment,
// and add the transaction to the back stack
transaction.replace(R.id.fragment_container, yourFragment);
transaction.addToBackStack(null);

// Commit the transaction
transaction.commit();

答案 3 :(得分:0)

处理这种情况的简单步骤

1)创建一个接口给出任何名称

2)根据ewquirement示例MyCommumicator定义内部方法 例如,我想刷新数据,所以我在我的界面中定义方法,如

public void refreshData();

现在参考adater中的界面,如

MyCommumicator myCommumicator;

3)将该接口实现到Fragment并实现方法。

4)创建适配器的Constractor,如

 public TicketAdapter(other params...,MyCommumicator MyCommumicator){
   this.myCommumicator = myCommumicator;
}

6)打电话的时间就像这样打电话

myCommumicator.refreshData();

现在享受

另一种方式 使用LocalBroadCast。

答案 4 :(得分:0)

我找到了解决方案。我在TicketAdapter.java文件中编写了以下代码..

    holder.settingTicketButton=(ImageButton)row.findViewById(R.id.ticket_setting);
    holder.settingTicketButton.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) 
        {

            Fragment freeFragment = new FreeFragment();
            if (freeFragment != null)

                switchFragment(freeFragment);
            Log.e("adapter_click_setting","adapter_click_setting");
        }
    });
}

private void switchFragment(Fragment newFragment)
{

    if (context == null)
    {
        Log.e("null_context","nulllll");
         return;
    }
    if (context instanceof AddNewTicket) {
        Log.e("meth_calling","method_calling");
         AddNewTicket feeds = (AddNewTicket) context;
         feeds.switchContent(newFragment);  
    }

}

我在AddNewTicket.java文件中编写了以下方法..

public void switchContent(android.support.v4.app.Fragment newFragment) {
    // TODO Auto-generated method stub
    getSupportFragmentManager().beginTransaction()
    .replace(R.id.fragment_container, newFragment).commit();

}

这里,R.id.fragment_container是我的ticket_listview.xml文件的id。我在我的Xml文件中声明了FragmentLayout ....