在开发直播的时候,节目源涉及到版权问题,所以软件通常会提供自定义功能,让用户自己添加,这样就与软件开发者没有关系了,当然如果用户添加很多自定义节目,会让用户看起来很乱,这会影响用户的使用心情,所以我们可以显示更QQ一样的分类存储用户的自定义的源,先看一下效果:
首先先定义布局界面和Item布局
customexpandablelistview.xml
-
<?xml version="1.0" encoding="utf-8"?>
-
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-
android:id="@+id/expandParent"
-
android:layout_width="match_parent"
-
android:layout_height="match_parent"
-
android:orientation="vertical" >
-
-
<ExpandableListView
-
android:id="@+id/expandableListView"
-
android:layout_width="match_parent"
-
android:layout_height="wrap_content" >
-
</ExpandableListView>
-
-
</LinearLayout>
custom_expanditem.xml
-
<?xml version="1.0" encoding="utf-8"?>
-
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-
android:layout_width="match_parent"
-
android:layout_height="match_parent"
-
android:orientation="vertical" >
-
-
<TextView
-
android:id="@+id/expand_name"
-
android:layout_width="match_parent"
-
android:layout_height="wrap_content"
-
android:textSize="25sp"
-
>
-
</TextView>
-
-
</LinearLayout>
布局写好了后,我们在编写一个适配器
CustomExpandableAdapter.java
-
package com.example.list;
-
-
import java.util.List;
-
-
import com.example.test.R;
-
-
import android.app.Activity;
-
import android.view.Gravity;
-
import android.view.LayoutInflater;
-
import android.view.View;
-
import android.view.ViewGroup;
-
import android.widget.BaseExpandableListAdapter;
-
import android.widget.TextView;
-
-
public class CustomExpandableAdapter extends BaseExpandableListAdapter{
-
-
private List<String> groupArray;
-
private List<List<String[]>> childArray;
-
private LayoutInflater mLayoutInflater;
-
Activity activity;
-
public CustomExpandableAdapter(Activity activity, List<String> groupArray, List<List<String[]>> childArray){
-
this.activity = activity;
-
this.groupArray = groupArray;
-
this.childArray = childArray;
-
mLayoutInflater = LayoutInflater.from(activity);
-
}
-
@Override
-
public int getGroupCount() {
-
if (groupArray != null) {
-
return groupArray.size();
-
}else {
-
return 0;
-
}
-
}
-
-
@Override
-
public int getChildrenCount(int groupPosition) {
-
return childArray.get(groupPosition).size();
-
}
-
-
@Override
-
public Object getGroup(int groupPosition) {
-
return groupArray.get(groupPosition);
-
}
-
-
@Override
-
public Object getChild(int groupPosition, int childPosition) {
-
return childArray.get(groupPosition).get(childPosition)[0];
-
}
-
-
@Override
-
public long getGroupId(int groupPosition) {
-
return groupPosition;
-
}
-
-
@Override
-
public long getChildId(int groupPosition, int childPosition) {
-
return childPosition;
-
}
-
-
@Override
-
public boolean hasStableIds() {
-
return false;
-
}
-
-
@Override
-
public View getGroupView(int groupPosition, boolean isExpanded,
-
View convertView, ViewGroup parent) {
-
ViewHolder viewHolder;
-
if (convertView == null) {
-
convertView = mLayoutInflater.inflate(R.layout.custom_expanditem, null);
-
viewHolder = new ViewHolder();
-
viewHolder.name = (TextView)convertView.findViewById(R.id.expand_name);
-
viewHolder.name.setGravity(Gravity.CENTER_VERTICAL | Gravity.LEFT);
-
viewHolder.name.setPadding(60 , 0 , 0 , 0 );
-
convertView.setTag(viewHolder);
-
}else {
-
viewHolder = (ViewHolder)convertView.getTag();
-
}
-
viewHolder.name.setText(groupArray.get(groupPosition));
-
return convertView;
-
}
-
-
@Override
-
public View getChildView(int groupPosition, int childPosition,
-
boolean isLastChild, View convertView, ViewGroup parent) {
-
ViewHolder viewHolder;
-
if (convertView == null) {
-
convertView = mLayoutInflater.inflate(R.layout.custom_expanditem, null);
-
viewHolder = new ViewHolder();
-
viewHolder.name = (TextView)convertView.findViewById(R.id.expand_name);
-
viewHolder.name.setGravity(Gravity.CENTER_VERTICAL | Gravity.LEFT);
-
viewHolder.name.setPadding(60 , 0 , 0 , 0 );
-
convertView.setTag(viewHolder);
-
}else {
-
viewHolder = (ViewHolder)convertView.getTag();
-
}
-
viewHolder.name.setText(childArray.get(groupPosition).get(childPosition)[0]);
-
return convertView;
-
}
-
-
class ViewHolder{
-
TextView name;
-
}
-
-
@Override
-
public boolean isChildSelectable(int groupPosition, int childPosition) {
-
return true;
-
}
-
}
最后就是主界面功能了
-
package com.example.list;
-
-
import java.io.BufferedReader;
-
import java.io.File;
-
import java.io.FileInputStream;
-
import java.io.InputStream;
-
import java.io.InputStreamReader;
-
import java.util.ArrayList;
-
import java.util.List;
-
-
import com.example.test.R;
-
-
import android.app.Activity;
-
import android.os.Bundle;
-
import android.os.Environment;
-
import android.widget.ExpandableListView;
-
import android.widget.Toast;
-
-
public class CustomExpand extends Activity{
-
-
private List<String> groupArray;
-
private List<List<String[]>> childArray;
-
CustomExpandableAdapter adapter;
-
-
ExpandableListView listView;
-
@Override
-
protected void onCreate(Bundle savedInstanceState) {
-
super.onCreate(savedInstanceState);
-
setContentView(R.layout.customexpandablelistview);
-
groupArray = new ArrayList<String>();
-
childArray = new ArrayList<List<String[]>>();
-
ReadSelfChannel("tv.txt");
-
listView = (ExpandableListView) findViewById(R.id.expandableListView);
-
adapter = new CustomExpandableAdapter(this, groupArray, childArray);
-
listView.setAdapter(adapter);
-
}
-
-
public void ReadSelfChannel(String filename){
-
String path = null;
-
File file = null;
-
boolean sdCardExist = Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED);
-
if (sdCardExist) {
-
path = Environment.getExternalStorageDirectory()+"/"+filename;
-
file = new File(path);
-
if (!file.exists()) {
-
Toast.makeText(this, "请检查文件是否存在", Toast.LENGTH_LONG).show();
-
return;
-
}
-
}else {
-
Toast.makeText(this, "请检查SD卡是否存在", Toast.LENGTH_LONG).show();
-
return;
-
}
-
try {
-
InputStream inStream = new FileInputStream(file);
-
if (inStream != null) {
-
InputStreamReader inputreader = new InputStreamReader(inStream);
-
BufferedReader buffreader = new BufferedReader(inputreader);
-
String line;
-
String[] splitArray;
-
int lastGroup = 0;
-
while (( line = buffreader.readLine()) != null) {
-
splitArray = line.split(",");
-
if (splitArray != null && splitArray.length == 3) {
-
lastGroup = groupArray.size() - 1;
-
if (lastGroup == -1) {
-
lastGroup = 0;
-
groupArray.add(splitArray[0]);
-
}else if (groupArray.get(lastGroup).equals(splitArray[0])) {
-
//首先检测最后一个类型
-
}else {
-
lastGroup = CheckGroupName(splitArray[0]);
-
if (lastGroup == -1) {
-
groupArray.add(splitArray[0]);
-
lastGroup = groupArray.size() - 1;
-
}
-
}
-
String[] tempArray = new String[2];
-
tempArray[0] = splitArray[1];
-
tempArray[1] = splitArray[2];
-
List<String[]> temlist;
-
int size = childArray.size();
-
if (size == 0 || (size -1) < lastGroup) {
-
temlist = new ArrayList<String[]>();
-
}else {
-
temlist = childArray.get(lastGroup);
-
childArray.remove(lastGroup);
-
}
-
temlist.add(tempArray);
-
childArray.add(lastGroup, temlist);
-
}
-
}
-
buffreader.close();
-
}
-
} catch (Exception e) {
-
e.printStackTrace();
-
}
-
}
-
-
public int CheckGroupName(String name){
-
int count = groupArray.size();
-
for (int i = 0; i < count; i++) {
-
if (name.equals(groupArray.get(i))) {
-
return i;
-
}
-
}
-
return -1;
-
}
-
}
源的格式如下:
-
央视,CCTV综合,http://live.gslb.letv.com/gslb?stream_id=cctv1&tag=live&ext=m3u8&sign=live_tv
-
央视,CCTV经济,http://live.gslb.letv.com/gslb?stream_id=cctv2&tag=live&ext=m3u8&sign=live_tv
-
央视,CCTV文艺,http://live.gslb.letv.com/gslb?stream_id=cctv3&tag=live&ext=m3u8&sign=live_tv
-
央视,CCTV国际,http://live.gslb.letv.com/gslb?stream_id=cctv4&tag=live&ext=m3u8&sign=live_tv
-
央视,CCTV体育,http://live.gslb.letv.com/gslb?stream_id=cctv5_800&tag=live&ext=m3u8&sign=live_tv
-
央视,CCTV电影,http://live.gslb.letv.com/gslb?stream_id=cctv6&tag=live&ext=m3u8&sign=live_tv
-
央视,CCTV农业军事,http://live.gslb.letv.com/gslb?stream_id=cctv7&tag=live&ext=m3u8&sign=live_tv
-
卫视,河南卫视,http://live.gslb.letv.com/gslb?stream_id=henan&tag=live&ext=m3u8&sign=live_tv
-
卫视,东南卫视,http://live.gslb.letv.com/gslb?stream_id=dongnan&tag=live&ext=m3u8&sign=live_tv
-
卫视,东方卫视,http://live.gslb.letv.com/gslb?stream_id=dongfang&tag=live&ext=m3u8&sign=live_tv
-
卫视,北京卫视,http://live.gslb.letv.com/gslb?stream_id=bjws&tag=live&ext=m3u8&sign=live_tv
-
卫视,江苏卫视,http://live.gslb.letv.com/gslb?stream_id=jiangsu&tag=live&ext=m3u8&sign=live_tv
-
卫视,辽宁卫视,http://live.gslb.letv.com/gslb?stream_id=liaoning&tag=live&ext=m3u8&sign=live_tv
-
卫视,陕西卫视,http://live.gslb.letv.com/gslb?stream_id=shanxi1&tag=live&ext=m3u8&sign=live_tv
-
卫视,江西卫视,http://live.gslb.letv.com/gslb?stream_id=jiangxi&tag=live&ext=m3u8&sign=live_tv
-
卫视,甘肃卫视,http://live.gslb.letv.com/gslb?stream_id=gansu&tag=live&ext=m3u8&sign=live_tv
-
卫视,河北卫视,http://live.gslb.letv.com/gslb?stream_id=hebei&tag=live&ext=m3u8&sign=live_tv
-
乐视,乐视电影,http://live.gslb.letv.com/gslb?stream_id=letv_movie_800&tag=live&ext=m3u8&sign=live_tv
-
乐视,乐视电视剧,http://live.gslb.letv.com/gslb?stream_id=letv_tv_800&tag=live&ext=m3u8&sign=live_tv
-
乐视,乐视动漫,http://live.gslb.letv.com/gslb?stream_id=letv_comic_800&tag=live&ext=m3u8&sign=live_tv
-
乐视,乐视体育,http://live.gslb.letv.com/gslb?stream_id=letv_sports_800&tag=live&ext=m3u8&sign=live_tv
-
乐视,乐视1080p,http://live.gslb.letv.com/gslb?stream_id=letv_1080P_3000&tag=live&ext=m3u8&sign=live_tv
-
乐视,乐视文娱,http://live.gslb.letv.com/gslb?stream_id=letv_ent_800&tag=live&ext=m3u8&sign=live_tv
-
乐视,乐视音乐,http://live.gslb.letv.com/gslb?stream_id=letv_music_800&tag=live&ext=m3u8&sign=live_tv
-
其他,翡翠音乐台,rtsp://69.197.154.238/tvbm.kmj
-
其他,高清舞乐台,rtsp://69.197.154.238/dance
-
其他,台湾民族乐,rtsp://69.197.154.238/twmusic
-
其他,星音乐频道,rtsp://69.197.154.238/stars
-
其他,DVMC经典乐,rtsp://69.197.154.238/dvmc
-
其他,欧美性感乐,rtsp://69.197.154.238/6mtv.sexy.
-
其他,好莱坞大片,rtsp://69.197.154.238/hlw.ueixeyfgecvyh
-
其他,热门电影台,rtsp://69.197.154.238/max.awixeyfgecvydr
这样就完成了,非常方便。