在这里,我的班级就像这样
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调用此片段?可能吗?请帮忙。
答案 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 ....