關於這個主題的文獻很少,而google的文檔沒有考慮使用ListFragment擴展來定製片段列表的可能性(listviewanimation)。因此,我會問這個問題,然後儘可能地回答它,因爲我也想要50個聲望點,所以我最後可以通過評論感謝這個網站上的優秀解釋者。如何創建一個沒有ListFragment列表的片段
對於此評論的目的,我會從listviewanimation LIB在股價組件:
https://github.com/nhaarman/ListViewAnimations
答:
我們需要設置4個部件有一個適當的片段與列表視圖組件
- 活動通過活動的片段管理器創建片段。
- Fragment類將是非常基本的片段東西,它將具有listview,並且它將鏈接該列表視圖與arrayadapter。
- 適用於我們的目的只能處理字符串的Adapter類。
- 在ADAPTER CLASS中,最後的第四個組件將是一個viewholder類,它將允許更快地創建列表中的行,因爲每行的單個組件將被包裝在允許更快速的對象實例化的類中。
好的,首先將是活動的代碼,這個代碼可以通過點擊按鈕或其他事件來調用。當事件發生時,片段管理器將被創建,並且片段管理器將創建一個事務,這是一種奇特的說法,管理器將在活動和新形成的片段之間進行通信,以便正確設置所有內容。
這裏就是事件發生時,應放置在你的活動代碼:
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
GenericFragment fragment = new GenericFragment();
fragmentTransaction.add(R.id.pager, fragment);
//Replace R.id.pager with the view that you want your fragment to go in.
fragmentTransaction.commit();
這就是它!不是很糟糕,是嗎?現在讓我們繼續討論GenericFragment類,您可以創建一個不同的名稱。我不會發布這一切的代碼,但我會通過你需要有一個ListView片段課堂上的一切步驟:
- 有你的片段類擴展片段
- 有一個空的構造這個類(谷歌需要它... -__-)
創建一個newInstance方法,該方法將處理從活動創建片段的「新實例」時將數據從活動傳遞到片段的傳遞:
我會幫你用這個:
public static GenericFragment newInstance(String StuffYouWantGetsPassedFromActivityToFragment) {
GenericFragment GenericFragment = new GenericFragment();
Bundle args = new Bundle();
GenericFragment.setArguments(args);
return GenericFragment;
}
再次沒那麼糟糕吧?我們還沒有完成,我們仍然需要重寫onCreateView和onCreate,然後我們將完成這個簡單的步驟!
確定爲onCreateView:
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.generic_fragment_layout, container, false);
addGoalButton = (Button) view.findViewById(R.id.btn_newRow); //Created for testing purposes
lv = (ListView) view.findViewById(R.id.GenericListView);
addGoalButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) { //Created for testing purposes
genericAdapter.add("Goal");
genericAdapter.notifyDataSetChanged();
}
});
lv.setAdapter(genericAdapter);
return view;
}
,上面的代碼可能看起來像一個怪物,你說得對!高層次的概述是,你得到了你想要的片段的佈局文件。在這個佈局文件中,你得到了listview並創建了一個變量來保存它。然後你調用listView的'setAdapter'方法來添加下一步,即適配器類。出於測試目的,我添加了該按鈕,以便您可以在腦海中擴展本教程l8er。 (刪除所有按鈕代碼,如果你只想列表)
好吧,片段類的最後一步:覆蓋OnCreate!
OnCreate方法是你想要實例化所有你的私有變量,比如genericAdapter變量或者你想要在Fragment類的多個部分使用的任何東西。
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ArrayList<String> exampleItemList = new ArrayList<String>();
exampleItemList.add("item1");
exampleItemList.add("item2");
exampleItemList.add("item3");
exampleItemList.add("item4");
exampleItemList.add("item5");
exampleItemList.add("item6");
exampleItemList.add("item7");
exampleItemList.add("item8");
exampleItemList.add("item9");
exampleItemList.add("item10");
exampleItemList.add("item11");
exampleItemList.add("item12");
genericAdapter = new genericAdapter(getActivity(), 0, exampleItemList);
setHasOptionsMenu(true); // Allows the fragment to change the menu buttons
}
我將示例項添加到arrayList中,以使本教程對於數據來自哪裏以及去哪裏的位置更加透明。
就是這樣!你的片段完成了!現在已經快結束了,我保證。
讓我們敲最後兩個步驟一起出去,建立一個擴展ArrayAdapter和私人內部ViewHolder類來包裝中的所有佈局組件GenericAdapter類:
public class GenericAdapter extends ArrayAdapter<String>
LayoutInflater layoutInflater;
//Used to get the correct LayoutInflater to inflate each row item
public GenericAdapter(Context context, int resource, List<String> objects) {
super(context, 0, objects);
layoutInflater = layoutInflater.from(context);
}
/**
* @param position The position in the list to get the data for that row item.
* @param convertView The view for the row item that will be shown in the list.
* @param parent Having this object allows you to use the LayoutInflater for the parent.
* @return
*/
@Override
public View getView(int position, View convertView, ViewGroup parent) {
final GenericViewHolder GenericViewHolder;
final String item = getItem(position);
if(convertView == null){
LinearLayout rootView = (LinearLayout) layoutInflater.inflate(R.layout.item_row, parent, false);
genericViewHolder = genericViewHolder.create(rootView);
rootView.setTag(genericViewHolder);
}
else{
genericViewHolder = (genericViewHolder) convertView.getTag();
}
genericViewHolder.textView.setText(item);
return genericViewHolder.rootView;
}
/**
* ViewHolder's allow for a single object to maintain a Goal row item, so that the row item
* doesn't have to create each individual component (textview layout etc.) each time the
* row object is created/recreated. Allows for fast scrolling with little latency.
*/
private static class GenericViewHolder {
public final LinearLayout rootView;
public final GripView gripView;
public final TextView textView;
private GoalViewHolder(LinearLayout rootView, GripView gripView, TextView textView) {
this.rootView = rootView;
this.gripView = gripView;
this.textView = textView;
}
public static GoalViewHolder create(LinearLayout rootView){
TextView textView = (TextView)rootView.findViewById(R.id.list_row_draganddrop_textview);
GripView gripView = (GripView)rootView.findViewById(R.id.list_row_draganddrop_touchview);
return new GenericViewHolder(rootView, gripView, textView);
}
}
}
這是再次,一個怪物,我們來看一下高級概述,我們創建了一個適配器類和一個適配器類使用的viewholder類。在適配器的構造函數中,我們得到了一個layoutinflater來幫助擴充每一行的項目。然後,我們創建了getView方法,該方法在您的應用程序中調用了數千次,因爲它可以在用戶可查看每行時顯示。 getView方法可以查看要轉換爲行的視圖是否爲null。如果是,它會創建一個新的數據條目(一個viewholder),但是如果它不是null,那麼這個viewholder已經被創建了,所以我們得到了viewholder裏面的所有東西,這樣我們就不必創建一個新的行項目。
phew!我不指望你明白這一點,但如果你這樣做,恭喜你。
好吧,就這樣吧。你應該被設置,並且當你的活動的事件被調用時,片段將顯示在包含該片段的任何視圖中。我會在我的答案中發佈我的XML文件,以便我可以得到那些美味的upvotes(或不,我可能完全不正確,但是這對我有用!)
享受生活,不要放棄!
那麼,這是什麼,一個教程? – 2014-11-06 16:02:00
是的,非常。我找不到合適的資源來製作一個片段中的列表視圖,因爲谷歌用一些名爲ListFragment的類淹沒了教程小衆,它不容易使用像listviewanimation這樣的庫進行定製: https://github.com/nhaarman/ListViewAnimations 另外,我在一個非常無聊的班級,所以我想我會記錄我的方法。 另外,我真的想要那50個代表點,這樣我就可以評論這篇文章:http://stackoverflow.com/a/18319050/2977650 感謝他們在做得好的工作 – slackbot39243 2014-11-06 16:04:02
在片段中的ListView或在Activity中是我最喜歡的提供ListViews的方式,因爲多年以來。這是一件非常容易的事情:只需將一個ListView放置在xml佈局中,然後使用該佈局作爲Activity或Fragment的contententView。 – 2014-11-06 16:08:13