项目展示
项目依赖
api 'com.android.support:recyclerview-v7:28.0.0' api 'com.android.support:design:28.0.0' api 'com.google.code.gson:gson:2.2.4' api 'com.squareup.picasso:picasso:2.3.2' api 'com.squareup.okhttp3:okhttp:3.2.0'
接口地址出自 干货集中营
在做这个之前,先写一个bean类
public class Meizi {
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
private String url;
public int getPage() {
return page;
}
public void setPage(int page) {
this.page = page;
}
private int page;
}
接下来是主页面和是适配器,我写在了一起
public class LineActivity extends AppCompatActivity {
private static RecyclerView recyclerview;
private CoordinatorLayout coordinatorLayout;
private MyAdapter mAdapter;
private List<Meizi> meizis;
private LinearLayoutManager mLayoutManager;
private int lastVisibleItem;
private int page = 1;//默认加载页
private ItemTouchHelper itemTouchHelper;
private int screenwidth;
private SwipeRefreshLayout swipeRefreshLayout;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_line);
initView();
setListener();
new GetData().execute("http://gank.io/api/data/福利/10/1");
//获取屏幕宽度
WindowManager wm = (WindowManager) LineActivity.this
.getSystemService(Context.WINDOW_SERVICE);
DisplayMetrics outMetrics = new DisplayMetrics();
wm.getDefaultDisplay().getMetrics(outMetrics);
screenwidth = outMetrics.widthPixels;
}
@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);
}
}
private void initView() {
coordinatorLayout = (CoordinatorLayout) findViewById(R.id.line_coordinatorLayout);
recyclerview = (RecyclerView) findViewById(R.id.line_recycler);
mLayoutManager = new LinearLayoutManager(this);
recyclerview.setLayoutManager(mLayoutManager);
swipeRefreshLayout = (SwipeRefreshLayout) findViewById(R.id.line_swipe_refresh);
swipeRefreshLayout.setColorSchemeResources(R.color.colorPrimary, R.color.colorPrimaryDark, R.color.colorAccent);
swipeRefreshLayout.setProgressViewOffset(false, 0, (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 24, getResources().getDisplayMetrics()));
}
private void setListener() {
swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
@Override
public void onRefresh() {
page = 1;
new GetData().execute("http://gank.io/api/data/福利/10/1");
}
});
itemTouchHelper = new ItemTouchHelper(new ItemTouchHelper.Callback() {
@Override
public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
int dragFlags = 0, swipeFlags = 0;
if (recyclerView.getLayoutManager() instanceof StaggeredGridLayoutManager) {
dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN | ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT;
} else if (recyclerView.getLayoutManager() instanceof LinearLayoutManager) {
dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN;
//设置侧滑方向为从左到右和从右到左都可以
swipeFlags = ItemTouchHelper.START | ItemTouchHelper.END;
}
return makeMovementFlags(dragFlags, swipeFlags);
}
@Override
public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
int from = viewHolder.getAdapterPosition();
int to = target.getAdapterPosition();
Collections.swap(meizis, from, to);
mAdapter.notifyItemMoved(from, to);
return true;
}
@Override
public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
mAdapter.removeItem(viewHolder.getAdapterPosition());
}
@Override
public void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState) {
super.onSelectedChanged(viewHolder, actionState);
if (actionState == ItemTouchHelper.ACTION_STATE_DRAG) {
viewHolder.itemView.setBackgroundColor(Color.LTGRAY);
}
}
@Override
public void clearView(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
super.clearView(recyclerView, viewHolder);
viewHolder.itemView.setBackgroundColor(Color.WHITE);
}
@Override
public void onChildDraw(Canvas c, RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState, boolean isCurrentlyActive) {
viewHolder.itemView.setAlpha(1 - Math.abs(dX) / screenwidth);
super.onChildDraw(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive);
}
});
recyclerview.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
// 0:当前屏幕停止滚动;1时:屏幕在滚动 且 用户仍在触碰或手指还在屏幕上;2时:随用户的操作,屏幕上产生的惯性滑动;
// 滑动状态停止并且剩余两个item时自动加载
if (newState == RecyclerView.SCROLL_STATE_IDLE
&& lastVisibleItem + 2 >= mLayoutManager.getItemCount()) {
new GetData().execute("http://gank.io/api/data/福利/10/" + (++page));
}
}
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
// 获取加载的最后一个可见视图在适配器的位置。
lastVisibleItem = mLayoutManager.findLastVisibleItemPosition();
}
});
}
private class GetData extends AsyncTask<String, Integer, String> {
@Override
protected void onPreExecute() {
super.onPreExecute();
swipeRefreshLayout.setRefreshing(true);
}
@Override
protected String doInBackground(String... params) {
return MyOkhttp.get(params[0]);
}
protected void onPostExecute(String result) {
super.onPostExecute(result);
if (!TextUtils.isEmpty(result)) {
JSONObject jsonObject;
Gson gson = new Gson();
String jsonData = null;
try {
jsonObject = new JSONObject(result);
jsonData = jsonObject.getString("results");
} catch (JSONException e) {
e.printStackTrace();
}
if (meizis == null || meizis.size() == 0) {
meizis = gson.fromJson(jsonData, new TypeToken<List<Meizi>>() {
}.getType());
Meizi pages = new Meizi();
pages.setPage(page);
meizis.add(pages);
} else {
List<Meizi> more = gson.fromJson(jsonData, new TypeToken<List<Meizi>>() {
}.getType());
meizis.addAll(more);
Meizi pages = new Meizi();
pages.setPage(page);
meizis.add(pages);
}
if (mAdapter == null) {
recyclerview.setAdapter(mAdapter = new MyAdapter());
itemTouchHelper.attachToRecyclerView(recyclerview);
} else {
mAdapter.notifyDataSetChanged();
}
}
swipeRefreshLayout.setRefreshing(false);
}
}
class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> implements View.OnClickListener {
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(
LineActivity.this).inflate(R.layout.line_meizi_item, parent,
false);
MyViewHolder holder = new MyViewHolder(view);
view.setOnClickListener(this);
return holder;
}
@Override
public void onBindViewHolder(MyViewHolder holder, int position) {
Glide.with(LineActivity.this).load(meizis.get(position).getUrl()).into(holder.iv);
}
@Override
public int getItemCount() {
return meizis.size();
}
@Override
public void onClick(View v) {
int position = recyclerview.getChildAdapterPosition(v);
}
class MyViewHolder extends RecyclerView.ViewHolder {
private ImageView iv;
public MyViewHolder(View view) {
super(view);
iv = (ImageView) view.findViewById(R.id.line_item_iv);
}
}
public void addItem(Meizi meizi, int position) {
meizis.add(position, meizi);
notifyItemInserted(position);
recyclerview.scrollToPosition(position);
}
public void removeItem(final int position) {
final Meizi removed = meizis.get(position);
meizis.remove(position);
notifyItemRemoved(position);
}
}
}
网络请求
public class MyOkhttp { public static OkHttpClient client = new OkHttpClient(); public static String get(String url){ try { client.newBuilder().connectTimeout(10000, TimeUnit.MILLISECONDS); Request request = new Request.Builder().url(url).build(); Response response = client.newCall(request).execute(); if (response.isSuccessful()) { return response.body().string(); } else { throw new IOException("Unexpected code " + response); } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } return null; } }
/** * Created by * 彩色Snackbar工具类 * */ public class SnackbarUtil { public static final int Info = 1; public static final int Confirm = 2; public static final int Warning = 3; public static final int Alert = 4; public static int red = 0xfff44336; public static int green = 0xff4caf50; public static int blue = 0xff2195f3; public static int orange = 0xffffc107; /** * 短显示Snackbar,自定义颜色 * @param view * @param message * @param messageColor * @param backgroundColor * @return */ public static Snackbar ShortSnackbar(View view, String message, int messageColor, int backgroundColor){ Snackbar snackbar = Snackbar.make(view,message, Snackbar.LENGTH_SHORT); setSnackbarColor(snackbar,messageColor,backgroundColor); return snackbar; } /** * 长显示Snackbar,自定义颜色 * @param view * @param message * @param messageColor * @param backgroundColor * @return */ public static Snackbar LongSnackbar(View view, String message, int messageColor, int backgroundColor){ Snackbar snackbar = Snackbar.make(view,message, Snackbar.LENGTH_LONG); setSnackbarColor(snackbar,messageColor,backgroundColor); return snackbar; } /** * 自定义时常显示Snackbar,自定义颜色 * @param view * @param message * @param messageColor * @param backgroundColor * @return */ public static Snackbar IndefiniteSnackbar(View view, String message, int duration, int messageColor, int backgroundColor){ Snackbar snackbar = Snackbar.make(view,message, Snackbar.LENGTH_INDEFINITE).setDuration(duration); setSnackbarColor(snackbar,messageColor,backgroundColor); return snackbar; } /** * 短显示Snackbar,可选预设类型 * @param view * @param message * @param type * @return */ public static Snackbar ShortSnackbar(View view, String message, int type){ Snackbar snackbar = Snackbar.make(view,message, Snackbar.LENGTH_SHORT); switchType(snackbar,type); return snackbar; } /** * 长显示Snackbar,可选预设类型 * @param view * @param message * @param type * @return */ public static Snackbar LongSnackbar(View view, String message, int type){ Snackbar snackbar = Snackbar.make(view,message, Snackbar.LENGTH_LONG); switchType(snackbar,type); return snackbar; } /** * 自定义时常显示Snackbar,可选预设类型 * @param view * @param message * @param type * @return */ public static Snackbar IndefiniteSnackbar(View view, String message, int duration, int type){ Snackbar snackbar = Snackbar.make(view,message, Snackbar.LENGTH_INDEFINITE).setDuration(duration); switchType(snackbar,type); return snackbar; } //选择预设类型 private static void switchType(Snackbar snackbar, int type){ switch (type){ case Info: setSnackbarColor(snackbar,blue); break; case Confirm: setSnackbarColor(snackbar,green); break; case Warning: setSnackbarColor(snackbar,orange); break; case Alert: setSnackbarColor(snackbar, Color.YELLOW,red); break; } } /** * 设置Snackbar背景颜色 * @param snackbar * @param backgroundColor */ public static void setSnackbarColor(Snackbar snackbar, int backgroundColor) { View view = snackbar.getView(); if(view!=null){ view.setBackgroundColor(backgroundColor); } } /** * 设置Snackbar文字和背景颜色 * @param snackbar * @param messageColor * @param backgroundColor */ public static void setSnackbarColor(Snackbar snackbar, int messageColor, int backgroundColor) { View view = snackbar.getView(); if(view!=null){ view.setBackgroundColor(backgroundColor); ((TextView) view.findViewById(R.id.snackbar_text)).setTextColor(messageColor); } } /** * 向Snackbar中添加view * @param snackbar * @param layoutId * @param index 新加布局在Snackbar中的位置 */ public static void SnackbarAddView(Snackbar snackbar, int layoutId, int index) { View snackbarview = snackbar.getView(); Snackbar.SnackbarLayout snackbarLayout=(Snackbar.SnackbarLayout)snackbarview; View add_view = LayoutInflater.from(snackbarview.getContext()).inflate(layoutId,null); LinearLayout.LayoutParams p = new LinearLayout.LayoutParams( LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT); p.gravity= Gravity.CENTER_VERTICAL; snackbarLayout.addView(add_view,index,p); } }
接下来顺便把布局文件给你们
activity_line
<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/line_coordinatorLayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true"
android:background="#ffffff"
>
<android.support.design.widget.AppBarLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:theme="@style/AppTheme.AppBarOverlay">
</android.support.design.widget.AppBarLayout>
<android.support.v4.widget.SwipeRefreshLayout
android:id="@+id/line_swipe_refresh"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
<android.support.v7.widget.RecyclerView
android:id="@+id/line_recycler"
android:layout_width="match_parent"
android:layout_height="match_parent"
/>
</android.support.v4.widget.SwipeRefreshLayout>
</android.support.design.widget.CoordinatorLayout>
line_meizi_item
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="500dp"
android:layout_marginTop="10dp"
android:background="#ffffff"
android:orientation="vertical">
<ImageView
android:id="@+id/line_item_iv"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_margin="5dp"
android:adjustViewBounds="true"
android:scaleType="centerCrop" />
</LinearLayout>
style
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar"> <!-- Customize your theme here. --> <item name="colorPrimary">@color/colorPrimary</item> <item name="colorPrimaryDark">@color/colorPrimaryDark</item> <item name="colorAccent">@color/colorAccent</item> </style> <style name="AppTheme.NoActionBar"> <item name="windowActionBar">false</item> <item name="windowNoTitle">true</item> </style> <style name="AppTheme.AppBarOverlay" parent="ThemeOverlay.AppCompat.Dark.ActionBar" /> <style name="AppTheme.PopupOverlay" parent="ThemeOverlay.AppCompat.Light" />
写的很清楚。就不附源码了。有不懂得留言