我編程我的第一個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;
}
名單作品,未經標籤和單選按鈕的罰款。監聽器也工作正常,我看到日誌中標籤和單選按鈕的變化。我無法讓他們正確地一起工作。
預先感謝您,我希望一些技巧;)
戴安娜
您需要發佈碎片代碼,以便我們瞭解如何處理按鈕中的點擊。 – wyoskibum 2012-07-20 00:40:49
哦,好吧,我添加了代碼:) – Diana 2012-07-20 07:50:40