【问题标题】:Why do I keep getting an infinite loop when using custom listener?为什么在使用自定义侦听器时总是出现无限循环?
【发布时间】:2014-03-01 21:03:08
【问题描述】:

我正在开发一个 android 应用程序,并且我正在实现自己的侦听器,因此我的片段可以在选择微调器值时做出反应。问题是当我在我的片段中调用刷新方法时,我不断得到一个无限循环。

SpinnerAdapter:

 public interface OnSpinnerItemSelectedListener {
        public void onSpinnerItemSelected(int index);
 }
 public SpinnerAdapter(Activity context, OnSpinnerItemSelectedListener listener){
    super(context)
    mListener = listener;
 }
 private OnSpinnerItemSelectedListener mListener;
 Spinner spinner;//Already initialized and contains values, but I didn't think it would be important to show that here.
 spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
        @Override
        public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {
            if (mListener != null) {
                mListener.onSpinnerItemSelected(i);
            }
        }

        @Override
        public void onNothingSelected(AdapterView<?> adapterView) {
        }
    });

片段适配器初始化:

SpinnerAdapter adapter =  new SpinnerAdapter(getActivity(), new  SpinnerAdapter.OnSpinnerItemSelectedListener() {
            @Override
            public void onSpinnerItemSelected(int index) {
                refreash(SpinnerFragment.this,getActivity());
            }
        });//calls the refresh method infinite number of times.   

刷新方法

    //the problem isn't the implementation, its just that interface keeps calling it repeatedly. 
 public void refreash(Fragment f,Context activity) {
        getFragmentManager().beginTransaction().replace(R.id.content_frame,f).commit();
    }

【问题讨论】:

  • 包含refreash()的代码。
  • 实际上如果您不提供导致问题的代码,我们无法帮助您...
  • 我很确定它不是刷新片段。它一直被多次调用。我现在就发。
  • 我认为 Spinner.setAdapter() 会调用 onItemSelected 方法,可能会导致无限循环。您的代码中的 setAdapter 在哪里调用?

标签: java android interface adapter


【解决方案1】:

我认为错误可能出在您的FragmentonCreateView() 方法中。因为当您在FragmentManager 上实际调用commit() 时,您会感觉到这是一个无限循环,这可能是因为您的onCreateView() 正在被一个已经创建的Fragment 调用,所以您正在尝试重新定义布局。

您的onCreateView() 方法应如下所示:

// This variable is class-wide  
View view;

@Override
public View onCreateView(final LayoutInflater inflater, final ViewGroup container, final Bundle savedInstanceState) {
  if (view != null) {
    ViewGroup parent = (ViewGroup) view.getParent();
    if (parent != null)
      parent.removeView(view);
  }

  // Do whatever you need to do, but begin inflating your layout.
  // in this example it's a LinearLayout
  view = (LinearLayout) inflater.inflate(R.layout.your_layout, container, false);

  ...
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-30
    • 1970-01-01
    • 2021-01-11
    • 1970-01-01
    • 1970-01-01
    • 2016-07-31
    • 2012-11-12
    • 1970-01-01
    相关资源
    最近更新 更多