仿新浪热门微博页面动态添加Tab标签与Fragment联动的实现

大概与新浪热门微博相似我就照着写了,自我感觉很好用,趁公司的人都在测试就给大家分享一下咯。

效果如下图:

 

 

使用控件:HorizontalScrollView和ViewPager

 

代码如下:

xml:

 

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity">

    <HorizontalScrollView
        android:id="@+id/sv"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:scrollbars="none">

        <LinearLayout
            android:id="@+id/ly"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal"></LinearLayout>
    </HorizontalScrollView>

    <TextView
        android:layout_width="match_parent"
        android:layout_height="2dp"
        android:background="#bdbdbd" />

    <android.support.v4.view.ViewPager
        android:id="@+id/viewpager"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</LinearLayout>

 

 

Activity(注意看注释)

 

public class MainActivity extends FragmentActivity {
    private HorizontalScrollView sv;
    private ViewPager vp;
    private TextView tv;
    private LinearLayout ly;
    private FragmentAdapter mFragmentAdapter;
    private CommonFragment fragment;
    private List<String> tabel;
    private List<TextView> tvList;
    private List<Fragment> fList;
    private Drawable drawableLeft;
    private Drawable drawableRight;
    /**
     * ViewPager的当前选中页
     */
    private int currentIndex;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        sv= (HorizontalScrollView) findViewById(R.id.sv);
        vp = (ViewPager) findViewById(R.id.viewpager);
        ly = (LinearLayout) findViewById(R.id.ly);
        drawableLeft = getResources().getDrawable(R.mipmap.ico_arrow_right);
        drawableRight = getResources().getDrawable(R.mipmap.ico_arrow_left);
        drawableLeft.setBounds(0, 0, drawableLeft.getMinimumWidth(), drawableLeft.getMinimumHeight()); //设置边界
        drawableRight.setBounds(0, 0, drawableRight.getMinimumWidth(), drawableRight.getMinimumHeight()); //设置边界
        getTabel();


    }

    //得到标签
    public void getTabel() {
        tabel = new ArrayList<>();
        tvList = new ArrayList<>();
        for (int i = 0; i < 20; i++) {
            tabel.add("测试" + i);
        }
        // TODO 这里记得判断获得标签的数目不为0才可以获得textview和fragment,此处数据模拟,动态获取需加判断
        for (int i = 0; i < tabel.size(); i++) {
            tv = new TextView(this);
            tv.setText(tabel.get(i));
            tv.setTextSize(16);
            tv.setPadding(35, 15, 35, 15);
            tv.setGravity(Gravity.CENTER);
            tv.setTextColor(0xff333333);
            ly.addView(tv);
            tvList.add(tv);
            final int finalI = i;
            tv.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    change(tvList.get(finalI));
                    vp.setCurrentItem(finalI);
                }
            });
        }
        //得到fragment
        getFragment(tabel.size());
    }

    public void getFragment(int num) {
        fList = new ArrayList<>();
        for (int i = 0; i < num; i++) {
            fragment = new CommonFragment();
            Bundle bundle = new Bundle();
            bundle.putString("content", tabel.get(i));
            fragment.setArguments(bundle);
            fList.add(fragment);
        }
        mFragmentAdapter = new FragmentAdapter(
                this.getSupportFragmentManager(), fList);
        vp.setAdapter(mFragmentAdapter);
        vp.setCurrentItem(0);
        vp.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            /**
             * state滑动中的状态 有三种状态(0,1,2) 1:正在滑动 2:滑动完毕 0:什么都没做。
             */
            @Override
            public void onPageScrollStateChanged(int state) {

            }

            /**
             * position :当前页面,及你点击滑动的页面 offset:当前页面偏移的百分比
             * offsetPixels:当前页面偏移的像素位置
             */
            @Override
            public void onPageScrolled(int position, float offset,
                                       int offsetPixels) {

                /**
                 * 利用currentIndex(当前所在页面)和position(下一个页面)以及offset来
                 * 设置mTabLineIv的左边距 滑动场景:
                 * 记3个页面,
                 * 从左到右分别为0,1,2
                 * 0->1; 1->2; 2->1; 1->0
                 */


            }

            @Override
            public void onPageSelected(int position) {
                change(tvList.get(position));
                sv.requestChildFocus(tvList.get(position),tvList.get(position));
            }
        });
        change(tvList.get(0));
    }


    /**
     * 重置颜色
     */
    private void change(TextView v) {
        restoreTabs();
        v.setCompoundDrawables(drawableLeft, null, drawableRight, null);
        v.setCompoundDrawablePadding(16);
        v.setTextColor(0xffda1a17);

    }
    private void restoreTabs() {
        for (int i = 0; i <tvList.size() ; i++) {
            tvList.get(i).setTextColor(0xff333333);
            tvList.get(i).setCompoundDrawables(null, null, null, null);
        }
    }
}

 

 

 

其实代码已经很全了,如果还有不懂得或者想偷懒的可以直接去这里下载http://download.csdn.net/detail/ccstar1/9526141。最后说一个刚刚优化的问题吧,就是当类似edittext和button同时出现的时候,先编辑edittext再点击button时候发现软键盘还在,那么在点击button的监听里加上InputMethodManager imm =(InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);  imm.hideSoftInputFromWindow(mEditText.getWindowToken(), 0);  就ok啦!大家不要怪我下载那个需要一个积分,只是平时我要下载其他的老要积分,攒点好下载,嘿嘿,如果想下载没积分可以私信我,到时候给你发。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值