如何从自定义适配器调用片段的功能

时间:2016-12-23 05:42:15

标签: android android-fragments exception baseadapter

我在片段中创建了一个函数。我想在单击按钮时调用该函数,这是在自定义适配器中,但我无法从自定义适配器调用片段函数。

我的适配器代码是单击一个按钮并调用片段的功能

                 viewHolder.accept.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                removeListItem(viewHolder.order_card_layout, position);

                android.support.v4.app.Fragment newFragment = new NewPageActivity();
                android.support.v4.app.FragmentTransaction ft = ((FragmentActivity)mContext).getSupportFragmentManager().beginTransaction();

                 ft.sendorder(data.getorder_id());
                ft.add(R.id.framelay, newFragment).commit();


            }
        });

我在片段中的功能

    public class NewPageActivity extends Fragment{
        public void SendOrder( String OrderId)
{

    final String serverid = sp.getString("serverid", "null");
    Log.e("TAG", "SendOrder: "+serverid +OrderId );
    new SendOrder().execute(new Config().addNewOrder, serverid, OrderId);
}
      }

6 个答案:

答案 0 :(得分:10)

在适配器中创建一个接口类,并在您的片段类中实现,如下所示

内部适配器类

         public Interface CallBack{
         void yourMethodName();

         }

现在在fragment类中实现你的接口方法,如下所示

public class YourFragment implements CallBack{
     ...........
     @Override
     public void yourMethodName(){
      //"here call your fragment method or do any bussiness logic 
      }    
  }

最后,在将接口实例传递给适配器构造函数之前,应该在适配器onclick侦听器中调用接口方法,如下所示

public class YourAdapterClass extends BaseAdapter {
  private CallBack mCallBack;
   public YourAdapterClass (CallBack callback){
    mCallBack = callback;
      }
    }

然后在你的onClickListener中调用你的接口方法

    @Override
        public void onClick(View v) {
           mCallBack.yourMethodName();


        }
    });

完成

答案 1 :(得分:2)

以片段形式调用适配器。

  autoWitDrawRuleListAdapter = new AutoWithRuleListListAdapter(getContext(), AutoViewRuleFragment.this, lookupData);
                recycleRuleList.setAdapter(autoWitDrawRuleListAdapter);

构造: -

private Context context;
private Fragment fragment;
private ArrayList<ObjGetLookupDataResponseIn> lookupData;

 public AutoWithRuleListListAdapter(Context context, Fragment fragment, ArrayList<ObjGetLookupDataResponseIn> lookupData) {
    this.context = context;
    this.fragment = fragment;
    this.lookupData = lookupData;

}

@Override
public void onBindViewHolder(final ViewHolder holder, @SuppressLint("RecyclerView") final int position) {
    String output = lookupData.get(position).getDisplayName().substring(0, 1).toUpperCase() + lookupData.get(position).getDisplayName().substring(1);
    holder.radioBen.setText(output);
    holder.radioBen.setOnCheckedChangeListener(null);
    holder.radioBen.setChecked(lookupData.get(position).isSelected());

    holder.radioBen.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
            resetAll();
            lookupData.get(position).setSelected(true);
            notifyDataSetChanged();
            ((AutoViewRuleFragment)fragment).ruleName(position);
        }
    });


}

Fragment类中的方法。

  public void ruleName(int position) {
    //your logic.
}

希望这个帮助。如果你发现它有用,请投票。快乐编码。

答案 2 :(得分:1)

您可以将函数设置为static,并在适配器中使用片段类名称调用该函数。

在你的片段中你喜欢这个,

public static void SendOrder(String OrderId)
{

    final String serverid = sp.getString("serverid", "null");
    Log.e("TAG", "SendOrder: "+serverid +OrderId );
    new SendOrder().execute(new Config().addNewOrder, serverid, OrderId);
}

在你里面片段,

viewHolder.accept.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                removeListItem(viewHolder.order_card_layout, position);

                 fragmentClassName.Sendorder(data.getorder_id());

            }
        });

答案 3 :(得分:1)

从像

这样的片段传递适配器中的片段
UserAdapter adapter = new UserAdapter(selectUserModels, getActivity(), FragmentName.this);

并在适配器中使用该片段,如:

 private Context context;
            private Fragment fragment;

     public UserAdapter(List<UserModel> selectUserModels, Context context, Fragment fragment) {
            contactList = selectUserModels;
            this.context = context;
            this.fragment = fragment;
        }

然后调用类似

的方法
((FragmentName) fragment).fragmentMethod();

答案 4 :(得分:0)

在调用Fragment函数的代码中,您使用 new 创建了当前Fragment的对象。

  

android.support.v4.app.Fragment newFragment = new NewPageActivity();

这不是从片段到适配器调用函数的当前方法。

假设您有一个列表视图,您可以在其中设置适配器的值。在这种情况下,把这段代码放在你的片段中:

SelectUserAdapter adapter = new SelectUserAdapter(selectUserModels, getActivity(), CurrentFragment.this);
        listView.setAdapter(adapter);

在自定义适配器中输入以下代码:

public class SelectUserAdapter extends BaseAdapter {

    private List<SelectUserModel> contactList;
    private Context context;
    private Fragment fragment;

    public SelectUserAdapter(List<SelectUserModel> selectUserModels, Context context, Fragment fragment) {
        contactList = selectUserModels;
        this.context = context;
        this.fragment = fragment;
    }

然后调用Fragment的方法在适配器中使用此代码:

((CurrentFragment) fragment).sendorder(data.getorder_id());

答案 5 :(得分:0)

将视图上下文强制转换为自定义适配器中的Parent Activity类,然后只需调用您的方法。脚步: 1.在自定义适配器中获取视图上下文并转换为父活动。 2.将上下文强制转换为Fragment类。 3.使用object调用片段方法。

参考代码 -

  MainActivity hf = (MainActivity) view.getContext();
            FragmentManager manager = hf.getSupportFragmentManager();
            HomeFragment fragment = (HomeFragment) manager.findFragmentByTag("HomeFragment");
            fragment.loadJSON(true);

不要再次实例化Fragment。