从 Fragment 中获取 Activity 中的 Adapter

4

我有一个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);

    }

}
被添加到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>

添加 ListFragment 的代码在哪里?你只需要保留对 ListFragment 的引用,并在其中拥有一个公共方法,这样你就可以直接调用它。 - Squonk
我把整个代码放在这里,请看一下。 - user1337
如果有人解决了同样的问题,请分享一下。 - subash
1个回答

0
你必须在你的ListFragment类中创建一个公共方法getAdapterOfList(),该方法将内部访问适配器并返回它。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接