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返回空數據。

對不起!