从Fragment中获取Activity中的适配器

时间:2013-08-24 19:52:43

标签: android android-activity android-fragments fragment adapter

所以我有一个FragmentActivity,它有一个EditText和一个ListFragment。 在ListFragment中,我有一个适配器来填充所有项目。

public class XXXListFragment extends ListFragment {

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
...

ArrayAdapter<Spanned> adapter = new ArrayAdapter<Spanned>(inflater.getContext(),
        R.layout.fragment_list_item_appearance, spannedArray);

    setListAdapter(adapter);

    return super.onCreateView(inflater, container, savedInstanceState);

 }
}

使用EditText我希望用户过滤列表项。

public class XXX extends FragmentActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.quests_activity);

EditText ediText = (EditText) findViewById(R.id.editext);

ediText .addTextChangedListener(new TextWatcher() {

    @Override
    public void onTextChanged(CharSequence cs, int arg1, int arg2, int arg3) {
        // When user changed the Text
        ListFragment.this.adapter.getFilter().filter(cs);
    }

    ...
});
}

我的问题是我无法通过以下方式获取Listfragment的上下文:

ListFragment.this.adapter.getFilter().filter(cs);

抛出以下错误:

  

无法访问QuestsListFragment类型的封闭实例   范围

任何想法如何解决这个问题?


好的,整个代码。我刚刚开始使用Fragments ......

FragmentActivity:

public class XXX extends FragmentActivity implements ListFragmentItemClickListener {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.xxx_activity);


}

@Override
protected void onStart() {
    super.onStart();

    EditText editText = (EditText) findViewById(R.id.edittext)

    editText .addTextChangedListener(new TextWatcher() {

        @Override
        public void onTextChanged(CharSequence cs, int arg1, int arg2, int arg3) {
            // THIS DOESN'T WORK
            XXXListFragment.this.adapter.getFilter().filter(cs);
        }

        @Override
        public void beforeTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) {
        }

        @Override
        public void afterTextChanged(Editable arg0) {
        }
    });

}

@Override
public void onListFragmentItemClick(int position) {

    int orientation = getResources().getConfiguration().orientation;

    if (orientation == Configuration.ORIENTATION_LANDSCAPE) {

        FragmentManager fragmentManager = getSupportFragmentManager();

        FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();

        Fragment prevFrag = fragmentManager.findFragmentByTag("xxx.details");

        if (prevFrag != null)
            fragmentTransaction.remove(prevFrag);

        XXXDetailsFragment fragment = new XXXDetailsFragment();

        Bundle b = new Bundle();

        b.putInt("position", position);

        fragment.setArguments(b);

        fragmentTransaction.add(R.id.xxx_detail_fragment_container, fragment,
                "xxx.details");

        fragmentTransaction.addToBackStack(null);

        fragmentTransaction.commit();

    } else {
        ...
    }
}

... 
}

ListFragment:

public class XXXListFragment extends ListFragment {

    ListFragmentItemClickListener ifaceItemClickListener;

    public interface ListFragmentItemClickListener {

        void onListFragmentItemClick(int position);
    }

    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);

        try {
            ifaceItemClickListener = (ListFragmentItemClickListener) activity;
        } catch (Exception e) {
            Toast.makeText(activity.getBaseContext(), "Exception", Toast.LENGTH_SHORT).show();
        }
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

        Spanned[] xxx = { Html.fromHtml(getString(R.string.xxx)), ... };

        ArrayAdapter<Spanned> adapter = new ArrayAdapter<Spanned>(inflater.getContext(),
                R.layout.fragment_list_item_appearance, xxx);

        setListAdapter(adapter);

        return super.onCreateView(inflater, container, savedInstanceState);
    }

    @Override
    public void onListItemClick(ListView l, View v, int position, long id) {

        ifaceItemClickListener.onListFragmentItemClick(position);

    }

}

ListFragment添加在FragmentActivity布局中:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical" >

...

<EditText
    android:id="@+id/edittext"
    style="@style/red_edittext"
    android:hint="@string/exittext_input_search" />

<LinearLayout
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="horizontal" >

    <fragment
        android:id="@+id/xxx_list_fragment"
        android:name="com.xxx.XXXListFragment"
        android:layout_width="350dp"
        android:layout_height="wrap_content" />

    <ScrollView
        android:layout_width="fill_parent"
        android:layout_height="fill_parent" >

        <FrameLayout
            android:id="@+id/xxx_detail_fragment_container"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="vertical" >
        </FrameLayout>
    </ScrollView>
</LinearLayout>

</LinearLayout>

1 个答案:

答案 0 :(得分:0)

您必须在listfragment类中创建一个公共方法getAdapterOfList(),它将在内部访问适配器并将其返回。