編輯:關於Android編程
今天接觸到了Fragment碎片,也是現在編寫APP的主流道具。那麼今天我用ViewPager、Fragment和ListView做了一個新聞列表,分享給大家。效果圖裡上方的指示器是用了第三方工具PagerSlidingTabStrip完成的,非常好用!省去了好多我之前寫的監聽事件。
首先,我們建一個Activity,然後在新建的Activity的layout中添加兩個控件:
前者為第三方工具PagerSlidingTabStrip,後者V4包的ViewPager。
這Fragment自帶的layout中,我們放一個ListView控件。
因為咱是要做新聞列表嘛!當然少不了實體類,好,我們建一個新聞的實體類。
public class News implements Serializable{ private String title; private String pubDate; private int img; private int img1; private int img2; private int img3; public News(String title, String pubDate, int img, int img1, int img2, int img3) { this.title = title; this.pubDate = pubDate; this.img = img; this.img1 = img1; this.img2 = img2; this.img3 = img3; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public String getPubDate() { return pubDate; } public void setPubDate(String pubDate) { this.pubDate = pubDate; } public int getImg() { return img; } public void setImg(int img) { this.img = img; } public int getImg1() { return img1; } public void setImg1(int img1) { this.img1 = img1; } public int getImg2() { return img2; } public void setImg2(int img2) { this.img2 = img2; } public int getImg3() { return img3; } public void setImg3(int img3) { this.img3 = img3; } }因為新聞列表裡的新聞是一條一條呈現在列表裡面的,並且都有各自的樣式,所以,我們再建一個layout來設計一下新聞的樣式。list_simple_layout.xml,簡單起見,裡面只放了一個圖片和一個文本。
大家也都用過新聞軟件,你們會發現,在新聞列表中點了某一則新聞,它會跳轉到一個新的界面,新的界面呈現的是有關這個新聞完整的信息。所以在這我們再弄一個用來跳轉的Activity,並且在它的layout了搞一下布局,隨你喜歡。我這裡就先只用一個文本框做示例。
android:id="@+id/tv" android:gravity="center" android:textColor="#408fde" android:textSize="30sp"/>
這裡我們需要兩個適配器,一個是FragmentViewPager的,一個是FragmentListView的。下面直接給出。
public class MyFragmentViewAdapter extends FragmentPagerAdapter { private Listlist; private List title; private Context context; public MyFragmentViewAdapter(FragmentManager fm, List list,List title) { super(fm); this.title = title; this.list = list; } @Override public Fragment getItem(int position) { return list.get(position); } @Override public int getCount() { return list.size(); } @Override public CharSequence getPageTitle(int position) { return title.get(position); } }
public class MyListViewAdapter extends BaseAdapter { private Context context; private Listlist; public MyListViewAdapter(Context context, List list) { this.context = context; this.list = list; } @Override public int getCount() { return list.size(); } @Override public Object getItem(int i) { return list.get(i); } @Override public long getItemId(int i) { return 0; } @Override public View getView(int i, View view, ViewGroup viewGroup) { ViewHolder vh; if(view==null){ vh = new ViewHolder(); view = LayoutInflater.from(context).inflate(R.layout.list_simple_layout,null); vh.img = (ImageView) view.findViewById(R.id.iv); vh.title = (TextView) view.findViewById(R.id.tv); view.setTag(vh); }else { vh = (ViewHolder) view.getTag(); } view.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Intent intent = new Intent(context, Main2Activity.class); context.startActivity(intent); } }); vh.img.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Toast.makeText(context,"點擊圖片",Toast.LENGTH_SHORT).show(); } }); News news = list.get(i); vh.title.setText(news.getTitle()); vh.img.setImageResource(news.getImg()); return view; } public class ViewHolder{ TextView title; ImageView img; } }
好了,一切准備就緒,重頭戲來了,就是我們如何用ViewPager、Fragment、ListView。我會在代碼裡加上注釋進行說明。
首先,一開始的Activity。
public class ToDayNewsActivity extends AppCompatActivity { //建兩個全局變量,等下用它們獲取layout裡面的兩個控件 private ViewPager vp; private PagerSlidingTabStrip pst; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_to_day_news); //這裡我改了一下Toolbar的樣式,和文章主題無關緊要 Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(toolbar); //用上面的兩個全局變量find到控件 vp = (ViewPager) findViewById(R.id.vp); pst = (PagerSlidingTabStrip) findViewById(R.id.pst); //建一個List,泛型設為Fragment,用來存放Fragment Listlist = new ArrayList<>(); //建一個存放字符串的List,這裡是為了用第三方工具PagerSlidingTabStrip而弄的,因為要往裡面穿一些參數。 //最後呈現的是上方的可點擊指示器 List title = new ArrayList<>(); title.add("體育"); title.add("娛樂"); title.add("奧運"); title.add("財經"); title.add("國際"); //來個循環,我這裡弄了五次,建了5個ListViewFragment,並且往ListViewFragment裡捆綁了一些整數,用於判斷 //並區分多種新聞內容 for(int i = 1;i<=5;i++){ Fragment fragment = new ListViewFragment(); Bundle bundle = new Bundle(); bundle.putInt("arg",i); fragment.setArguments(bundle); list.add(fragment); } //將存放了Fragment的列表和指示器的參量加載到適配器中,然後將適配器變量加載到ViewPager中 //最後將ViewPager放到布局的PagerSlidingTabStrip第三方控件裡 MyFragmentViewAdapter ma = new MyFragmentViewAdapter(getSupportFragmentManager(),list,title); vp.setAdapter(ma); pst.setViewPager(vp); } }
接下來是Fragment。
public class ListViewFragment extends Fragment { public ListViewFragment() { // Required empty public constructor } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // Inflate the layout for this fragment return inflater.inflate(R.layout.fragment_list_view, container, false); } @Override public void onActivityCreated(@Nullable Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); //這裡建一個List用來存放News新聞類 final Listlist = new ArrayList<>(); //創建了個ListView變量用來獲取layout中的ListView ListView lv1 = (ListView) getView().findViewById(R.id.lv1); //建一個適配的變量,將上下文和list加載到ListVIew的適配器中,然後放到適配器變量裡 MyListViewAdapter ma = new MyListViewAdapter(getActivity(),list); //將適配器變量的內容加載到List裡(也就是把那一堆新聞都放了進去) lv1.setAdapter(ma); //獲取Activity裡傳過來的捆綁數據 Bundle bundle = getArguments(); //用來判斷是那一中新聞 if(bundle != null){ int arg = bundle.getInt("arg"); switch (arg){ case 1: for(int i = 1;i<20;i++){ list.add(new News("暴走大事件","剛剛",R.mipmap.mei02, R.mipmap.mei02,R.mipmap.mei02,R.mipmap.mei05)); } ma.notifyDataSetChanged(); break; case 2: for(int i = 1;i<20;i++){ list.add(new News("暴走大事件","剛剛",R.mipmap.mei02, R.mipmap.mei02,R.mipmap.mei02,R.mipmap.mei05)); } ma.notifyDataSetChanged(); break; case 3: for(int i = 1;i<20;i++){ list.add(new News("推理要在晚飯後","昨天",R.mipmap.mei02, R.mipmap.mei02,R.mipmap.mei02,R.mipmap.mei05)); } ma.notifyDataSetChanged(); break; case 4: for(int i = 1;i<20;i++){ list.add(new News("嘿嘿嘿~","晚上",R.mipmap.mei02, R.mipmap.mei02,R.mipmap.mei02,R.mipmap.mei05)); } ma.notifyDataSetChanged(); break; case 5: for(int i = 1;i<20;i++){ list.add(new News("- -、守望","凌晨2點",R.mipmap.mei02, R.mipmap.mei02,R.mipmap.mei02,R.mipmap.mei05)); } ma.notifyDataSetChanged(); break; default:break; } } //這裡用到了監聽事件,目的是點擊新聞列表中的新聞後跳轉到完整的新聞界面 lv1.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView adapterView, View view, int i, long l) { News news = list.get(i); Toast.makeText(getActivity(),news.getTitle(),Toast.LENGTH_SHORT).show(); Intent intent = new Intent(getActivity(), IntentActivity.class); intent.putExtra("obj",news); Bundle bundle1 = new Bundle(); bundle1.putString("arg1","新聞詳情"); intent.putExtra("bundle",bundle1); startActivity(intent); } }); } }
public class IntentActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_intent); TextView tv = (TextView) findViewById(R.id.tv); ImageView iv = (ImageView) findViewById(R.id.iv); Intent intent = getIntent(); News news = (News) intent.getSerializableExtra("obj"); Bundle bundle = intent.getBundleExtra("bundle"); String arg = bundle.getString("arg1"); StringBuilder sbld = new StringBuilder(); sbld.append(arg+"\n"); sbld.append(news.getTitle()+"\n"); sbld.append(news.getPubDate()+"\n"); tv.setText(sbld.toString()); iv.setImageResource(news.getImg()); } }大功告成!
Animation 概述安裝中的動畫分為三種:補間動畫(Tween Animation),幀動畫(Frame Animation)和屬性動畫(Property Anima
之前一直想總結一下這樣知識,後面各種忙,就不想寫。還是自已總結一下比較好。listview需要注意事項有很多吧,也是最常用的控件之一。我們可以自動計算listview的高
一、前言因為近期項目中開始使用Redis,為了更好的理解Redis並應用在適合的業務場景,需要對Redis設計與實現深入的理解。我分析流程是按照從main進入,逐步深入分
沉浸體驗是VR的核心也是一直以來的技術難點,虛擬現實的發展一直專注於怎樣讓用戶獲得更好的沉浸式體驗,這涉及到多個領域的多項技術,上至渲染優化,性能優化,下至人眼的構造,肢