//梯形变化
package com.xm1.ykmoni; import android.animation.Animator; import android.animation.AnimatorListenerAdapter; import android.animation.ObjectAnimator; import android.content.Intent; import android.graphics.Color; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.util.DisplayMetrics; import android.view.View; import android.widget.TextView; public class MainActivity extends AppCompatActivity implements View.OnClickListener { private int i = 0; private int widthPixels; private int heightPixels; private Tixing tixing; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); findViewById(R.id.jia).setOnClickListener(this); tixing = findViewById(R.id.tixing01); //用DisplayMetrics获取屏幕宽高 DisplayMetrics displayMetrics = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(displayMetrics); //赋值 widthPixels = displayMetrics.widthPixels; heightPixels = displayMetrics.heightPixels; } //点击添加 @Override public void onClick(View view) { switch (view.getId()) { case R.id.jia: final TextView textView = new TextView(MainActivity.this); textView.setText("" + i); textView.setHeight(heightPixels / 30); //宽为屏幕宽度的三分之一 textView.setWidth(widthPixels / 3); //根据数值展示不同的数据 if (i % 3 == 0) { textView.setBackgroundColor(Color.RED); } else if (i % 3 == 1) { textView.setBackgroundColor(Color.GREEN); } else { textView.setBackgroundColor(Color.BLUE); } tixing.addView(textView); pydonghua(textView); //长按条目删除 textView.setOnLongClickListener(new View.OnLongClickListener() { @Override public boolean onLongClick(View v) { donghua(v, (TextView) v); return true; } }); //点击跳转 textView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { TextView v1 = (TextView) v; String s = v1.getText().toString(); int nums = Integer.parseInt(s); Bundle bundle = new Bundle(); bundle.putInt("num", nums); Intent intent = new Intent(MainActivity.this, NewsActivity.class); intent.putExtras(bundle); startActivity(intent); } }); i++; break; } } //添加动画 private void pydonghua(View v) { //平移 ObjectAnimator translationX = ObjectAnimator.ofFloat(v, "translationX", -800, 0); //动画时间 translationX.setDuration(1000); //执行动画 translationX.start(); } //删除动画 private void donghua(View v, final TextView textView) { //透明 ObjectAnimator alpha = ObjectAnimator.ofFloat(v, "alpha", new float[]{1f, 0}); alpha.setDuration(2000); alpha.start(); alpha.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { tixing.removeView(textView); } }); } }
package com.xm1.ykmoni; import android.content.Context; import android.util.AttributeSet; import android.view.View; import android.view.ViewGroup; /** * Created by on 2018-05-30. */ public class Tixing extends ViewGroup{ private int measuredWidth; public Tixing(Context context) { super(context); } public Tixing(Context context, AttributeSet attrs) { super(context, attrs); } public Tixing(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); measuredWidth = getMeasuredWidth(); //测量子View的宽高,只有ViewFroup中有这个方法,直接继承自View是没有这个方法的 measureChildren(widthMeasureSpec,heightMeasureSpec); } @Override protected void onLayout(boolean b, int i, int i1, int i2, int i3) { //拿到子控件的个数 int childCount = getChildCount(); //定义一个临时高度 int startHeight=0; int startWidth=0; //循环遍历出每一个View for(int a=0;a<childCount;a++){ View v = getChildAt(a); //给每一个view设置自己的位置 左 上 右 下 v.layout(startWidth, startHeight, startWidth + v.getMeasuredWidth(), startHeight + v.getMeasuredHeight()); startHeight += v.getMeasuredHeight(); startWidth += v.getMeasuredWidth(); //判断,当控件宽度大于或等于屏幕宽度时控件宽度归零 if (startWidth>=measuredWidth) { startWidth=0; } } } }
//xrecyclerview
package com.xm1.ykmoni; import android.app.AlertDialog; import android.content.DialogInterface; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.LinearLayoutManager; import android.widget.Toast; import com.google.gson.Gson; import com.jcodecraeer.xrecyclerview.XRecyclerView; import com.xm1.ykmoni.adapter.XrvAdapter; import com.xm1.ykmoni.bean.News; import com.xm1.ykmoni.db.NewsDao; import com.xm1.ykmoni.util.NetUtil; import com.xm1.ykmoni.util.OkHttpUtils; import java.util.ArrayList; import java.util.List; public class NewsActivity extends AppCompatActivity { private XRecyclerView news_xrv; private int pages = 0; private String url = "http://ttpc.dftoutiao.com/jsonpc/refresh?type=" + (5010 + pages); private OkHttpUtils okHttpUtils; private int operType = 0; private List<News.DataBean> lists = new ArrayList<>(); private XrvAdapter xrvAdapter; private NewsDao newsDao; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_news); Bundle bundle = getIntent().getExtras(); int num = bundle.getInt("num"); pages=num; url="http://ttpc.dftoutiao.com/jsonpc/refresh?type=" + (5010 + pages); okHttpUtils = OkHttpUtils.getOkHttpUtils(); newsDao = new NewsDao(this); initView(); initXrv(); requestNetData(); } private void requestNetData() { if (NetUtil.isConn(this)) { okHttpUtils.getJson(url, new OkHttpUtils.MOkHttp() { @Override public void onResponse(String json) { //处理json串得到合法的json串 String s = getJsonByString(json); //如果是第一页的数据就存入 if (pages==0){ newsDao.addData(url, s); } //json解析并展示数据 showData(s); } }); } else { Toast.makeText(NewsActivity.this, "当前无网络,请联网重试", Toast.LENGTH_SHORT).show(); //没有网,根据url查询数据库 String s = newsDao.queryData(url); //未缓存的url不进行解析展示 if (!s.isEmpty()) { showData(s); } } } private String getJsonByString(String json) { String s1 = json.substring(5); String s2 = s1.substring(0, s1.length() - 1); return s2; } private void showData(String s) { Gson gson = new Gson(); News news = gson.fromJson(s, News.class); List<News.DataBean> data = news.getData(); if (operType == 0) { lists.clear(); } lists.addAll(data); setAdapter(); } private void setAdapter() { if (xrvAdapter == null) { xrvAdapter = new XrvAdapter(NewsActivity.this, lists); news_xrv.setAdapter(xrvAdapter); } else { xrvAdapter.notifyDataSetChanged(); } //条目删除 xrvAdapter.setOnItemClickListener(new XrvAdapter.OnItemClickListener() { @Override public void removeItem(final int position) { // Toast.makeText(NewsActivity.this, "点击了" + position, Toast.LENGTH_SHORT).show(); AlertDialog.Builder builder = new AlertDialog.Builder(NewsActivity.this); builder.setTitle("删除"); builder.setMessage("是否删除?"); builder.setPositiveButton("是", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { lists.remove(position); // xrvAdapter.notifyItemRemoved(position); // xrvAdapter.notifyItemRangeChanged(position,lists.size()-position); xrvAdapter.notifyDataSetChanged(); //删除同时根据url } }); builder.setNegativeButton("否", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { Toast.makeText(NewsActivity.this, "取消了", Toast.LENGTH_SHORT).show(); } }); AlertDialog alertDialog = builder.create(); alertDialog.show(); } }); } private void initXrv() { news_xrv.setPullRefreshEnabled(true); news_xrv.setLoadingMoreEnabled(true); news_xrv.addItemDecoration(new SimpleDividerDecoration(this)); news_xrv.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false)); news_xrv.setLoadingListener(new XRecyclerView.LoadingListener() { @Override public void onRefresh() { pages = 0; operType = 0; url = "http://ttpc.dftoutiao.com/jsonpc/refresh?type=" + (5010 + pages); requestNetData(); news_xrv.refreshComplete(); } @Override public void onLoadMore() { operType = 1; pages++; url = "http://ttpc.dftoutiao.com/jsonpc/refresh?type=" + (5010 + pages); requestNetData(); news_xrv.loadMoreComplete(); } }); } private void initView() { news_xrv = (XRecyclerView) findViewById(R.id.news_xrv); } }
package com.xm1.ykmoni.adapter; import android.content.Context; import android.support.v7.widget.RecyclerView; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.TextView; import com.nostra13.universalimageloader.core.DisplayImageOptions; import com.nostra13.universalimageloader.core.ImageLoader; import com.xm1.ykmoni.R; import com.xm1.ykmoni.bean.News; import java.util.List; /** * author:Created by YangYong on 2018/5/30 0030. */ public class XrvAdapter extends RecyclerView.Adapter { private Context context; private List<News.DataBean> list; private final DisplayImageOptions options; private View view2; private View view1; private ThreeViewHolder holder2; private OneViewHolder holder1; public XrvAdapter(Context context, List<News.DataBean> list) { this.context = context; this.list = list; options = new DisplayImageOptions.Builder() .cacheOnDisk(true) .build(); } @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { if (viewType == 1) { view2 = View.inflate(context, R.layout.item2, null); holder2 = new ThreeViewHolder(view2); return holder2; } else { view1 = View.inflate(context, R.layout.item1, null); holder1 = new OneViewHolder(view1); return holder1; } } @Override public void onBindViewHolder(final RecyclerView.ViewHolder holder, final int position) { // Log.d("old",position+""); // int position1 = holder.getLayoutPosition(); // Log.d("new",position+""); News.DataBean bean = list.get(position); if (holder instanceof OneViewHolder) { holder1 = (OneViewHolder) holder; holder1.item1_title.setText(bean.getBrief()); String src = bean.getMiniimg().get(0).getSrc(); ImageLoader.getInstance().displayImage(src, holder1.item1_img, options); } else { holder2 = (ThreeViewHolder) holder; holder2.item2_title.setText(bean.getBrief()); String s1 = bean.getMiniimg().get(0).getSrc(); String s2 = bean.getMiniimg().get(1).getSrc(); String s3 = bean.getMiniimg().get(2).getSrc(); ImageLoader.getInstance().displayImage(s1, holder2.item2_img1, options); ImageLoader.getInstance().displayImage(s2, holder2.item2_img2, options); ImageLoader.getInstance().displayImage(s3, holder2.item2_img3, options); } holder.itemView.setOnLongClickListener(new View.OnLongClickListener() { @Override public boolean onLongClick(View v) { if (onItemClickListener != null) { // int layoutPosition = holder.getLayoutPosition(); onItemClickListener.removeItem(position); } return true; } }); } @Override public int getItemCount() { return list.size(); } @Override public int getItemViewType(int position) { int size = list.get(position).getMiniimg().size(); if (size == 3) { return 1; } else { return 0; } } class OneViewHolder extends RecyclerView.ViewHolder { private final TextView item1_title; private final ImageView item1_img; public OneViewHolder(View itemView) { super(itemView); item1_title = view1.findViewById(R.id.item1_title); item1_img = view1.findViewById(R.id.item1_img); } } class ThreeViewHolder extends RecyclerView.ViewHolder { private final TextView item2_title; private final ImageView item2_img1; private final ImageView item2_img2; private final ImageView item2_img3; public ThreeViewHolder(View itemView) { super(itemView); item2_title = view2.findViewById(R.id.item2_title); item2_img1 = view2.findViewById(R.id.item2_img1); item2_img2 = view2.findViewById(R.id.item2_img2); item2_img3 = view2.findViewById(R.id.item2_img3); } } //定义接口 public interface OnItemClickListener { void removeItem(int position); } private OnItemClickListener onItemClickListener; public void setOnItemClickListener(OnItemClickListener onItemClickListener) { this.onItemClickListener = onItemClickListener; } }
public class NetUtil { public static boolean isConn(Context context){ boolean bisConnFlag=false; ConnectivityManager conManager = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo network = conManager.getActiveNetworkInfo(); if(network!=null){ bisConnFlag=conManager.getActiveNetworkInfo().isAvailable(); } return bisConnFlag; } }
//ok封装
package com.xm1.ykmoni.util; import android.os.Handler; import java.io.IOException; import okhttp3.Call; import okhttp3.Callback; import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.Response; /** * author:Created by YangYong on 2018/5/29 0029. * 单例模式,接口,handlder */ public class OkHttpUtils { private static OkHttpClient httpClient; private static Handler handler; private static OkHttpUtils okHttpUtils = null; private static MOkHttp mOkHttp; private static ImageOkHttp imageOkHttp; //构造方法 private OkHttpUtils() { httpClient = new OkHttpClient.Builder().build(); handler = new Handler(); } //提供get方法 public static OkHttpUtils getOkHttpUtils() { if (okHttpUtils == null) { okHttpUtils = new OkHttpUtils(); } return okHttpUtils; } //定义接口,将请求到的json串传递出去 public interface MOkHttp { void onResponse(String json); } //请求图片 public interface ImageOkHttp { void onResponse(byte[] bytes); } //使用handler,使接口调用发生在主线程 private static void runUi(final String json) { handler.post(new Runnable() { @Override public void run() { if (mOkHttp != null) { mOkHttp.onResponse(json); } } }); } //重写,处理bitmap private void runUi(final byte[] bytes) { handler.post(new Runnable() { @Override public void run() { if (imageOkHttp != null) { imageOkHttp.onResponse(bytes); } } }); } //请求数据的公共方法 public void getJson(String url, MOkHttp mOkHttp) { this.mOkHttp = mOkHttp; Request request = new Request.Builder().url(url).build(); httpClient.newCall(request).enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { } @Override public void onResponse(Call call, Response response) throws IOException { String string = response.body().string(); //请求成功时调用定义好的方法,切换线程 runUi(string); } }); } //请求网络,获得bitmap数据 public void getBitmap(String url, ImageOkHttp imageOkHttp) { this.imageOkHttp = imageOkHttp; Request request = new Request.Builder().url(url).build(); httpClient.newCall(request).enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { } @Override public void onResponse(Call call, Response response) throws IOException { byte[] bytes = response.body().bytes(); // Bitmap bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.length); //请求成功时调用定义好的方法,切换线程 runUi(bytes); } }); } }
//数据库
package com.xm1.ykmoni.db; import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; /** * author:Created by YangYong on 2018/5/31 0031. */ public class MyHelper extends SQLiteOpenHelper { public MyHelper(Context context) { super(context, "mydb", null, 1); } @Override public void onCreate(SQLiteDatabase db) { db.execSQL("create table news (id integer primary key autoincrement,path text,jsondata text)"); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { } }
package com.xm1.ykmoni.db; import android.content.ContentValues; import android.content.Context; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; /** * author:Created by YangYong on 2018/5/31 0031. */ public class NewsDao { private MyHelper myHelper; private SQLiteDatabase db; public NewsDao(Context context) { myHelper = new MyHelper(context); db = myHelper.getWritableDatabase(); } public void addData(String url, String data) { //先进行删除 db.delete("news", " path=?", new String[]{url}); ContentValues contentValues = new ContentValues(); contentValues.put("path", url); contentValues.put("jsondata", data); //进行插入 long rows = db.insert("news", null, contentValues); } public String queryData(String url) { String json = ""; //得到一个可读可写的数据库 // SQLiteDatabase db = helper.getWritableDatabase(); Cursor cursor = db.query("news", null, " path=?", new String[]{url}, null, null, null); while (cursor.moveToNext()) { json = cursor.getString(cursor.getColumnIndex("jsondata")); } return json; } }