仿今日头条的频道管理
仿今日头条的频道管理
这里集成了第三方的库:
1. 在app的gradle里面dependencies下配置
compile 'com.github.andyoom:draggrid:v1.0.1'
2.在项目的build.gradle中的allprojects下添加
maven {url "https://jitpack.io"}
3.权限
<!-- 在SDCard中创建与删除文件权限 -->
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
<!-- 往SDCard写入数据权限 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<!-- 震动权限 -->
<uses-permission android:name="android.permission.VIBRATE"/>
4.在功能清单中配置ChannelActivity
<activity android:name="com.andy.library.ChannelActivity"></activity>
配置完成,之后再代码中调用依赖库的方法:
ChannelActivity.startChannelActivity("上下文",集合);
调用这个方法就可以跳到频道管理页面,依赖库中还实现了:我的频道中可以长按拖动变位置,点击删除到更多频道,更多频道中点击添加到我的频道中,等功能。
然后通过onActivityResult()方法拿到频道管理中的数据,具体的请求码,结果码,打开相应的依赖库文件,ChannelActivity中有定义。
效果图如下:
接下来做一个简单的项目,来使用一下这个频道管理功能
将要完成的页面布局:
这个页面中,标题是一个TabLayout,Tablayout最右边的下箭头可以点击,跳转到频道管理界面,正文部分是Viewpager,实现TabLayout标题和Viewpager中的Fragment一一关联,频道管理中的我的频道内容会展示到Tablayout中,做到频道管理和tablayout关联,Viepager内容也随着变化
使用TabLayout要添加依赖:com.android.support:design (com.android.support:design:26.0.0-alpha1)
MainActivity类
你会看到我下面的代码中集合用到到的泛型是ChannelBean,这是频道管理依赖库中已经写好的类,配置好,直接用就可以
创建数据库保存频道管理中的内容,第一次数据没有内容,会默认添加数据,当数据库中有内容就会使用数据库中存储的内容
public class MainActivity extends AppCompatActivity implements View.OnClickListener { private String[] tabTitles={"推荐","热点","杭州","时尚","科技","体育","娱乐","军事","财经","汽车","房产","社会","情感","女人","旅游","健康","美女","游戏","数码"}; private List<ChannelBean> allList; private List<ChannelBean> userList; private ViewPager viewpager; private MyViewpageAdapter myViewpageAdapter; private SQLiteDao dao; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); TabLayout tabLayout = (TabLayout) findViewById(R.id.tablayout); ImageView loadMorePindao = (ImageView) findViewById(R.id.loadMorePindao); TextView showTv = (TextView) findViewById(R.id.showTv); viewpager = (ViewPager) findViewById(R.id.viewpager); initData(); //tablayout和viewpager关联起来 tabLayout.setupWithViewPager(viewpager); showTv.setOnClickListener(this); loadMorePindao.setOnClickListener(this); } private void initData(){ dao = new SQLiteDao(this); allList=new ArrayList<>(); userList=new ArrayList<>(); ArrayList<ChannelBean> allpindao = dao.findPindao(); if (allpindao==null||allpindao.size()<1){ ChannelBean channelBean; for (int i=0;i<19;i++){ if (i<8){ channelBean= new ChannelBean(tabTitles[i], true); userList.add(channelBean); }else{ channelBean=new ChannelBean(tabTitles[i],false); } allList.add(channelBean); } dao.addPindao(allpindao); }else{ allList.addAll(allpindao); ArrayList<ChannelBean> userPindao = dao.findUserPindao(); userList.addAll(userPindao); } myViewpageAdapter = new MyViewpageAdapter(getSupportFragmentManager(),userList); viewpager.setAdapter(myViewpageAdapter); } @Override public void onClick(View v) { switch (v.getId()){ case R.id.showTv: CityListActivity.startCityActivityForResult(this); break; case R.id.loadMorePindao: ChannelActivity.startChannelActivity(this,allList); break; } } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode==ChannelActivity.REQUEST_CODE&&resultCode==ChannelActivity.RESULT_CODE){ String stringExtra = data.getStringExtra(ChannelActivity.RESULT_JSON_KEY); Gson gson = new Gson(); List<ChannelBean> list= gson.fromJson(stringExtra, new TypeToken<List<ChannelBean>>() { }.getType()); allList.clear(); userList.clear(); allList.addAll(list); for (ChannelBean lists:list) { if (lists.isSelect()){ userList.add(lists); } } myViewpageAdapter.notifyDataSetChanged(); dao.deletePindao(); dao.addPindao(allList); //可能会在添加频道,删除频道,频道位置变化是,tablayout标题内容,与framgnet显示的内容不相符了,这时候就要得到 fragment管理者,将fragment都移除掉,在重新添加 FragmentManager supportFragmentManager = getSupportFragmentManager(); List<Fragment> fragments = supportFragmentManager.getFragments(); FragmentTransaction fragmentTransaction = supportFragmentManager.beginTransaction(); for (Fragment fragment:fragments) { fragmentTransaction.remove(fragment); } fragmentTransaction.commitAllowingStateLoss(); recreate(); } } }
数据库类
public class SQLite extends SQLiteOpenHelper { public SQLite(Context context) { super(context,"pindao.db", null, 1); } @Override public void onCreate(SQLiteDatabase db) { db.execSQL("create table pindao(name varchar(20),selected integer)"); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { } }
数据库具体操作类
public class SQLiteDao { private final SQLiteDatabase db; public SQLiteDao(Context context){ SQLite sqLite = new SQLite(context); db = sqLite.getWritableDatabase(); } public void addPindao(List<ChannelBean> channelBeanList){ for (ChannelBean channelBean:channelBeanList) { ContentValues values = new ContentValues(); values.put("name",channelBean.getName()); values.put("selected",channelBean.isSelect()); db.insert("pindao",null,values); } } public ArrayList<ChannelBean> findPindao(){ Cursor cursor = db.query("pindao", null, null, null, null, null, null); ArrayList<ChannelBean> list = new ArrayList<>(); while (cursor.moveToNext()){ String name = cursor.getString(cursor.getColumnIndex("name")); int selected = cursor.getInt(cursor.getColumnIndex("selected")); ChannelBean channelBean = new ChannelBean(name,selected==0?false:true); list.add(channelBean); } return list; } public ArrayList<ChannelBean> findUserPindao(){ Cursor cursor = db.query("pindao", null,"selected=?",new String[]{"1"}, null, null, null); ArrayList<ChannelBean> channelBeens = new ArrayList<>(); while (cursor.moveToNext()){ String name = cursor.getString(cursor.getColumnIndex("name")); int selected = cursor.getInt(cursor.getColumnIndex("selected")); ChannelBean channelBean = new ChannelBean(name, selected == 0 ? false : true); channelBeens.add(channelBean); } return channelBeens; } public void deletePindao(){ db.delete("pindao",null,null); }
Adapter类
public class MyViewpageAdapter extends FragmentPagerAdapter { private List<ChannelBean> tabTitles; public MyViewpageAdapter(FragmentManager fm, List<ChannelBean> tabTitles) { super(fm); this.tabTitles=tabTitles; } @Override public Fragment getItem(int position) { MyFragment myFragment = new MyFragment(); Bundle bundle = new Bundle(); bundle.putString("text",tabTitles.get(position).getName()); myFragment.setArguments(bundle); return myFragment; } @Override public int getCount() { return tabTitles.size(); } @Override public CharSequence getPageTitle(int position) { return tabTitles.get(position).getName(); } }
Fragment类
public class MyFragment extends Fragment { private View view; private ListView lv; @Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { view = inflater.inflate(R.layout.myfragment, container, false); return view; } //使用的xutils3 @Override public void onActivityCreated(@Nullable Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); lv = (ListView) view.findViewById(R.id.lv); String url="http://api.kkmh.com/v1/daily/comic_lists/0"; RequestParams requestParams = new RequestParams(url); requestParams.addQueryStringParameter("since","0"); requestParams.addQueryStringParameter("gender","0"); x.http().get(requestParams, new Callback.CommonCallback<String>() { @Override public void onSuccess(String result) { Gson gson = new Gson(); Data data = gson.fromJson(result, Data.class); List<Data.DataBean.ComicsBean> comics = data.getData().getComics(); MyAdapter adapter = new MyAdapter(comics); lv.setAdapter(adapter); } @Override public void onError(Throwable ex, boolean isOnCallback) { } @Override public void onCancelled(CancelledException cex) { } @Override public void onFinished() { } }); } class MyAdapter extends BaseAdapter{ private List<Data.DataBean.ComicsBean> comics; public MyAdapter(List<Data.DataBean.ComicsBean> comics) { this.comics=comics; } @Override public int getCount() { return comics.size(); } @Override public Object getItem(int position) { return comics.get(position); } @Override public long getItemId(int position) { return position; } @Override public int getViewTypeCount() { return 2; } @Override public int getItemViewType(int position) { if (position%2==0){ return 0; }else{ return 1; } } @Override public View getView(int position, View convertView, ViewGroup parent) { int type = getItemViewType(position); ViewHolder holder=null; ViewHolder2 holder2=null; switch (type){ case 0: if (convertView==null){ convertView=convertView.inflate(getActivity(),R.layout.listview_item1,null); holder=new ViewHolder(); holder.textView= (TextView) convertView.findViewById(R.id.showText1); holder.image= (ImageView) convertView.findViewById(R.id.showImage1); convertView.setTag(holder); }else{ holder= (ViewHolder) convertView.getTag(); } break; case 1: if (convertView==null){ convertView=convertView.inflate(getActivity(),R.layout.listview_item2,null); holder2=new ViewHolder2(); holder2.textView= (TextView) convertView.findViewById(R.id.showText2); holder2.image= (ImageView) convertView.findViewById(R.id.showImage2); convertView.setTag(holder2); }else{ holder2= (ViewHolder2) convertView.getTag(); } break; } switch (type){ case 0: holder.textView.setText(comics.get(position).getTitle()); getImage(comics.get(position).getCover_image_url(),holder.image); break; case 1: holder2.textView.setText(comics.get(position).getTitle()); getImage(comics.get(position).getCover_image_url(),holder2.image); break; } return convertView; } } class ViewHolder{ private TextView textView; private ImageView image; } class ViewHolder2{ private TextView textView; private ImageView image; } private void getImage(String path,ImageView imageView){ DisplayImageOptions options=new DisplayImageOptions.Builder() .cacheInMemory(true) .cacheOnDisk(true) .build(); ImageLoader.getInstance().displayImage(path,imageView,options); } }