【问题标题】:How can I add a row to a ListView in one Fragment by clicking the button in another Fragment?如何通过单击另一个 Fragment 中的按钮向一个 Fragment 中的 ListView 添加一行?
【发布时间】:2014-11-25 02:55:38
【问题描述】:

我有两个 Fragment:FragmentA 和 FragmentB。 FragmentA 有一个按钮,FragmentB 有一个ListView,其适配器旨在使用自定义行。我想通过单击 FragmentA 中的按钮在 FragmentB 中的 ListView 中添加一行。我从谷歌研究了一些关于片段之间的通信的文档,我写了一些代码,但我没有成功。我试图在一个片段中同时包含按钮和ListView。单击按钮时,我成功使用了适配器的 notifiyDataSetChanged() 方法。但是,我不知道如何解决这个问题。

我的MainActiviy.java

public class MainActivity extends ActionBarActivity implements ActionBar.TabListener, FragmentA.ButtonClickListener{
    private static final int NUM_PAGES = 2;
    private ViewPager mPager;
    private PagerAdapter mPagerAdapter;
    private ActionBar actionBar;
    private String[] tabs = { "A", "B"};    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mPager = (ViewPager) findViewById(R.id.pager);
        mPagerAdapter = new ViewPagerAdapter(getSupportFragmentManager());
        mPager.setAdapter(mPagerAdapter);   
        // ViewPager's PageChangeListener.
        mPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageSelected(int position) {
                actionBar.setSelectedNavigationItem(position);
            }        
            @Override
            public void onPageScrolled(int arg0, float arg1, int arg2) {
            }        
            @Override
            public void onPageScrollStateChanged(int arg0) {
            }
        });        
        // Retrieve actionbar and set some properties.
        actionBar = getSupportActionBar();
        // actionBar.setHomeButtonEnabled(true);
        actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); 
        actionBar.setDisplayShowCustomEnabled(true);
        actionBar.setDisplayShowTitleEnabled(true);
        Fragment frag1 = new FragmentA();
        Fragment frag2 = new FragmentB();
        FragmentTransaction fragmentTransaction;
        FragmentManager fragMgr = getSupportFragmentManager();
        fragmentTransaction = fragMgr.beginTransaction();
        fragmentTransaction.add(frag1, "frag1Tag");
        fragmentTransaction.add(frag2, "frag2Tag");
        fragmentTransaction.commit();
        for (String tab_name : tabs) {
            actionBar.addTab(actionBar.newTab().setText(tab_name).setTabListener(this));
        }
    }
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();
        if (id == R.id.action_settings) {
            return true;
        }
        return super.onOptionsItemSelected(item);
    }   
    private class ViewPagerAdapter extends FragmentStatePagerAdapter {
        public ViewPagerAdapter(FragmentManager fm) {
            super(fm);
        }
        @Override
        public Fragment getItem(int position) {
            switch (position){
                case 0:
                    return new FragmentA();
                case 1:
                    return new FragmentB();
            }
            return null;
        }
        @Override
        public int getCount() {
            return NUM_PAGES;
        }
    }
    @Override
    public void onButtonClicked() {  // IMPLEMENTATION OF INTERFACE METHOD
        FragmentB fragmentB = (FragmentB)getSupportFragmentManager().findFragmentByTag("frag2Tag");
        FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
        if (fragmentB != null) {
            fragmentB.updateList();
        } else {
            FragmentB newFragment = new  FragmentB();
        }
    }       
}

我的FragmentA.java

public class FragmentA extends Fragment {   
    ButtonClickListener mCallback;
    FragmentTransaction ft;
    List<String> values = new ArrayList<String>();
    // Container Activity must implement this interface.
    // INTERFACE DEFINATION.
    public interface ButtonClickListener {
        public void onButtonClicked();
    }
    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);           
        // This makes sure that the container activity has implemented
        // the callback interface. If not, it throws an exception
        try {
            mCallback = (ButtonClickListener) activity;
        } catch (ClassCastException e) {
            throw new ClassCastException(activity.toString()
                + " must implement OnHeadlineSelectedListener");
        }
    }
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        ViewGroup vG = (ViewGroup)inflater.inflate(R.layout.fragment1_layout, container,false);
        Button btn = (Button)vG.findViewById(R.id.button1);
        btn.setOnClickListener(new View.OnClickListener() {         
            @Override
            public void onClick(View v) {               
                mCallback.onButtonClicked();
            }
        });
        return vG;   
    }
}

我的FragmentB.java

public class FragmentB extends Fragment {   
    List<String> values = new ArrayList<String>();
    List<String> valuesRefresh = new ArrayList<String>();
    ListView list;
    MyListAdapter adapter;
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        values.add("asda");
        values.add("kasd");
        ViewGroup vG = (ViewGroup)inflater.inflate(R.layout.fragment2_layout, container,false);
        list = (ListView)vG.findViewById(R.id.listView2);   
        adapter = new MyListAdapter(getActivity(),values);
        list.setAdapter(adapter);
        return vG;
    }
    public void updateList(){    
        adapter.notifyDataSetChanged();
    }
    public static class MyListAdapter extends ArrayAdapter<String>{      
        private final Context context;
        private final List<String> values = new ArrayList<String>();
        public MyListAdapter(Context context, List<String> values) {
            super(context, R.layout.list_item, values);
            this.context = context;
            for (int i=0; i<values.size(); i++) {
                this.values.add(values.get(i));
            }
        }
        @Override
        public long getItemId(int position) {
            // TODO Auto-generated method stub
            return 0;
        }
        public long getCount(int position) {
            // TODO Auto-generated method stub
            return values.size();
        }
        @Override
        public View getView(final int position, View convertView, ViewGroup parent) {
            LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            View list = inflater.inflate(R.layout.list_item,parent,false); 
            return list; 
        }
    }        
}

【问题讨论】:

    标签: android listview android-fragments android-listview


    【解决方案1】:

    您的问题是您在活动的 onCreate 中创建片段,再次在寻呼机适配器中创建片段,并再次在 onButtonClicked (FragmentB) 中创建片段。您应该只创建一次。由于您在 Activity 中执行所有这些操作,因此最简单的方法是在 Activity 字段中保留对片段的引用。但是,您需要确保处理重新创建活动的情况,因为在这种情况下,Android 已经重新创建了您的片段,您不需要再次创建和添加它们。

    public class MainActivity extends ActionBarActivity implements ActionBar.TabListener, FragmentA.ButtonClickListener{
        private static final int NUM_PAGES = 2;
        private ViewPager mPager;
        private PagerAdapter mPagerAdapter;
        private ActionBar actionBar;
        private String[] tabs = { "A", "B"};    
        private Fragment frag1;
        private Fragment frag2;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            // First check if Android has already created the fragments
            FragmentManager fragMgr = getSupportFragmentManager();
            frag1 = fragMgr.findFragmentByTag("frag1Tag");
            frag2 = fragMgr.findFragmentByTag("frag2Tag");
            if (frag1 == null && frag2 == null) {
                // Create and add fragments only if needed
                frag1 = new FragmentA();
                frag2 = new FragmentB();
                FragmentTransaction fragmentTransaction = fragMgr.beginTransaction();
                fragmentTransaction.add(frag1, "frag1Tag");
                fragmentTransaction.add(frag2, "frag2Tag");
                fragmentTransaction.commit();
            }
            mPager = (ViewPager) findViewById(R.id.pager);
            ...
        }
        ...
        private class ViewPagerAdapter extends FragmentStatePagerAdapter {
            public ViewPagerAdapter(FragmentManager fm) {
                super(fm);
            }
            @Override
            public Fragment getItem(int position) {
                switch (position){
                    case 0:
                        return frag1;
                    case 1:
                        return frag2;
                }
                return null;
            }
            @Override
            public int getCount() {
                return NUM_PAGES;
            }
        }
        @Override
        public void onButtonClicked() {  // IMPLEMENTATION OF INTERFACE METHOD
            frag2.updateList();
        }       
    }
    

    【讨论】:

      猜你喜欢
      • 2014-04-18
      • 2019-07-03
      • 1970-01-01
      • 2013-12-24
      • 2014-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多