开发笔记:2013.11.19

节目单重构

在直播频道列表中,如果要让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);
        }
    }
}


你可能感兴趣的:(开发笔记)