編輯:關於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 怎樣創建對話框
Android 官方推薦 : DialogFragment 怎樣創建對話框 1、 概述 DialogFragment在android 3.0時被引入。是一種特殊的
Android編程之客戶端通過socket與服務器通信的方法
Android編程之客戶端通過socket與服務器通信的方法 Android編程之客戶端通過socket與服務器通信的方法 &n
用Kotlin實現Android定制視圖(KAD 06),kotlinandroid
用Kotlin實現Android定制視圖(KAD 06),kotlinandroid作者:Antonio Leiva 時間:Dec 27, 2016 原文鏈接:https
Android中ListView實現圖文並列並且自定義分割線(完善仿微信APP),androidlistview
Android中ListView實現圖文並列並且自定義分割線(完善仿微信APP),androidlistview昨天的(今天凌晨)的博文《Android中Fragment