从 Fragment 获取 Activity 中的适配器

Posted

技术标签:

【中文标题】从 Fragment 获取 Activity 中的适配器【英文标题】:Get Adapter in Activity from Fragment 【发布时间】:2013-08-27 16:02:52 【问题描述】:

所以我有一个带有 EditText 和 ListFragment 的 FragmentActivity。 在 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 
        ...
    


... 

列表片段:

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_
    android:layout_
    android:orientation="vertical" >

...

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

<LinearLayout
    android:layout_
    android:layout_
    android:orientation="horizontal" >

    <fragment
        android:id="@+id/xxx_list_fragment"
        android:name="com.xxx.XXXListFragment"
        android:layout_
        android:layout_ />

    <ScrollView
        android:layout_
        android:layout_ >

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

</LinearLayout>

【问题讨论】:

添加ListFragment的代码在哪里?您需要做的就是保留对ListFragment 的引用,并在其中包含一个可以直接调用的public 方法。 我把整个代码。请看一下。 遇到同样的问题,如果有人解决了请分享 【参考方案1】:

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

【讨论】:

以上是关于从 Fragment 获取 Activity 中的适配器的主要内容,如果未能解决你的问题,请参考以下文章

fragment和activity之间进行数据交互

Android开发,怎么在activity中获取fragment中的imageview

android ViewPager+Fragment 如何在ViewPager的Activity中获取Fragment中的控件对象

从 Fragment 获取 Activity 的布局并阻止其所有子项

Android fragment控制activity中的控件

Fragment 和 Activity 之间通信