仿今日頭條的頻道管理

前言
做了一個仿今日頭條的頻道管理,雖然用別人寫好的庫,但是真正想去實現時發現了不少問題

  • 如何把上面的TabLayout和下面的Viewpager關聯起來
  • 當點擊添加時如何保存信息(下次進入時添加的頻道仍然存在)
  • 如何加載不同的數據(根據什麼來判斷)
    用到的第三方
maven { url "https://jitpack.io" }
 compile  'com.github.andyoom:draggrid:v1.0.1'

到這就可以來寫自己的思路了。
佈局

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="test.bawei.com.pindaoguanli.MainActivity">
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="40dp"
        android:orientation="horizontal">

        <android.support.design.widget.TabLayout
            android:layout_weight="1"
            android:id="@+id/tab"
            android:layout_width="match_parent"
            android:layout_height="40dp"
            app:tabMode="scrollable"
            app:tabSelectedTextColor="#f00"
            xmlns:app="http://schemas.android.com/apk/res-auto"
            app:tabPadding="5dp"></android.support.design.widget.TabLayout>
        <Button
            android:id="@+id/btn"
            android:layout_width="40dp"
            android:layout_height="40dp"
            android:text="添"/>
    </LinearLayout>

</RelativeLayout>

也很簡單只是實現Tablayout和添加的按鈕

在MainActivity裏面幾個重點部分:註釋已經很詳細了無非就是兩種情況的判斷:點擊添加頻道管理的按鈕和沒有點擊頻道管理的按鈕,而有沒有點擊頻道的按鈕又有兩個要處理:在Viewpager加載多少個fragment和給Tablayout設置幾個標題,最後只要把所有數據都保存到SharedPreferences裏。

 private void LoadData() {

            list = new ArrayList<>();
            initDat1a();
    //        創建Fragmnet對象
            String str = sp.getString(TAB_DATA_KEY,null);
            if(str==null){
                for(int i=0;i<tabList.size();i++){
                    list.add(new Myfragment());
                }
            }else{
    //            當我們點擊添加數據時通過解析保存的值來創建Fragmnet對象
                List<ChannelBean> listAll= new Gson().fromJson(str, new TypeToken<List<ChannelBean>>() {
                }.getType());
                for(int i = 0;i<listAll.size();i++){
                    if (listAll.get(i).isSelect()){
                        list.add(new Myfragment());
                    }

                }
            }
    //將Viewpager和Tablayout綁定
            viewpage = new Viewpage(getSupportFragmentManager(),list);
            pager.setAdapter(viewpage);
            tabLayout.setTabMode(TabLayout.MODE_SCROLLABLE);
            tabLayout.setupWithViewPager(pager);
    //通過判斷來個tablayout加載標題(點擊按鈕和未點擊按鈕)

            if(str==null){
                for(int i=0;i<tabList.size();i++){
                    tabLayout.getTabAt(i).setText(tabList.get(i).getName());
                }
            }else {
                List<ChannelBean> listAll= new Gson().fromJson(str, new TypeToken<List<ChannelBean>>() {}.getType());
                for(int i = 0;i<listAll.size();i++){
                    if (listAll.get(i).isSelect()==true)
                        tabLayout.getTabAt(i).setText(listAll.get(i).getName());
                }
            }
        }

另外就是加載不同數據的問題:我是通過適配器用bundle把position傳過去通過位置來加載不同的頁面。
到這難點就解決了下面貼一下所有代碼方便理解

item

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">
    <ListView
        android:id="@+id/list"
        android:layout_width="match_parent"
        android:layout_height="match_parent"></ListView>
</LinearLayout>

item_list

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:orientation="vertical"
    android:layout_height="match_parent">
    <TextView
        android:id="@+id/titles"
        android:text="GGGGGGGGGGGGGGGGGGGGGGGGGGG"
        android:gravity="center"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        />
    <ImageView
        android:id="@+id/imgs"
        android:layout_width="match_parent"
        android:layout_height="120dp"
        android:background="@mipmap/ic_launcher"/>

</LinearLayout>

MainActivity

public class MainActivity extends AppCompatActivity implements View.OnClickListener{
    private TabLayout tabLayout;

    private Button button;
    private ViewPager pager;
    private List<Fragment> list;
    private Viewpage viewpage;
    private final  String TAB_DATA_KEY = "TabJson";
    private List<ChannelBean> tabList;
    private SharedPreferences sp;
    private List<ChannelBean>  tabListAll = new ArrayList<>();
    private String jsonbeans;
    List<String> urlList;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
//使用SharedPreferences來存儲記憶值
        sp = getSharedPreferences(TAB_DATA_KEY,MODE_PRIVATE);

        tabLayout = (TabLayout)findViewById(R.id.tab);
        pager = (ViewPager)findViewById(R.id.page);
        button = (Button)findViewById(R.id.btn);
        button.setOnClickListener(this);
        LoadData();
    }

        private void LoadData() {

            list = new ArrayList<>();
            initDat1a();
    //        創建Fragmnet對象
            String str = sp.getString(TAB_DATA_KEY,null);
            if(str==null){
                for(int i=0;i<tabList.size();i++){
                    list.add(new Myfragment());
                }
            }else{
    //            當我們點擊添加數據時通過解析保存的值來創建Fragmnet對象
                List<ChannelBean> listAll= new Gson().fromJson(str, new TypeToken<List<ChannelBean>>() {
                }.getType());
                for(int i = 0;i<listAll.size();i++){
                    if (listAll.get(i).isSelect()){
                        list.add(new Myfragment());
                    }

                }
            }
    //將Viewpager和Tablayout綁定
            viewpage = new Viewpage(getSupportFragmentManager(),list);
            pager.setAdapter(viewpage);
            tabLayout.setTabMode(TabLayout.MODE_SCROLLABLE);
            tabLayout.setupWithViewPager(pager);
    //通過判斷來個tablayout加載標題(點擊按鈕和未點擊按鈕)

            if(str==null){
                for(int i=0;i<tabList.size();i++){
                    tabLayout.getTabAt(i).setText(tabList.get(i).getName());
                }
            }else {
                List<ChannelBean> listAll= new Gson().fromJson(str, new TypeToken<List<ChannelBean>>() {}.getType());
                for(int i = 0;i<listAll.size();i++){
                    if (listAll.get(i).isSelect()==true)
                        tabLayout.getTabAt(i).setText(listAll.get(i).getName());
                }
            }
        }

    @Override
    public void onClick(View v) {
//        對點擊按鈕的判斷,如果沒有添加頻道則使用tabList裏面的默認數據 否則從SharedPreferences取出
        LoadData();
        String string = sp.getString(TAB_DATA_KEY, null);
        if(string==null){
            ChannelActivity.startChannelActivity(MainActivity.this,tabList);
        }else{
            ChannelActivity.startChannelActivity(MainActivity.this,string);
        }
    }

    private void initDat1a() {
//        裝要添加的頻道true表示默認添加false表示點擊頻道後選擇要加入
        tabList = new ArrayList<>();
        tabList.add(new ChannelBean("推薦",true));
        tabList.add(new ChannelBean("熱點",true));
        tabList.add(new ChannelBean("北京",true));
        tabList.add(new ChannelBean("社會",true));
        tabList.add(new ChannelBean("頭條",true));
        tabList.add(new ChannelBean("看點",true));
        tabList.add(new ChannelBean("體育",true));

        tabList.add(new ChannelBean("關注",false));
        tabList.add(new ChannelBean("育兒",false));
        tabList.add(new ChannelBean("購物",false));
        tabList.add(new ChannelBean("分享",false));
        tabList.add(new ChannelBean("NBA",false));
        tabList.add(new ChannelBean("樂視",false));
    }
//重寫回調監聽的方法
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if(requestCode== ChannelActivity.REQUEST_CODE&&resultCode==ChannelActivity.RESULT_CODE)
        {
            jsonbeans = data.getStringExtra(ChannelActivity.RESULT_JSON_KEY);
            //保存
            sp.edit().putString(TAB_DATA_KEY,jsonbeans).commit();
            //一定要寫在commit的下面
            LoadData();
            Log.e("requestCode","requestCode="+jsonbeans);
        }
    }


    @Override
    public void onWindowFocusChanged(boolean hasFocus) {
        super.onWindowFocusChanged(hasFocus);
        if (hasFocus && Build.VERSION.SDK_INT >= 19) {
            View decorView = getWindow().getDecorView();
            decorView.setSystemUiVisibility(
                    View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                            | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
                            | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                            | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
                            | View.SYSTEM_UI_FLAG_FULLSCREEN
                            | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);
        }
    }

Myfragment

@ContentView(R.layout.item)
public class Myfragment extends Fragment {
    @ViewInject(R.id.list)
    private ListView listview;
    private String path;
    private List<User.ListBean> list;
    private MyAdaper adaper;

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view =x.view().inject(this,inflater,container);
        list=new ArrayList<>();
        Bundle bundle = getArguments();
        int name = bundle.getInt("name");
        path="http://wangyi.butterfly.mopaasapp.com/news/api?type=war&limit=30&page="+name;
        adaper = new MyAdaper();
        listview.setAdapter(adaper);
        getDate();
        return view;
    }class MyAdaper extends BaseAdapter{

        @Override
        public int getCount() {
            return list.size();
        }

        @Override
        public Object getItem(int position) {
            return list.get(position);
        }

        @Override
        public long getItemId(int position) {
            return position;
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            convertView=View.inflate(getActivity(),R.layout.item_list,null);
          TextView title= (TextView) convertView.findViewById(R.id.titles);
            ImageView img= (ImageView) convertView.findViewById(R.id.imgs);

            title.setText(list.get(position).getTitle());
            x.image().bind(img,list.get(position).getImgurl());
            return convertView;
        }
    }









    private void getDate() {
        RequestParams params = new RequestParams(path);
        x.http().get(params, new Callback.CacheCallback<String>() {

            @Override
            public void onSuccess(String result) {
                Gson gson = new Gson();
                User user = gson.fromJson(result, User.class);
                list.addAll(user.getList());
                adaper.notifyDataSetChanged();
            }

            @Override
            public void onError(Throwable ex, boolean isOnCallback) {

            }

            @Override
            public void onCancelled(CancelledException cex) {

            }

            @Override
            public void onFinished() {

            }

            @Override
            public boolean onCache(String result) {
                return false;
            }
        });

    }
}

ViewPager

public class Viewpage extends FragmentPagerAdapter {
    private List<Fragment> list;
    public Viewpage(FragmentManager fm,List<Fragment> list) {
        super(fm);
        this.list = list;
    }
    @Override
    public Fragment getItem(int position) {
//        把位置傳過去
        Bundle bundle = new Bundle();
       bundle.putInt("name",position+1);
        list.get(position).setArguments(bundle);
        return list.get(position);
    }
    @Override
    public int getCount() {
        return list.size();
    }
}

我用了Xutils3.0所以別忘了導入依賴庫和網絡權限
效果如圖
這裏寫圖片描述
這裏寫圖片描述

發佈了55 篇原創文章 · 獲贊 38 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章