1

關於這個主題的文獻很少,而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(或不,我可能完全不正確,但是這對我有用!)

享受生活,不要放棄!

+2

那麼,這是什麼,一個教程? – 2014-11-06 16:02:00

+0

是的,非常。我找不到合適的資源來製作一個片段中的列表視圖,因爲谷歌用一些名爲ListFragment的類淹沒了教程小衆,它不容易使用像listviewanimation這樣的庫進行定製: https://github.com/nhaarman/ListViewAnimations 另外,我在一個非常無聊的班級,所以我想我會記錄我的方法。 另外,我真的想要那50個代表點,這樣我就可以評論這篇文章:http://stackoverflow.com/a/18319050/2977650 感謝他們在做得好的工作 – slackbot39243 2014-11-06 16:04:02

+1

在片段中的ListView或在Activity中是我最喜歡的提供ListViews的方式,因爲多年以來。這是一件非常容易的事情:只需將一個ListView放置在xml佈局中,然後使用該佈局作爲Activity或Fragment的contententView。 – 2014-11-06 16:08:13

回答

0

活動XML,大部分是無關的各位讀者,但碎片的容器的觀點是尋呼機:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" 
xmlns:app="http://schemas.android.com/apk/res-auto" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
tools:context=".MainActivity"> 

<!--Navigation Drawer Still Under Construction--> 
<android.support.v4.widget.DrawerLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/drawer_layout" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <!-- As the main content view, the view below consumes the entire 
     space available using match_parent in both dimensions. --> 
    <FrameLayout 
     android:id="@+id/content_frame" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" /> 

    <!-- android:layout_gravity="start" tells DrawerLayout to treat 
     this as a sliding drawer on the left side for left-to-right 
     languages and on the right side for right-to-left languages. 
     The drawer is given a fixed width in dp and extends the full height of 
     the container. A solid background is used for contrast 
     with the content view. --> 

    <ListView 
     android:id="@+id/left_drawer" 
     android:layout_width="240dp" 
     android:layout_height="match_parent" 
     android:layout_gravity="start" 
     android:choiceMode="singleChoice" 
     android:divider="@android:color/transparent" 
     android:dividerHeight="0dp" 
     android:background="#ffff"/> 
</android.support.v4.widget.DrawerLayout> 
<!--Navigation Drawer Still Under Construction--> 


<!--Customizations on README at: https://github.com/astuetz/PagerSlidingTabStrip--> 
<com.astuetz.PagerSlidingTabStrip 
    android:id="@+id/tabs" 
    android:layout_width="wrap_content" 
    android:layout_height="48dip" 
    app:pstsShouldExpand="true" 
    app:pstsIndicatorHeight="5dip" 
    app:pstsDividerPadding="0dip" 
    app:pstsDividerColor="#ff6d00" 
    app:pstsUnderlineColor="#ff5722" 
    app:pstsIndicatorColor="#ff5722"/> 

<!--To scale the viewpager vertically, android:layout_above="@+id/[viewname]" --> 
<android.support.v4.view.ViewPager 
    android:id="@+id/pager" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:layout_below="@+id/tabs" 
    tools:context=".MainActivity" /> 

</RelativeLayout> 

的XML佈局爲片段:

<?xml version="1.0" encoding="utf-8"?> 



<Button 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:text="New Item" 
    android:id="@+id/btn_newItem" 
    android:layout_alignParentBottom="true" 
    android:layout_alignParentLeft="true" 
    android:layout_alignParentStart="true" /> 

<com.nhaarman.listviewanimations.itemmanipulation.DynamicListView 
    android:id="@+id/GenericListView" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:layout_alignParentTop="true" 
    android:layout_alignParentLeft="true" 
    android:layout_alignParentStart="true" 
    android:layout_above="@+id/btn_newGoal" /> 

的特定行項目:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    tools:ignore="UseCompoundDrawables"> 

<com.nhaarman.listviewanimations.itemmanipulation.dragdrop.GripView 
    android:id="@+id/list_row_draganddrop_touchview" 
    android:layout_width="wrap_content" 
    android:layout_height="match_parent" 
    android:color="@android:color/darker_gray" 
    android:paddingBottom="4dp" 
    android:paddingLeft="8dp" 
    android:paddingRight="8dp" 
    android:paddingTop="4dp" /> 

<TextView 
    android:id="@+id/list_row_draganddrop_textview" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:fontFamily="sans-serif-light" 
    android:gravity="center_vertical" 
    android:minHeight="48dp" 
    android:textColor="?android:attr/textColorSecondary" 
    android:textSize="20sp" 
    tools:ignore="UnusedAttribute" /> 
</LinearLayout> 

的第二代碼段的佈局部分得到切斷,因此未AGR用我的ctrl K'ing進行操作,但是它的長短不一,是因爲listview在那裏,所以無論你把它放在線性佈局還是相對佈局都沒關係。

祝你好運兄弟的快樂編碼

相關問題