編輯:關於android開發
1.寫布局 相對布局 : ListView和TextView和ProgressBar,初始化
1 <?xml version="1.0" encoding="utf-8"?> 2 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 android:layout_width="match_parent" 4 android:layout_height="match_parent"> 5 6 <ListView 7 android:divider="@null" 8 android:id="@+id/listview" 9 android:layout_width="match_parent" 10 android:layout_height="match_parent" /> 11 12 <TextView 13 android:id="@+id/tv_nomedia" 14 android:layout_width="wrap_content" 15 android:layout_height="wrap_content" 16 android:layout_centerInParent="true" 17 android:text="沒有發現視頻..." 18 android:textColor="#000000" 19 android:textSize="18sp" 20 android:visibility="gone" /> 21 22 <ProgressBar 23 android:id="@+id/pb_loading" 24 android:layout_width="wrap_content" 25 android:layout_height="wrap_content" 26 android:layout_centerInParent="true" 27 /> 28 29 </RelativeLayout>video_pager.xml
2.加載本地的視頻,在子線程中加載視頻,加載的視頻放入集合中; 設置適配器要在主線程;用Handler,設置適配器
1 public class VideoPager extends BasePager { 2 3 private ListView listview; 4 private TextView tv_nomedia; 5 private ProgressBar pb_loading; 6 7 8 private VideoPagerAdapter videoPagerAdapter; 9 10 /** 11 * 裝數據集合 12 */ 13 private ArrayList<MediaItem> mediaItems; 14 15 16 public VideoPager(Context context) { 17 super(context); 18 19 } 20 21 private Handler handler = new Handler(){ 22 @Override 23 public void handleMessage(Message msg) { 24 super.handleMessage(msg); 25 if(mediaItems != null && mediaItems.size() >0){ 26 //有數據 27 //設置適配器 28 videoPagerAdapter = new VideoPagerAdapter(context,mediaItems,true); 29 listview.setAdapter(videoPagerAdapter); 30 //把文本隱藏 31 tv_nomedia.setVisibility(View.GONE); 32 }else{ 33 //沒有數據 34 //文本顯示 35 tv_nomedia.setVisibility(View.VISIBLE); 36 } 37 38 39 //ProgressBar隱藏 40 pb_loading.setVisibility(View.GONE); 41 } 42 }; 43 44 /** 45 * 初始化當前頁面的控件,由父類調用 46 * @return 47 */ 48 @Override 49 public View initView() { 50 View view = View.inflate(context, R.layout.video_pager,null); 51 listview = (ListView) view.findViewById(R.id.listview); 52 tv_nomedia = (TextView) view.findViewById(R.id.tv_nomedia); 53 pb_loading = (ProgressBar) view.findViewById(R.id.pb_loading); 54 //設置ListView的Item的點擊事件 55 listview.setOnItemClickListener(new MyOnItemClickListener()); 56 return view; 57 } 58 59 class MyOnItemClickListener implements AdapterView.OnItemClickListener { 60 61 @Override 62 public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 63 64 MediaItem mediaItem = mediaItems.get(position); 65 // Toast.makeText(context, "mediaItem=="+mediaItem.toString(), Toast.LENGTH_SHORT).show(); 66 67 //1.調起系統所有的播放-隱式意圖 68 // Intent intent = new Intent(); 69 // intent.setDataAndType(Uri.parse(mediaItem.getData()),"video/*"); 70 // context.startActivity(intent); 71 72 //2.調用自己寫的播放器-顯示意圖--一個播放地址 73 // Intent intent = new Intent(context,SystemVideoPlayer.class); 74 // intent.setDataAndType(Uri.parse(mediaItem.getData()),"video/*"); 75 // context.startActivity(intent); 76 //3.傳遞列表數據-對象-序列化 77 Intent intent = new Intent(context,SystemVideoPlayer.class); 78 Bundle bundle = new Bundle(); 79 bundle.putSerializable("videolist",mediaItems); 80 intent.putExtras(bundle); 81 intent.putExtra("position",position); 82 context.startActivity(intent); 83 84 } 85 } 86 87 88 @Override 89 public void initData() { 90 super.initData(); 91 LogUtil.e("本地視頻的數據被初始化了。。。"); 92 //加載本地視頻數據 93 getDataFromLocal(); 94 } 95 96 /** 97 * 從本地的sdcard得到數據 98 * //1.遍歷sdcard,後綴名 99 * //2.從內容提供者裡面獲取視頻 100 * //3.如果是6.0的系統,動態獲取讀取sdcard的權限 101 */ 102 private void getDataFromLocal() { 103 104 new Thread(){ 105 @Override 106 public void run() { 107 super.run(); 108 109 // isGrantExternalRW((Activity) context); 110 // SystemClock.sleep(2000); 111 mediaItems = new ArrayList<>(); 112 ContentResolver resolver = context.getContentResolver(); 113 Uri uri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI; 114 String[] objs = { 115 MediaStore.Video.Media.DISPLAY_NAME,//視頻文件在sdcard的名稱 116 MediaStore.Video.Media.DURATION,//視頻總時長 117 MediaStore.Video.Media.SIZE,//視頻的文件大小 118 MediaStore.Video.Media.DATA,//視頻的絕對地址 119 MediaStore.Video.Media.ARTIST,//歌曲的演唱者 120 121 }; 122 Cursor cursor = resolver.query(uri, objs, null, null, null); 123 if(cursor != null){ 124 while (cursor.moveToNext()){ 125 126 MediaItem mediaItem = new MediaItem(); 127 128 mediaItems.add(mediaItem);//寫在上面 129 130 String name = cursor.getString(0);//視頻的名稱 131 mediaItem.setName(name); 132 133 long duration = cursor.getLong(1);//視頻的時長 134 mediaItem.setDuration(duration); 135 136 long size = cursor.getLong(2);//視頻的文件大小 137 mediaItem.setSize(size); 138 139 String data = cursor.getString(3);//視頻的播放地址 140 mediaItem.setData(data); 141 142 String artist = cursor.getString(4);//藝術家 143 mediaItem.setArtist(artist); 144 } 145 146 cursor.close(); 147 } 148 149 //Handler發消息 150 handler.sendEmptyMessage(10); 151 } 152 }.start(); 153 154 } 155 156 /** 157 * 解決安卓6.0以上版本不能讀取外部存儲權限的問題 158 * @param activity 159 * @return 160 */ 161 public static boolean isGrantExternalRW(Activity activity) { 162 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && activity.checkSelfPermission( 163 Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { 164 165 activity.requestPermissions(new String[]{ 166 Manifest.permission.READ_EXTERNAL_STORAGE, 167 Manifest.permission.WRITE_EXTERNAL_STORAGE 168 }, 1); 169 170 return false; 171 } 172 173 return true; 174 } 175 176 }VideoPager.java
3.設置item的點擊事件,把視頻播放出來
Android 官方推薦 : DialogFragment 怎樣創建對話框 1、 概述 DialogFragment在android 3.0時被引入。是一種特殊的
Android編程之客戶端通過socket與服務器通信的方法 Android編程之客戶端通過socket與服務器通信的方法 &n
用Kotlin實現Android定制視圖(KAD 06),kotlinandroid作者:Antonio Leiva 時間:Dec 27, 2016 原文鏈接:https
Android中ListView實現圖文並列並且自定義分割線(完善仿微信APP),androidlistview昨天的(今天凌晨)的博文《Android中Fragment