节目单重构
在直播频道列表中,如果要让listView的itemClick事件可用,那么在Adapter中就不能设置convertView的click事件。当然在直播频道中分频道类别和频道两种数据,频道类别在adapter中可以设置click事件,频道在adapter中就不设置click事件。
所以以下代码片段去掉是很好理解的
// convertView.setOnClickListener(new View.OnClickListener() { // @Override // public void onClick(View v) { // if(item.getCategoryId() != null) { // selectChannelId = item.getChannelId(); // notifyDataSetChanged(); // } // } // });
要实现这个效果,另外在adapter中添加一个方法。当itemclick事件发生时调用。
public void onItemSelected(int position) { Logger.v(TAG, "@onItemSelected. position >> " + position); if (itemList.get(position) instanceof ChannelItemData) { ChannelItemData item = (ChannelItemData)itemList.get(position); if(item == null) return; if(item.getCategoryId() != null) { selectChannelId = item.getChannelId(); notifyDataSetChanged(); } } }
在TvChannelListFragment中,实现itemclick方法
@Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { Logger.v(TAG, "@onItemClick. position >> " + position); // 使用PullToRefreshListView后,position为0表示headerView // 真正的数据项要从1开始计数。 Object object = channelAdapter.getItem(position - 1); if (object instanceof ChannelItemData) { ChannelItemData item = ((ChannelItemData) object); if (item.isTV() || item.isRadio()) { TvChannelExtra extra = new TvChannelExtra(); extra.setChannelId(item.getChannelId()); extra.setChannelIconURL(item.getIcon()); extra.setChannelName(item.getName()); extra.setEpgAPIURL(item.getEpgApi()); extra.setLiveURL(item.getLiveUrl()); extra.setIconURL(item.getIcon()); extra.setServerTime(channel.getServerTime()); extra.setDiffTime(channel.getServerTime() - localTime); tvProgramFragment.onChannelChanged(item, extra); } } channelAdapter.onItemSelected(position - 1); }
其中最后一行代码调用了adapter中后来加上的那个方法。
在onItemClick方法中有个tvProgramFragment,要获取TvProgramFragment的实例引用,最好是通过setTvProgramFragment方法来设定进来。最早的办法是在TvProgramFragment中添加static类型的变量thiz,然后在其他Fragment中引用,虽然可行,但应该尽量避免使用static变量。
public void setTvProgramFragment(TvProgramListFragment tvProgramFragment) { this.tvProgramFragment = tvProgramFragment; }
看电视这里先告段落,继续完成云看看之筛选包括UI和功能
实现展现顶部横排的栏目列表方案(1)
每个item都是一个布局,宽度有最小值,宽度跟栏目名称个数有关系,底部有个单色粗横线标记当前item处于选中状态,没有选中时粗横线就不显示出来。
使用系统自带图片编辑工具打开效果图,使用取色工具获取颜色,在编辑颜色中查看,获取颜色值:R:110,G:191,B:0;即R:6E,G:BF,B:00.
粗横线标识选中颜色:#6EBF00
标题栏背景色:#80C200
未选中文字颜色:#172800
选中文字颜色:#80C200
分割线颜色:#6EBF00
筛选按钮背景色:#DCE2D0
顶部栏目分类菜单栏完成,代码片段如下所示
每个菜单项都定义在一个布局中
item_vod_category_menu.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="vertical"> <TextView android:id="@+id/name" android:minWidth="100dp" android:layout_width="wrap_content" android:paddingLeft="10dp" android:paddingRight="10dp" android:background="@color/default_bg" android:gravity="center" android:textSize="18sp" android:layout_height="50dp"/> <TextView android:id="@+id/selectLine" android:layout_width="match_parent" android:layout_height="3dp" android:visibility="invisible" android:background="#6EBF00"/> </LinearLayout>
在布局文件中使用ScrollView来放置菜单项
<LinearLayout android:id="@+id/categoryLayout" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@color/default_bg" android:orientation="horizontal" > <ScrollView android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:background="@color/default_bg" > <LinearLayout android:id="@+id/categorys" android:layout_width="match_parent" android:layout_height="53dp" android:layout_margin="0dp" android:background="@color/default_bg" android:orientation="horizontal" android:padding="0dp" /> </ScrollView> <RelativeLayout android:layout_width="wrap_content" android:layout_height="match_parent" > <Button android:id="@+id/filter" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true" android:layout_marginLeft="10dp" android:layout_marginRight="10dp" android:paddingLeft="5dp" android:paddingRight="5dp" android:text="筛选" android:textColor="#172800" android:textSize="18sp" /> </RelativeLayout> </LinearLayout>
代码实现
private void initializeCategoryView(final VideoGroupData data) { final View view = inflater.inflate(R.layout.item_vod_category_menu, null); final TextView name = (TextView)view.findViewById(R.id.name); final TextView selectLine = (TextView)view.findViewById(R.id.selectLine); name.setText(data.getTitle()); name.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { selectLine.setVisibility(View.VISIBLE); name.setTextColor(Color.parseColor("#80C200")); notifyCategoryChanged(view); contentLayout.removeAllViews(); addCategoryVideos(data.getData()); } }); categorysLayout.addView(view); vodMap.put(view, data); } private void notifyCategoryChanged(View view) { Iterator<View> views = vodMap.keySet().iterator(); View v = null; TextView name = null; TextView selectLine = null; while(views.hasNext()) { v = views.next(); name = (TextView)v.findViewById(R.id.name); selectLine = (TextView)v.findViewById(R.id.selectLine); if(v != view) { name.setTextColor(Color.parseColor("#172800")); selectLine.setVisibility(View.INVISIBLE); } } }