0

我编程我的第一个Android应用程序和现在面临的一个问题:(我使用Eclipse和应用程序的目的是从Android 4.0.3运行。重用片段和layout.xml Android的标签操作栏

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

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

我已经做了两个片段和两个布局(前三个和最后一个标签)。第一个片段是管理radiogroup和listview。我还有一个适配器来设置数据模型,具体取决于选择哪个选项卡和按钮。但不知何故,我无法让它正常工作。单选按钮不会刷新,列表仅显示活动首次加载。没有例外被抛出。

我的方法错了吗?

这里是我的主要活动:

@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); 

     } 
    }); 
} 

的ListDataHolder已按字母顺序分段的数据的代码,并保持它们为每个选项卡并且每个单选按钮单独的ArrayList选择(所以有6个数组列表)。

这里是我的适配器:

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; 
} 

名单作品,未经标签和单选按钮的罚款。监听器也工作正常,我看到日志中标签和单选按钮的变化。我无法让他们正确地一起工作。

预先感谢您,我希望一些技巧;)

戴安娜

+0

您需要发布碎片代码,以便我们了解如何处理按钮中的点击。 – wyoskibum 2012-07-20 00:40:49

+0

哦,好吧,我添加了代码:) – Diana 2012-07-20 07:50:40

回答

0

呃......怎么尴尬,我花2天搜索代码的问题,当回答是很简单。我从其他选项卡的url返回空数据。

对不起!