【问题标题】:How to call a function of fragment from custom adapter如何从自定义适配器调用片段的功能
【发布时间】:2016-12-23 05:42:14
【问题描述】:

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

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

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

【问题讨论】:

  • 适配器用于NewPageActivity或任何其他类?
  • 在NewPageActivity中使用
  • @MukeshMishra 为什么你不能尝试使用界面?
  • 你在那个函数中有什么价值?这些值是在片段中定义的吗?如果它们有任何依赖关系,则使用接口,或者通过构造函数将这些值传递给适配器并在该适配器本身中实现函数。

标签: android android-fragments exception baseadapter


【解决方案1】:

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

内部适配器类

         public Interface CallBack{
         void yourMethodName();

         }

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

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


        }
    });

完成

【讨论】:

    【解决方案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.
    }
    

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

    【讨论】:

    • @MukeshMishra 更新了我的答案。请检查并投票。
    【解决方案3】:

    将片段从片段传递到适配器中,例如

    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】:

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

      在你的片段中这样做,

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

      【讨论】:

        【解决方案5】:

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

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

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

        假设您有一个列表视图,您想在其中设置适配器的值。在那种情况下,把这段代码就是你的 Fragment:

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

        【讨论】:

          【解决方案6】:

          将视图上下文投射到自定义适配器中的父 Activity 类,然后简单地调用您的方法。脚步: 1. 在自定义适配器中获取视图上下文并转换为父活动。 2. 将上下文转换为 Fragment 类。 3. 使用对象调用片段方法。

          参考代码 -

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

          不要再次实例化 Fragment。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-04-14
            相关资源
            最近更新 更多