为Android选项卡操作栏重用Fragment和layout.xml

为Android选项卡操作栏重用Fragment和layout.xml,android,android-listview,android-fragments,android-actionbar,android-tabs,Android,Android Listview,Android Fragments,Android Actionbar,Android Tabs,我正在编写我的第一个Android应用程序,并且面临一个问题:(我正在使用Eclipse,该应用程序打算从Android 4.0.3运行 我在视图顶部有一个选项卡操作栏,由4个选项卡组成。其中三个具有相同的结构:一个带有两个单选按钮的radiogroup和它下面的listView。这些选项卡基于相同的数据,将用于过滤数据。单选按钮的文本取决于选项卡,并将进一步过滤数据 最后一个选项卡的布局和功能完全不同 我制作了两个片段和两个布局(一个用于前三个,一个用于最后一个选项卡)。第一个片段是管理lis

我正在编写我的第一个Android应用程序,并且面临一个问题:(我正在使用Eclipse,该应用程序打算从Android 4.0.3运行

我在视图顶部有一个选项卡操作栏,由4个选项卡组成。其中三个具有相同的结构:一个带有两个单选按钮的radiogroup和它下面的listView。这些选项卡基于相同的数据,将用于过滤数据。单选按钮的文本取决于选项卡,并将进一步过滤数据

最后一个选项卡的布局和功能完全不同

我制作了两个片段和两个布局(一个用于前三个,一个用于最后一个选项卡)。第一个片段是管理listview中的radiogroup。我还有一个适配器来设置数据模型,具体取决于所选的选项卡和按钮。但不知何故,我无法使其正常工作。单选按钮的列表不会刷新,列表仅在首次加载活动时显示。不会引发异常

我的方法错了吗

以下是我的主要活动:

    @Override
public void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    setContentView(R.layout.list_main);

    appContext = getApplicationContext();


    dataholder = (P1DataHolder) getIntent().getSerializableExtra(
            "data"); //Hold all the data

    final ActionBar mainBar = getActionBar();
    mainBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
    mainBar.setDisplayOptions(0, ActionBar.DISPLAY_SHOW_TITLE);

    // create the fragments with the name of parent tab
    Fragment aFragment = new ListFragment(
            MyApplication.TAB_A);
    Fragment bFragment = new ListFragment(
            MyApplication.TAB_B);
    Fragment cFragment = new ListFragment(
            MyApplication.TAB_C);
    Fragment settingFragment = new P1SettingFragment();

    // Fragment A
    ActionBar.Tab tabA = mainBar.newTab().setText(
            MyApplication.TAB_A);
    tabA.setTabListener(new TabsListener(aFragment));

    // Fragment B
    ActionBar.Tab tabB = mainBar.newTab().setText(
            MyApplication.TAB_B);
    tabB.setTabListener(new TabsListener(bFragment));

    // Fragment C
    ActionBar.Tab tabC = mainBar.newTab().setText(
            MyApplication.TAB_C);
    tabC.setTabListener(new TabsListener(cFragment));

    // Settings
    ActionBar.Tab tabSetting = mainBar.newTab().setText(
            MyApplication.TAB_SETTING);
    tabSetting.setTabListener(new TabsListener(settingFragment));

    // Adding Tabs to actionbar
    mainBar.addTab(tabA);
    mainBar.addTab(tabB);
    mainBar.addTab(tabC);
    mainBar.addTab(tabSetting);

}
编辑:帧的代码

public class ListFragment extends Fragment {

private ArrayList<Recipe> listAll;
private ArrayList<Recipe> listNotCookedYet;
private CustomListView ls;
private SectionComposerAdapter adapter;
private Activity parent;
private String tabTag; // Tab state from Parent
private View view;
private SegmentedRadioGroup segmentText;
private RadioButton rbAll;
private RadioButton rbNotCookedYet;


public ListFragment(String tabTag, ArrayList<Recipe> listAll, ArrayList<Recipe> listNTY) {
    this.tabTag = tabTag;
    this.listAll = listAll;
    this.listNotCookedYet = listNTY;
}

public String getTabTag(){
    return this.tabTag;
}

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

    // Inflate the layout for this fragment
    view = inflater.inflate(R.layout.list_with_section, container,
            false);
    parent = getActivity();

    // get Elements
    segmentText = (SegmentedRadioGroup) view
            .findViewById(R.id.segment_text);
    rbAll = (RadioButton) view.findViewById(R.id.button_list_all);
    rbNotCookedYet = (RadioButton) view
            .findViewById(R.id.button_list_notcookedyet);

    // Set Content
    if (parent != null && parent instanceof ListMainActivity) {

        ListDataHolder holder = ((ListMainActivity) parent)
                .getDataHolder();

        adapter = new SectionComposerAdapter(parent, holder);
        adapter.getCount();
        initialize(adapter);

        System.out.println("ANZAHL ALL: " + listAll.size());
        System.out.println("ANZAHL UNCOOKED: " + listNotCookedYet.size());

        //The default text is "all (*)" and "not cooked yet (*)"
        rbAll.setText(rbAll.getText().toString()
                .replace("*", listAll.size() + ""));
        rbNotCookedYet.setText(rbNotCookedYet.getText().toString()
                .replace("*", listNotCookedYet.size() + ""));

        segmentText
                .setOnCheckedChangeListener(new OnCheckedChangeListener() {

                    @Override
                    public void onCheckedChanged(RadioGroup group,
                            int checkedId) {

                        if (rbAll.getId() == checkedId) {
                            adapter.setDataModel(tabTag, true);
                            System.out.println("CHECKED: All");

                        }

                        else if (rbNotCookedYet.getId() == checkedId) {
                            adapter.setDataModel(tabTag, false);
                            System.out.println("CHECKED: Not Yet");
                        }


                    }
                });

    }
    return view;
}

@Override
public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);

}

private void initialize(SectionComposerAdapter adapter) {
    ls = (CustomListView) view
            .findViewById(R.id.list_services);
    ls.setPinnedHeaderView(LayoutInflater.from(parent).inflate(
            R.layout.item_composer_header, ls, false));
    ls.setAdapter(adapter);
    ls.setOnItemClickListener(new OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view,
                int position, long id) {

            Intent intent = new Intent(view.getContext(),
                    RecipeActivity.class);
            startActivityForResult(intent, 0);

        }
    });
}
公共类ListFragment扩展了片段{
私有ArrayList列表;
private ArrayList listNotCookedYet;
私有客户列表视图;
专用适配器;
私人活动家长;
私有字符串tabTag;//来自父项的选项卡状态
私人视野;
私有分段RadioGroup分段文本;
专用无线按钮无线电话;
私人单选按钮RBNotCooked尚未;
公共ListFragment(字符串tabTag、ArrayList listAll、ArrayList listNTY){
this.tabTag=tabTag;
this.listAll=listAll;
this.listNotCookedYet=listNTY;
}
公共字符串getTabTag(){
返回此.tabTag;
}
@凌驾
创建视图上的公共视图(布局、充气机、视图组容器、,
Bundle savedInstanceState){
//为该碎片膨胀布局
视图=充气机。充气(R.layout.list,带部分、容器、,
假);
parent=getActivity();
//获取元素
segmentText=(SegmentedRadioGroup)视图
.findViewById(R.id.段\文本);
rbAll=(RadioButton)view.findViewById(R.id.button\u list\u all);
rbNotCookedYet=(单选按钮)视图
.findViewById(R.id.按钮列表未烹饪);
//设置内容
if(parent!=null&&parent instanceof ListMainActivity){
ListDataHolder=((ListMainActivity)父级)
.getDataHolder();
适配器=新适配器(父级、保持架);
getCount();
初始化(适配器);
System.out.println(“ANZAHL ALL:+listAll.size());
System.out.println(“anzahluncooked:+listNotCookedYet.size());
//默认文本为“全部(*)和“尚未烹饪(*)”
rbAll.setText(rbAll.getText().toString())
.replace(“*”,listAll.size()+”);
rbNotCookedYet.setText(rbNotCookedYet.getText().toString())
.replace(“*”,listNotCookedYet.size()+”);
分段文本
.setOnCheckedChangeListener(新的OnCheckedChangeListener(){
@凌驾
检查更改后的公共无效(放射组组,
int checkedd){
if(rbAll.getId()==checkedId){
setDataModel(tabTag,true);
System.out.println(“选中:全部”);
}
else if(rbNotCookedYet.getId()==checkedId){
setDataModel(tabTag,false);
System.out.println(“已检查:尚未”);
}
}
});
}
返回视图;
}
@凌驾
已创建ActivityState上的公共无效(Bundle savedInstanceState){
super.onActivityCreated(savedInstanceState);
}
私有void初始化(SectionComposer适配器){
ls=(CustomListView)视图
.findViewById(R.id.list_服务);
ls.setPinnedHeaderView(布局)从(父级)变平。充气(
R.layout.item_composer_header,ls,false));
ls.setAdapter(适配器);
ls.setOnItemClickListener(新的OnItemClickListener(){
@凌驾
public void onItemClick(AdapterView父级、视图、,
内部位置,长id){
Intent Intent=新的Intent(view.getContext(),
交互性(类);
startActivityForResult(意向,0);
}
});
}
ListDataHolder按字母顺序分割数据,并将它们作为每个选项卡和每个单选按钮选择的单独Arraylist保存(因此有6个Arraylist)

这是我的适配器:

public class SectionComposerAdapter extends CustomListAdapter {

private Activity activity;
private ListDataHolder dataholder;
private static LayoutInflater inflater = null;
private ImageLoader imageLoader;
private List<Pair<String, ArrayList<Recipe>>> data;

public SectionComposerAdapter(Activity a, ListDataHolder holder) {
    activity = a;
    this.dataholder = holder;
    inflater = (LayoutInflater) activity
            .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    imageLoader = new ImageLoader(activity.getApplicationContext());
    data = dataholder.getAllData(dataholder.getAZRecipeAll());
}

public void setDataModel(String tab, boolean all) {
    if (MyApplication.TAB_A.equals(tab)) {
        if (all) {
            data = dataholder.getAllData(dataholder.getAZRecipeAll());
        } else {
            data = dataholder.getAllData(dataholder
                    .getAZRecipeNotCookedYet());
        }
    } else if (MyApplication.TAB_B.equals(tab)) {
        if (all) {
            data = dataholder.getAllData(dataholder.getMeatRecipeAll());
        } else {
            data = dataholder.getAllData(dataholder
                    .getMeatRecipeNotCookedYet());
        }
    } else if (MyApplication.TAB_C.equals(tab)) {
        if (all) {
            data = dataholder
                    .getAllData(dataholder.getVegetarianRecipeAll());
        } else {
            data = dataholder.getAllData(dataholder
                    .getVegetarianRecipeNotCookedYet());
        }
    }


}

@Override
public int getCount() {
    int res = 0;
    for (int i = 0; i < data.size(); i++) {
        res += data.get(i).second.size();
    }
    return res;
}

@Override
public Recipe getItem(int position) {
    int c = 0;
    for (int i = 0; i < data.size(); i++) {
        if (position >= c && position < c + data.get(i).second.size()) {
            return data.get(i).second.get(position - c);
        }
        c += data.get(i).second.size();
    }
    return null;
}

@Override
public long getItemId(int position) {
    return position;
}

@Override
protected void onNextPageRequested(int page) {
}

@Override
protected void bindSectionHeader(View view, int position,
        boolean displaySectionHeader) {
    if (displaySectionHeader) {
        view.findViewById(R.id.list_section_header).setVisibility(
                View.VISIBLE);
        TextView lSectionTitle = (TextView) view
                .findViewById(R.id.list_section_header);
        lSectionTitle
                .setText(getSections()[getSectionForPosition(position)]);
    } else {
        TextView lSectionTitle = (TextView) view
                .findViewById(R.id.list_section_header);
        lSectionTitle
                .setText(getSections()[getSectionForPosition(position)]);
        view.findViewById(R.id.list_section_header)
                .setVisibility(View.GONE);
    }
}

@Override
public View getAmazingView(int position, View convertView, ViewGroup parent) {
    View vi = convertView;
    if (vi == null)
        vi = inflater.inflate(R.layout.list_row, null);

    TextView recipename = (TextView) vi.findViewById(R.id.recipe_name);
    TextView recipevip = (TextView) vi.findViewById(R.id.recipe_fav_mark);
    ImageView thumb_image = (ImageView) vi.findViewById(R.id.list_image);

    Recipe recipe = new Recipe();
    recipe = getItem(position);

    // Setting all values in listview
    recipename.setText(recipe.getTitle);
    recipevip.setText(recipe.isFav() ? "FAV" : "");
    imageLoader.DisplayImage(recipe.getImage_thumbnail(), thumb_image);

    return vi;
}

@Override
public void configurePinnedHeader(View header, int position, int alpha) {
    TextView lSectionHeader = (TextView) header;
    lSectionHeader.setText(getSections()[getSectionForPosition(position)]);
    // lSectionHeader.setBackgroundColor(alpha << 24 | (0xbbffbb));
    // lSectionHeader.setTextColor(alpha << 24 | (0x000000));
}

@Override
public int getPositionForSection(int section) {
    if (section < 0)
        section = 0;
    if (section >= data.size())
        section = data.size() - 1;
    int c = 0;
    for (int i = 0; i < data.size(); i++) {
        if (section == i) {
            return c;
        }
        c += data.get(i).second.size();
    }
    return 0;
}

@Override
public int getSectionForPosition(int position) {
    int c = 0;
    for (int i = 0; i < data.size(); i++) {
        if (position >= c && position < c + data.get(i).second.size()) {
            return i;
        }
        c += data.get(i).second.size();
    }
    return -1;
}

@Override
public String[] getSections() {
    String[] res = new String[data.size()];
    for (int i = 0; i < data.size(); i++) {
        res[i] = data.get(i).first;
    }
    return res;
}
公共类SectionComposer适配器扩展了CustomListAdapter{
私人活动;
私有列表数据持有者;
专用静态充气机=空;
私有图像加载器;
私人名单数据;
公共分区编写器适配器(活动a,ListDataHolder){
活动=a;
this.dataholder=holder;
充气器=(充气器)活动
.getSystemService(上下文布局\充气机\服务);
imageLoader=新的imageLoader(activity.getApplicationContext());
data=dataholder.getAllData(dataholder.getAZRecipeAll());
}
public void setDataModel(字符串选项卡,布尔型全部){
if(MyApplication.TAB_A.equals(TAB)){
如果(全部){
data=dataholder.getAllData(dataholder.getAZRecipeAll());
}否则{
data=dataholder.getAllData(dataholder
.getazRecipeNotCokeDyet());
}
}else if(MyApplication.TAB_B.equals(TAB)){
如果(全部){
data=dataholder.getAllData(dataholder.getMeatRecipeAll());
}否则{
data=dataholder.getAllData(dataholder
.getMeatRecipeNotCokeDyet());
}
}else if(MyApplication.TAB_C.equals(TAB)){
如果(全部){
数据=数据持有者