注意:
1. 在app的gradle里面
com.github.andyoom:draggrid:v1.0.1
2.在项目的build.gradle中添加
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
这个是 minSdkVersion 15
效果图:
下面开始贴代码
MainActivity(主界面进行相关操作)
import android.content.Intent; import android.os.AsyncTask; import android.support.design.widget.TabLayout; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentTransaction; import android.support.v4.view.ViewPager; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.text.TextUtils; import android.view.View; import android.widget.Button; import com.andy.library.ChannelActivity; import com.andy.library.ChannelBean; import com.example.lixin.xiangmu1zhoukao3.bean.ComicInfo; import com.example.lixin.xiangmu1zhoukao3.database.DbUtils; import com.example.lixin.xiangmu1zhoukao3.utils.StreamTools; import com.google.gson.Gson; import com.google.gson.reflect.TypeToken; import com.nostra13.universalimageloader.core.DisplayImageOptions; import java.io.InputStream; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; import java.util.ArrayList; import java.util.List; public class MainActivity extends AppCompatActivity implements View.OnClickListener { private TabLayout tabLayout; private ViewPager viewPager; private String[] titles = {"推荐", "热点", "北京", "时尚", "科技", "体育", "娱乐", "汽车", "房产", "漫画"}; private DbUtils dbUtils; private ArrayList<ChannelBean> allList; private ArrayList<ChannelBean> userList; private MyPageAdapter adapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initView(); initData(); tabLayout.setupWithViewPager(viewPager); } 给tablayout赋值 private void initData() { allList = new ArrayList<>(); userList = new ArrayList<>(); dbUtils = new DbUtils(this); List<ChannelBean> allChannels = dbUtils.getAllChannels(); if (allChannels == null||allChannels.size()<1){ ChannelBean channelBean; for (int i = 0;i<10;i++){ if (i<5){ channelBean = new ChannelBean(titles[i],true); userList.add(channelBean); }else { channelBean = new ChannelBean(titles[i],false); } allList.add(channelBean); } dbUtils.saveChnnels(allList); }else { allList.addAll(allChannels); List<ChannelBean> userChannels = dbUtils.getUserChannels(); userList.addAll(userChannels); } adapter = new MyPageAdapter(getSupportFragmentManager(),userList); viewPager.setAdapter(adapter); } private void initView() { tabLayout = (TabLayout) findViewById(R.id.tablayout); viewPager = (ViewPager) findViewById(R.id.viewpager); Button btn_pindao = (Button) findViewById(R.id.btn_pindao); btn_pindao.setOnClickListener(this); } @Override public void onClick(View v) { switch (v.getId()){ case R.id.btn_pindao: ChannelActivity.startChannelActivity(MainActivity.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); if (TextUtils.isEmpty(stringExtra)){ return; }else { List<ChannelBean> list = new Gson().fromJson(stringExtra,new TypeToken<List<ChannelBean>>(){}.getType()); if (list==null||list.size()<1){ return; } allList.clear(); userList.clear(); allList.addAll(list); for (ChannelBean channelBean : list){ boolean select = channelBean.isSelect(); if (select){ userList.add(channelBean); } } adapter.notifyDataSetChanged(); dbUtils.clearChannels(); dbUtils.saveChnnels(allList); FragmentManager supportFragmentManager = getSupportFragmentManager(); List<Fragment> fragments = supportFragmentManager.getFragments(); FragmentTransaction fragmentTransaction = supportFragmentManager.beginTransaction(); for (Fragment fragment:fragments) { fragmentTransaction.remove(fragment); } fragmentTransaction.commitAllowingStateLoss(); recreate(); } } } }
MyApplication(加载图片 并在配置文件中配置)
import android.app.Application;
import com.nostra13.universalimageloader.core.ImageLoader;
import com.nostra13.universalimageloader.core.ImageLoaderConfiguration;
/**
* Created by hua on 2017/8/18.
*/
public class MyApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(this)
.memoryCacheExtraOptions(480,800)//配置内存缓存图片的尺寸
//.diskCacheExtraOptions() bug 不推介你手动去配置
.memoryCacheSize(2 * 1024 * 1024)//配置内存缓存的大小 例如 : 2* 1024 * 1024 = 2MB
.threadPoolSize(3)//配置加载图片的线程数
.threadPriority(100)//配置线程的优先级
.build();//配置构建完成
ImageLoader.getInstance().init(config);
}
}
MyPageAdapter(得到值并返回对应的fragment 防止fragment和tablayout 错乱)
import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentPagerAdapter; import com.andy.library.ChannelBean; import java.util.ArrayList; /** * Created by hua on 2017/8/18. */ public class MyPageAdapter extends FragmentPagerAdapter { private FragmentManager mFragmentManager; ArrayList<ChannelBean> mUserList; public MyPageAdapter(FragmentManager fm, ArrayList<ChannelBean> userList) { super(fm); mFragmentManager = fm; mUserList = userList; } @Override public Fragment getItem(int position) { String name = mUserList.get(position).getName(); switch (name) { case "推荐": return new ComicFragment(); case "热点": return new ComicFragment(); case "北京": return new ComicFragment(); case "时尚": return new ComicFragment(); case "科技": return new ComicFragment(); case "体育": return new ComicFragment(); case "娱乐": return new ComicFragment(); case "汽车": return new ComicFragment(); case "房产": return new ComicFragment(); case "漫画": return new ComicFragment(); } return null; } @Override public int getCount() { return mUserList == null ? 0 : mUserList.size(); } //ViewPager与TabLayout绑定后,这里获取到PageTitle就是Tab的Text //设置tablayout的每个tab的标题 @Override public CharSequence getPageTitle(int position) { return mUserList.get(position).getName(); } }
Fragment(fragment中请求数据)
import android.content.Intent; import android.os.AsyncTask; import android.os.Bundle; import android.support.annotation.Nullable; import android.support.v4.app.Fragment; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.BaseAdapter; import android.widget.ImageView; import android.widget.ListView; import android.widget.TextView; import com.example.lixin.xiangmu1zhoukao3.bean.ComicInfo; import com.example.lixin.xiangmu1zhoukao3.utils.StreamTools; import com.google.gson.Gson; import com.nostra13.universalimageloader.core.DisplayImageOptions; import com.nostra13.universalimageloader.core.ImageLoader; import java.io.InputStream; import java.net.HttpURLConnection; import java.net.URL; import java.util.List; /** * Created by hua on 2017/8/18. */ public class ComicFragment extends Fragment { private View view; private ListView listView; private DisplayImageOptions options; @Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { view = inflater.inflate(R.layout.comic_fragment,container,false); return view; } @Override public void onActivityCreated( Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); initData(); listView = (ListView) view.findViewById(R.id.listview); options = new DisplayImageOptions.Builder() .cacheInMemory(true) .cacheOnDisk(true) .showImageOnLoading(R.mipmap.ic_launcher) .build(); } private void initData() { new AsyncTask<String, Void, String>() { @Override protected void onPostExecute(String s) { super.onPostExecute(s); if (s!=null){ Gson gson = new Gson(); ComicInfo comicInfo = gson.fromJson(s, ComicInfo.class); final List<ComicInfo.DataBean.ComicsBean> data = comicInfo.getData().getComics(); MyBaseAdapter adapter = new MyBaseAdapter(data); listView.setAdapter(adapter); listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { Intent intent = new Intent(getActivity(),LastActivity.class); intent.putExtra("label_text",data.get(position).getLabel_text()); startActivity(intent); } }); } } @Override protected String doInBackground(String... params) { try { String path = params[0]; URL url = new URL(path); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setRequestMethod("GET"); connection.setConnectTimeout(5000); connection.setReadTimeout(5000); int code = connection.getResponseCode(); if (code == 200){ InputStream is = connection.getInputStream(); String json = StreamTools.readFrom(is); return json; } } catch (Exception e) { e.printStackTrace(); } return null; } }.execute("http://api.kkmh.com/v1/daily/comic_lists/0?since=0&gender=0&sa_event=eyJwcm9qZWN0Ijoia3VhaWthbl9hcHAiLCJ0aW1lIjoxNDg3NzQyMjQwNjE1LCJwcm9wZXJ0aWVzIjp7IkhvbWVwYWdlVGFiTmFtZSI6IueDremXqCIsIlZDb21tdW5pdHlUYWJOYW1lIjoi54Ot6ZeoIiwiJG9zX3ZlcnNpb24iOiI0LjQuMiIsIkdlbmRlclR5cGUiOiLlpbPniYgiLCJGcm9tSG9tZXBhZ2VUYWJOYW1lIjoi54Ot6ZeoIiwiJGxpYl92ZXJzaW9uIjoiMS42LjEzIiwiJG5ldHdvcmtfdHlwZSI6IldJRkkiLCIkd2lmaSI6dHJ1ZSwiJG1hbnVmYWN0dXJlciI6ImJpZ25veCIsIkZyb21Ib21lcGFnZVVwZGF0ZURhdGUiOjAsIiRzY3JlZW5faGVpZ2h0IjoxMjgwLCJIb21lcGFnZVVwZGF0ZURhdGUiOjAsIlByb3BlcnR5RXZlbnQiOiJSZWFkSG9tZVBhZ2UiLCJGaW5kVGFiTmFtZSI6IuaOqOiNkCIsImFidGVzdF9ncm91cCI6MTEsIiRzY3JlZW5fd2lkdGgiOjcyMCwiJG9zIjoiQW5kcm9pZCIsIlRyaWdnZXJQYWdlIjoiSG9tZVBhZ2UiLCIkY2FycmllciI6IkNoaW5hIE1vYmlsZSIsIiRtb2RlbCI6IlZQaG9uZSIsIiRhcHBfdmVyc2lvbiI6IjMuNi4yIn0sInR5cGUiOiJ0cmFjayIsImRpc3RpbmN0X2lkIjoiQTo2YWRkYzdhZTQ1MjUwMzY1Iiwib3JpZ2luYWxfaWQiOiJBOjZhZGRjN2FlNDUyNTAzNjUiLCJldmVudCI6IlJlYWRIb21lUGFnZSJ9"); } class MyBaseAdapter extends BaseAdapter{ private List<ComicInfo.DataBean.ComicsBean> data; private MyBaseAdapter(List<ComicInfo.DataBean.ComicsBean> data){ this.data = data; } @Override public int getCount() { return data.size(); } @Override public Object getItem(int position) { return data.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) { ViewHolder holder = null; ViewHolder1 holder1 = null; switch (getItemViewType(position)){ case 0: if (convertView == null){ convertView = View.inflate(getActivity(),R.layout.item,null); holder = new ViewHolder(); holder.tv = (TextView) convertView.findViewById(R.id.item_tv); holder.iv = (ImageView) convertView.findViewById(R.id.item_iv); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } holder.tv.setText(data.get(position).getTitle()); ImageLoader.getInstance().displayImage(data.get(position).getCover_image_url(),holder.iv,options); break; case 1: if (convertView == null){ convertView = View.inflate(getActivity(),R.layout.item1,null); holder1 = new ViewHolder1(); holder1.tv1 = (TextView) convertView.findViewById(R.id.item1_tv); holder1.iv1 = (ImageView) convertView.findViewById(R.id.item1_iv); convertView.setTag(holder1); } else { holder1 = (ViewHolder1) convertView.getTag(); } holder1.tv1.setText(data.get(position).getTitle()); ImageLoader.getInstance().displayImage(data.get(position).getCover_image_url(),holder1.iv1,options); break; } return convertView; } class ViewHolder{ TextView tv; ImageView iv; } class ViewHolder1{ TextView tv1; ImageView iv1; } } }
Sqlite(创建数据库)
import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; /** * Created by hua on 2017/8/16. */ public class Sqlite extends SQLiteOpenHelper { public Sqlite(Context context) { super(context, "drap.db", null, 1); } @Override public void onCreate(SQLiteDatabase db) { db.execSQL("create table drap(_id Integer primary key autoincrement,name varchar(20),isSelect Integer(20))"); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { } }
DbUtils(数据库增删改查)
import android.content.ContentValues; import android.content.Context; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import com.andy.library.ChannelBean; import java.util.ArrayList; import java.util.List; /** * Created by hua on 2017/8/16. */ public class DbUtils { private final SQLiteDatabase db; private ChannelBean channelBean; public DbUtils(Context context){ Sqlite sqlite = new Sqlite(context); db = sqlite.getWritableDatabase(); } public void saveChnnels(List<ChannelBean> channelBeanList) { if (channelBeanList == null || channelBeanList.size() < 0) { return; } for (ChannelBean channelBean : channelBeanList) { ContentValues values = new ContentValues(); values.put("name", channelBean.getName()); values.put("isSelect", channelBean.isSelect()); db.insert("drap", null, values); } } public List<ChannelBean> getAllChannels() { Cursor cursor = db.query("drap", null, null, null, null, null, null); List<ChannelBean> channelBeanList = new ArrayList<>(); ChannelBean channelBean; while (cursor.moveToNext()) { String name = cursor.getString(cursor.getColumnIndex("name")); int selected = cursor.getInt(cursor.getColumnIndex("isSelect")); channelBeanList.add(new ChannelBean(name, selected == 0 ? false : true)); } cursor.close(); return channelBeanList; } public List<ChannelBean> getUserChannels() { Cursor cursor = db.query("drap", null, "isSelect=?", new String[]{"1"}, null, null, null); List<ChannelBean> channelBeanList = new ArrayList<>(); ChannelBean channelBean; while (cursor.moveToNext()) { String name = cursor.getString(cursor.getColumnIndex("name")); int selected = cursor.getInt(cursor.getColumnIndex("isSelect")); channelBeanList.add(new ChannelBean(name, selected == 0 ? false : true)); } cursor.close(); return channelBeanList; } public void clearChannels() { db.delete("drap", null, null); } }
manifest(配置文件)
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.lixin.xiangmu1zhoukao3"> <uses-permission android:name="android.permission.INTERNET"/> <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"/> <application android:name=".MyApplication" android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/AppTheme"> <activity android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name="com.andy.library.ChannelActivity"> </activity> <activity android:name=".LastActivity"> </activity> </application> </manifest>