频道栏目
首页 > 程序开发 > 软件开发 > 其他 > 正文
自定义view+属性动画+XRecyclerView+ok+mvp
2018-06-01 02:24:17      个评论      
收藏   我要投稿

自定义view+属性动画+XRecyclerView+ok+mvp。

1.要加的权限




2.要加的依赖

implementation 'com.jcodecraeer:xrecyclerview:1.5.9'
implementation 'com.squareup.okhttp3:logging-interceptor:3.10.0'
implementation 'com.squareup.okhttp3:okhttp:3.10.0'
implementation 'com.google.code.gson:gson:2.8.5'

implementation 'com.github.bumptech.glide:glide:4.7.1'
annotationProcessor 'com.github.bumptech.glide:compiler:4.7.1'
要加的代码解决版本的冲突
configurations.all {
 resolutionStrategy.eachDependency { DependencyResolveDetails details ->
  def requested = details.requested
  if (requested.group == 'com.android.support') {
if (!requested.name.startsWith("multidex")) {
 details.useVersion '27.1.1'
}
  }
 }
}
4 xml布局
activity_main


 

activity_thresscolor


news_item2_layout



 


 

  


 



news_item_layout




 

 

  
  
  

 



utils

OkhttpUtils  网络请求框架
public class OkhttpUtils {
 private static OkhttpUtils okhttpUtils;
 private OkHttpClient okHttpClient;
 private Handler handler;

 private OkhttpUtils() {
  okHttpClient = new OkHttpClient.Builder()
 .addInterceptor(new HttpLoggingInterceptor().setLevel(HttpLoggingInterceptor.Level.BODY))
 .build();
  handler = new Handler();

 }

 public static OkhttpUtils getInstance() {

  if (okhttpUtils == null) {
okhttpUtils = new OkhttpUtils();
  }

  return okhttpUtils;

 }

 /**
  * get方式
  */
 public void getData(String url, final ICallback callback){

  final Request request = new Request.Builder()
 .url(url).build();

  okHttpClient.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {

 if (callback!=null){
  handler.post(new Runnable() {
@Override
public void run() {
 callback.fail("请求失败");
}
  });

 }

}

@Override
public void onResponse(Call call, Response response) throws IOException {

 if (callback!=null){
  if (response.isSuccessful()&&response.code()==200){

final String result = response.body().string();


handler.post(new Runnable() {
 @Override
 public void run() {
  callback.success(result);
 }
});
  }
 }
}
  });
 }
 /**
  * post方式
  */
 public void postData(String url, Map params, final ICallback callback){

  FormBody.Builder builder = new FormBody.Builder();

  for (Map.Entry bean : params.entrySet()) {
builder.add(bean.getKey(),bean.getValue());
  }
  final Request request = new Request.Builder()
 .url(url).post(builder.build()).build();

  okHttpClient.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {

 if (callback!=null){
  handler.post(new Runnable() {
@Override
public void run() {
 callback.fail("请求失败");
}
  });

 }

}

@Override
public void onResponse(Call call, Response response) throws IOException {

 if (callback!=null){
  if (response.isSuccessful()&&response.code()==200){

final String result = response.body().string();


handler.post(new Runnable() {
 @Override
 public void run() {
  callback.success(result);
 }
});
  }
 }
}
  });
 }
 public interface ICallback{
  void success(String result);
  void fail(String msg);
 }

}

NetWorkUtil网络判断
public class NetWorkUtil {

 /**
  *
  * @return 是否有活动的网络连接
  */
 public final static boolean hasNetWorkConnection(Context context){
  //获取连接活动管理器
  final ConnectivityManager connectivityManager= (ConnectivityManager) context.
 getSystemService(Context.CONNECTIVITY_SERVICE);
  //获取链接网络信息
  final NetworkInfo networkInfo=connectivityManager.getActiveNetworkInfo();

  return (networkInfo!= null && networkInfo.isAvailable());

 }
 /**
  * @return 返回boolean ,是否为wifi网络
  *
  */
 public final static boolean hasWifiConnection(Context context)
 {
  final ConnectivityManager connectivityManager= (ConnectivityManager) context.
 getSystemService(Context.CONNECTIVITY_SERVICE);
  final NetworkInfo networkInfo=connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
  //是否有网络并且已经连接
  return (networkInfo!=null&& networkInfo.isConnectedOrConnecting());


 }

 /**
  * @return 返回boolean,判断网络是否可用,是否为移动网络
  *
  */

 public final static boolean hasGPRSConnection(Context context){
  //获取活动连接管理器
  final ConnectivityManager connectivityManager= (ConnectivityManager) context.
 getSystemService(Context.CONNECTIVITY_SERVICE);
  final NetworkInfo networkInfo=connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
  return (networkInfo!=null && networkInfo.isAvailable());

 }
 /**
  * @return  判断网络是否可用,并返回网络类型,ConnectivityManager.TYPE_WIFI,ConnectivityManager.TYPE_MOBILE,不可用返回-1
  */
 public static final int getNetWorkConnectionType(Context context){
  final ConnectivityManager connectivityManager=(ConnectivityManager) context.
 getSystemService(Context.CONNECTIVITY_SERVICE);
  final NetworkInfo wifiNetworkInfo=connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
  final NetworkInfo mobileNetworkInfo=connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);


  if(wifiNetworkInfo!=null &&wifiNetworkInfo.isAvailable())
  {
return ConnectivityManager.TYPE_WIFI;
  }
  else if(mobileNetworkInfo!=null &&mobileNetworkInfo.isAvailable())
  {
return ConnectivityManager.TYPE_MOBILE;
  }
  else {
return -1;
  }


 }

}

AppUtil自定义view获取屏幕大小的
public class AppUtil {
 /**
  *
  * @param context
  * @return 屏幕宽度
  */
 public static int screenWidth(Context context){
  DisplayMetrics metrics = context.getResources().getDisplayMetrics();
  return  metrics.widthPixels;
 }
}

common

Constants
public class Constants {
 public static final String GET_URL = "https://ttpc.dftoutiao.com/jsonpc/refresh";

 public static final  int TYPE1 = 3;//条目是三张图
 public static final  int TYPE2 = 1;//条目是1张图

}
bean 
LocalNews
public class LocalNews {
 public String title;
 public String imgurls;
 public String source;
 public String time;
 public boolean isDel;
}

News
public class News {
 public String stat;
 public List data;

 public class Data {
  public String topic;
  public String source;
  public List miniimg;

  public class IMG {
public String src;
  }
 }
}

view
INews
public interface INews {
 void success(News news);
}

MainActivity
public class MainActivity extends AppCompatActivity implements INews {

 private XRecyclerView rv;
 private NewsPresenter presenter;
 private int page = 5010;
 private List data;
 private boolean isRefresh = true;//判断是下啦刷新还是上啦加载
 private NewsAdapter newsAdapter;
 private DbHelper dbHelper;

 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  initView();
  initData();
 }

 private void initData() {
  if (getIntent().getExtras() != null) {
page = 5010 + Integer.parseInt(getIntent().getExtras().getString("id"));
  }

  dbHelper = new DbHelper(this);
  presenter = new NewsPresenter(this);
  data = new ArrayList<>();

  request();

 }

 public void request() {
  if (NetWorkUtil.hasWifiConnection(this) || NetWorkUtil.hasGPRSConnection(this)) {

Map p = new HashMap<>();
p.put("type", page + "");
presenter.getData(Constants.GET_URL, p);
  } else {
Toast.makeText(this, "网络不通畅,请稍后再试!", Toast.LENGTH_SHORT).show();
String json = null;
//
//获取数据库对象,可读
SQLiteDatabase db = dbHelper.getReadableDatabase();
//获取数据库的游标
Cursor cursor = db.rawQuery("select * from news", null);
while (cursor.moveToNext()){
 json = cursor.getString(cursor.getColumnIndex("json"));
}

//本地列表刷新
fillLocalData(json);

  }

 }

 /**
  * 本地列表刷新
  * @param json
  */
 private void fillLocalData(String json) {

  News news = new Gson().fromJson(json,News.class);
  newsAdapter = new NewsAdapter(news.data, this,news);
  rv.setAdapter(newsAdapter);

 }

 private void initView() {
  rv = findViewById(R.id.rv);

  //设置局部刷新动画
  rv.setItemAnimator(new DefaultItemAnimator());

  rv.setPullRefreshEnabled(true);//刷新配置
  rv.setLoadingMoreEnabled(true);//上拉配置
  rv.setLayoutManager(new LinearLayoutManager(this));
  rv.setLoadingListener(new XRecyclerView.LoadingListener() {
@Override
public void onRefresh() {

// rv.refreshComplete();
 isRefresh = true;
 //下拉刷新
 page = 5010;
 request();


}

@Override
public void onLoadMore() {

 isRefresh = false;
 page++;
 request();

// rv.loadMoreComplete();

}
  });

 }

 @Override
 public void success(News news) {

  //转换json串
  String json = new Gson().toJson(news);



  System.out.println("size:" + news.data.size());




  data = news.data;

  if (isRefresh) {
newsAdapter = new NewsAdapter(data, this,news);
rv.setAdapter(newsAdapter);
rv.refreshComplete();

//保存json串数据
SQLiteDatabase db = dbHelper.getWritableDatabase();
ContentValues contentValues = new ContentValues();
contentValues.put("json", json);
db.insert(DbHelper.NEWS_TABLE_NAME, null, contentValues);



  } else {
if (newsAdapter != null) {
 //上啦加载更多,刷新
 newsAdapter.loadMore(news.data);
}
rv.loadMoreComplete();
  }


 }

 @Override
 protected void onDestroy() {
  super.onDestroy();
  presenter.detach();
 }
}
ThreeColorActivity自定义view
public class ThreeColorActivity extends AppCompatActivity {

 private ThreeColorView threeColorView;
 private int count = 0;

 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_threecolor);
  threeColorView = findViewById(R.id.threecolorview);
 }

 /**
  * 添加view
  * @param view
  */
 public void add(View view) {
  count++;

  int width = AppUtil.screenWidth(this);
  TextView textView = new TextView(this);
  textView.setText(count+"");
  textView.setGravity(Gravity.CENTER);
  textView.setTextColor(getResources().getColor(R.color.white));

  ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(textView,"translationX",(width-width/3),0);

  objectAnimator.setDuration(3000);
  objectAnimator.start();
  if (count==1||count==4||count==7){

textView.setBackgroundColor(getResources().getColor(R.color.colorAccent));
  }else{
textView.setBackgroundColor(getResources().getColor(R.color.colorPrimaryDark));
  }



  threeColorView.addView(textView);

  //得到view的属性参数
  ViewGroup.LayoutParams params = textView.getLayoutParams();
  params.width = width/3;
  params.height = 70;
  textView.setLayoutParams(params);

 }
}
widget

ThreeColorView

public class ThreeColorView extends ViewGroup {

 public ThreeColorView(Context context) {
  super(context);
 }

 public ThreeColorView(Context context, AttributeSet attrs) {
  super(context, attrs);
 }

 public ThreeColorView(Context context, AttributeSet attrs, int defStyleAttr) {
  super(context, attrs, defStyleAttr);
 }

 /**
  * 把此view的最终的宽度和高度定下来
  *
  * @param widthMeasureSpec
  * @param heightMeasureSpec
  */
 @Override
 protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
  super.onMeasure(widthMeasureSpec, heightMeasureSpec);
  int totalHeight = 0;//此控件的高度
  int totalWidth = 0;//此控件的宽度
  //得到子view数量
  int child = getChildCount();
  if (child > 0) {
for (int i = 0; i < child; i++) {//遍历子控件
 View view = getChildAt(i);//得到此容器所有的子view
 totalHeight += view.getMeasuredHeight();
 measureChild(view,widthMeasureSpec,heightMeasureSpec);
// view.measure(widthMeasureSpec, heightMeasureSpec);
}
  }
  totalWidth = AppUtil.screenWidth(getContext());
  System.out.println("width:"+totalWidth);
  System.out.println("height:"+totalHeight);


  //设置宽度和高度给当前view,通过下面这个方法
  setMeasuredDimension(totalWidth, totalHeight);

 }

 @Override
 protected void onLayout(boolean bo, int left, int top, int right, int bottom) {

  int l = 0;
  int t = 0;
  int r = 0;
  int b = 0;

  int childCount = getChildCount();
  for (int i = 0; i < childCount; i++) {

View view = getChildAt(i);//得到每一个view的对象

view.layout(l, t, l + view.getMeasuredWidth(), t + view.getMeasuredHeight());

l += view.getMeasuredWidth();

System.out.println("llll:"+l);

t += view.getMeasuredHeight();

if (l+view.getMeasuredWidth()>AppUtil.screenWidth(getContext())){
 l = 0;
}


//if (AppUtil.screenWidth(getContext()) - l < view.getMeasuredWidth()) {
// l = 0;
//}

//点击事件
final int finalI = i;
view.setOnClickListener(new OnClickListener() {
 @Override
 public void onClick(View view) {

  Toast.makeText(getContext(), finalI +":点击位置", Toast.LENGTH_SHORT).show();

  TextView textView = (TextView) view;

  Toast.makeText(getContext(), textView.getText().toString() +"文本", Toast.LENGTH_SHORT).show();

  Intent intent = new Intent(getContext(), MainActivity.class);
  intent.putExtra("id",textView.getText().toString());
  getContext().startActivity(intent);

 }
});

view.setOnLongClickListener(new OnLongClickListener() {
 @Override
 public boolean onLongClick(View view) {
  Toast.makeText(getContext(), finalI +":长按位置", Toast.LENGTH_SHORT).show();

  removeView(view);
  return true;
 }
});



  }


 }
}
db

DbHelper 数据库

public class DbHelper extends SQLiteOpenHelper {
 //数据库文件名称
 private static final String DB_NAME = "news.db";
 public static final String NEWS_TABLE_NAME = "news";
 private static final int VERSION = 1;

 public DbHelper(Context context) {
  super(context, DB_NAME, null, VERSION);
 }

 @Override
 public void onCreate(SQLiteDatabase sqLiteDatabase) {

  String sql = "create table " + NEWS_TABLE_NAME + " (_id Integer PRIMARY KEY ,json text)";

  sqLiteDatabase.execSQL(sql);

 }

 @Override
 public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {



 }
}

adapter

NewsPresenter 适配器,多条目
public class NewsPresenter {

 private INews iNews;
 private NewsModel model;

 public NewsPresenter(INews iNews) {

  model = new NewsModel();
  attach(iNews);
 }

 /**
  * 绑定view
  * @param iNews
  */
 public void attach(INews iNews){
  this.iNews = iNews;
 }
 /**
  * 获取数据的方法
  *
  * @param getUrl
  */
 public void getData(String getUrl, Map params) {

  model.getData(getUrl, params,new NewsModel.ResponseCallback() {
@Override
public void success(String result) {
 if (!TextUtils.isEmpty(result)) {
  String s = result.replace("null(","")
 .replace(")","");

  News news = new Gson().fromJson(s, News.class);
  iNews.success(news);
 }
}

@Override
public void fail(String msg) {


}
  });

//  OkhttpUtils.getInstance().getData(getUrl, new OkhttpUtils.ICallback() {
//@Override
//public void success(String result) {
//
//}
//
//@Override
//public void fail(String msg) {
//
//}
//  });
 }

 /**
  * 解绑
  */
 public void detach(){
  this.iNews = null;
 }
}
model

NewsModel

public class NewsModel {

 /**
  * 请求数据
  * @param getUrl
  */
 public void getData(String getUrl, Map params,final ResponseCallback responseCallback) {

  OkhttpUtils.getInstance().postData(getUrl,params, new OkhttpUtils.ICallback() {
@Override
public void success(String result) {
 responseCallback.success(result);

}

@Override
public void fail(String msg) {

 responseCallback.fail(msg);
}
  });
 }

 public interface  ResponseCallback{
  void success(String result);
  void fail(String msg);
 }
}
presenter
NewsPresenter 
public class NewsPresenter {

 private INews iNews;
 private NewsModel model;

 public NewsPresenter(INews iNews) {

  model = new NewsModel();
  attach(iNews);
 }

 /**
  * 绑定view
  * @param iNews
  */
 public void attach(INews iNews){
  this.iNews = iNews;
 }
 /**
  * 获取数据的方法
  *
  * @param getUrl
  */
 public void getData(String getUrl, Map params) {

  model.getData(getUrl, params,new NewsModel.ResponseCallback() {
@Override
public void success(String result) {
 if (!TextUtils.isEmpty(result)) {
  String s = result.replace("null(","")
 .replace(")","");

  News news = new Gson().fromJson(s, News.class);
  iNews.success(news);
 }
}

@Override
public void fail(String msg) {


}
  });

//  OkhttpUtils.getInstance().getData(getUrl, new OkhttpUtils.ICallback() {
//@Override
//public void success(String result) {
//
//}
//
//@Override
//public void fail(String msg) {
//
//}
//  });
 }

 /**
  * 解绑
  */
 public void detach(){
  this.iNews = null;
 }
}
点击复制链接 与好友分享!回本站首页
上一篇:eclipse中jetty插件安装方法
下一篇:ThreadLocal 概念、原理及使用方法
相关文章
图文推荐

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站