之前一度想放弃android,可能是因为感觉累了,感觉方了,也可能是因为外界言论太多,一度想放弃android学习H5。
一直很迷茫,不知道该做什么,上班下班,2点一线...
跑题了,整理下最近看的关于5.0的代码,其实不错,更新了5.0之后,感觉android的界面终于可以和ios一拼了,加油!
1,首先是jar包的引入:
compile fileTree(include: ['*.jar'], dir: 'libs')
testCompile 'junit:junit:4.12'
compile 'com.android.support:appcompat-v7:23.3.0'
compile 'com.android.support:recyclerview-v7:23.3.0'
compile 'com.android.support:cardview-v7:23.3.0'
compile 'com.android.support:palette-v7:23.3.0'
compile 'com.android.support:design:23.3.0'
2,recyclerview的使用:
2.1-xml代码为:
<?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="match_parent"
android:orientation="vertical">
<android.support.v7.widget.RecyclerView
android:id="@+id/recyclerview"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
2.2-java代码:
package lytest.lht.ly.lyandroidtest.DropRecyleView;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.widget.DefaultItemAnimator;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.helper.ItemTouchHelper;
import java.util.ArrayList;
import lytest.lht.ly.lyandroidtest.BaseClass.BaseActivity;
import lytest.lht.ly.lyandroidtest.DropRecyleView.DropHelper.OnStartDragListener;
import lytest.lht.ly.lyandroidtest.DropRecyleView.DropHelper.SimpleItemTouchHelperCallback;
import lytest.lht.ly.lyandroidtest.R;
import lytest.lht.ly.lyandroidtest.adapter.RecAdapter;
import lytest.lht.ly.lyandroidtest.adapter.RecItemSpace;
/**
* Created by Ly on 2016/4/16.
*/
public class L_DropView extends BaseActivity implements OnStartDragListener {
private RecyclerView recyclerview;
private ArrayList<String> StringList;
private RecAdapter recAdapter;
private ItemTouchHelper itemTouchHelper;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.l_dropview);
assignViews();
StringList = new ArrayList<String>();
for (int i = 0; i < 19; i++) {
StringList.add("");
}
LinearLayoutManager linearLayoutManager =
new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false);
recyclerview.setLayoutManager(linearLayoutManager);
recAdapter = new RecAdapter(L_DropView.this, this);
recyclerview.setItemAnimator(new DefaultItemAnimator());
recyclerview.addItemDecoration(new RecItemSpace());
ItemTouchHelper.Callback callback =
new SimpleItemTouchHelperCallback(recAdapter);
itemTouchHelper = new ItemTouchHelper(callback);
itemTouchHelper.attachToRecyclerView(recyclerview);
recyclerview.setAdapter(recAdapter);
recAdapter.AddData(StringList);
}
private void assignViews() {
recyclerview = (RecyclerView) findViewById(R.id.recyclerview);
}
public static void ToDropView(Context context) {
Intent DropView = new Intent(context, L_DropView.class);
context.startActivity(DropView);
}
@Override
public void onStartDrag(RecyclerView.ViewHolder viewHolder) {
itemTouchHelper.startDrag(viewHolder);
}
}
值得注意的是,引入view后,跟之前的listview一样,要有自己的设配器,除此之后,如果没有给他设置Manager的话,可能会报空指针异常,这个问题要注意,一开始接触的时候很容易会忘了这个,而这个Manager就是其精髓了,设置不同的Manager可以实现不同的效果,如listview,gridview,甚至瀑布流,而上述代码则是实现了拖拽布局。我贴上适配器代码:
package lytest.lht.ly.lyandroidtest.adapter;
import android.content.Context;
import android.graphics.Color;
import android.support.v4.view.MotionEventCompat;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import java.util.ArrayList;
import java.util.Collections;
import lytest.lht.ly.lyandroidtest.DropRecyleView.DropHelper.ItemTouchHelperAdapter;
import lytest.lht.ly.lyandroidtest.DropRecyleView.DropHelper.ItemTouchHelperViewHolder;
import lytest.lht.ly.lyandroidtest.DropRecyleView.DropHelper.OnStartDragListener;
import lytest.lht.ly.lyandroidtest.R;
/**
* Created by Ly on 2016/4/16.
*/
public class RecAdapter extends RecyclerView.Adapter<RecAdapter.LHolder>
implements ItemTouchHelperAdapter {
private Context context;
private final OnStartDragListener onStartDragListener;
private ArrayList<String> mList = new ArrayList<String>();
public RecAdapter(OnStartDragListener onStartDragListener, Context context) {
this.onStartDragListener = onStartDragListener;
this.context = context;
}
@Override
public LHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(context).inflate(R.layout.rcy_item, null);
return new LHolder(view);
}
public void AddData(ArrayList<String> mList) {
this.mList.addAll(mList);
notifyDataSetChanged();
}
@Override
public void onBindViewHolder(final LHolder holder, int position) {
holder.itemView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if (MotionEventCompat.getActionMasked(event) == MotionEvent.ACTION_DOWN) {
onStartDragListener.onStartDrag(holder);
}
return false;
}
});
}
@Override
public int getItemCount() {
return mList.size();
}
@Override
public boolean onItemMove(int fromPosition, int toPosition) {
Collections.swap(mList, fromPosition, toPosition);
notifyItemMoved(fromPosition, toPosition);
return false;
}
@Override
public void onItemDismiss(int position) {
mList.remove(position);
notifyItemRemoved(position);
}
public class LHolder extends RecyclerView.ViewHolder
implements ItemTouchHelperViewHolder {
private ImageView rcv_imageview;
private TextView rcv_textview;
public LHolder(View itemView) {
super(itemView);
rcv_imageview = (ImageView) itemView.findViewById(R.id.rcv_imageview);
rcv_textview = (TextView) itemView.findViewById(R.id.rcv_textview);
}
@Override
public void onItemSelected() {
itemView.setBackgroundColor(Color.LTGRAY);
}
@Override
public void onItemClear() {
itemView.setBackgroundColor(0);
}
}
}
然后运行后你会发现,我的天,竟然没有间隔,不怕不怕,因为这个也是我们可以自己设置的,这里我写了一个很简单的设置(这个也是精髓,瀑布流就是通过玩转这个东西实现的)
package lytest.lht.ly.lyandroidtest.adapter;
import android.graphics.Rect;
import android.support.v7.widget.RecyclerView;
import android.view.View;
/**
* Created by Ly on 2016/4/16.
*/
public class RecItemSpace extends RecyclerView.ItemDecoration {
public RecItemSpace() {
}
@Override
public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
if (parent.getChildAdapterPosition(view)!=0){
outRect.top = 15;
}
}
}
这样在除了第一个item之外的每个,对于上一个元素都会有15个单位的间隔