您的位置:首页 > 其它

利用RecyclerView实现listview布局

2016-09-20 20:40 393 查看
主函数中

package project.tao.com.design;

import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.text.TextUtils;

import java.io.IOException;
import java.util.List;

import project.tao.com.design.utils.OkHttpClientUtils;
import project.tao.com.design.utils.ParserJson;

public class MainActivity extends AppCompatActivity {
private RecyclerView recyclerView;
private List<NewsInfo> list;
private String url="http://litchiapi.jstv.com/api/GetFeeds?column=0&PageSize=20" +
"&pageIndex=1&val=100511D3BE5301280E0992C73A9DEC41";
private RecyclerViewAdapter recyclerViewAdapter;
public Handler handler=new Handler(){
@Override
public void handleMessage(Message msg) {
list= (List<NewsInfo>) msg.obj;
recyclerViewAdapter=new RecyclerViewAdapter(MainActivity.this,list);
recyclerView.setAdapter(recyclerViewAdapter);
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

recyclerView=(RecyclerView)findViewById(R.id.recyclerView);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
recyclerView.addItemDecoration(new DividerItemDecoration(this,
DividerItemDecoration.VERTICAL_LIST));
new Thread(new Runnable() {
@Override
public void run() {
try {
String jsonString= OkHttpClientUtils.getStringFromURL(MainActivity.this,url,"");
if(!TextUtils.isEmpty(jsonString)){
list= ParserJson.parserJsonToList(jsonString);
Message message=Message.obtain();
message.obj=list;
handler.sendMessage(message);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
}
}

/**
* 设置线性排列时item之间的分割线,decoration装饰
* This class is from the v7 samples of the Android SDK.
* See the license above for details.
*/
public class DividerItemDecoration extends RecyclerView.ItemDecoration{
private static final int[] ATTRS=new int[]{
android.R.attr.listDivider
};
public static final int HORIZONTAL_LIST= LinearLayoutManager.HORIZONTAL;
public static final int VERTICAL_LIST = LinearLayoutManager.VERTICAL;
private Drawable mDivider;

private int mOrientation;
public DividerItemDecoration(Context context, int orientation) {
final TypedArray a = context.obtainStyledAttributes(ATTRS);
mDivider = a.getDrawable(0);
a.recycle();
setOrientation(orientation);
}
public void setOrientation(int orientation) {
if (orientation != HORIZONTAL_LIST && orientation != VERTICAL_LIST) {
throw new IllegalArgumentException("invalid orientation");
}
mOrientation = orientation;
}

@Override
public void onDraw(Canvas c, RecyclerView parent) {
if (mOrientation == VERTICAL_LIST) {
drawVertical(c, parent);
} else {
drawHorizontal(c, parent);
}

}
public void drawVertical(Canvas c, RecyclerView parent) {
final int left = parent.getPaddingLeft();
final int right = parent.getWidth() - parent.getPaddingRight();

final int childCount = parent.getChildCount();
for (int i = 0; i < childCount; i++) {
final View child = parent.getChildAt(i);
RecyclerView v = new RecyclerView(parent.getContext());
final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child
.getLayoutParams();
final int top = child.getBottom() + params.bottomMargin;
final int bottom = top + mDivider.getIntrinsicHeight();
mDivider.setBounds(left, top, right, bottom);
mDivider.draw(c);
}
}

public void drawHorizontal(Canvas c, RecyclerView parent) {
final int top = parent.getPaddingTop();
final int bottom = parent.getHeight() - parent.getPaddingBottom();

final int childCount = parent.getChildCount();
for (int i = 0; i < childCount; i++) {
final View child = parent.getChildAt(i);
final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child
.getLayoutParams();
final int left = child.getRight() + params.rightMargin;
final int right = left + mDivider.getIntrinsicHeight();
mDivider.setBounds(left, top, right, bottom);
mDivider.draw(c);
}
}
@Override
public void getItemOffsets(Rect outRect, int itemPosition, RecyclerView parent) {
if (mOrientation == VERTICAL_LIST) {
outRect.set(0, 0, 0, mDivider.getIntrinsicHeight());
} else {
outRect.set(0, 0, mDivider.getIntrinsicWidth(), 0);
}
}
}


RecycleViewAdapter适配器

public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.MyViewHolder> {
private Context context;
private List<NewsInfo> list;

public RecyclerViewAdapter(Context context, List<NewsInfo> list) {
this.context = context;
this.list = list;
}

/**
* 创建自定义viewholder对象
* @param parent
* @param viewType
* @return
*/
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view= LayoutInflater.from(context).inflate(R.layout.item,null);
MyViewHolder holder=new MyViewHolder(view);
return holder;
}
/**
* 将数据加载到控件中
* @param holder  onCreateViewHolder返回的自定义viewholder对象
* @param position 表示当前绑定数据的下标
*/
@Override
public void onBindViewHolder(MyViewHolder holder, int position) {
holder.iv.setImageResource(R.mipmap.ic_launcher);
Picasso.with(context).load(list.get(position).getCover()).into(holder.iv);
holder.tv_subject.setText(list.get(position).getSubject());
holder.tv_summary.setText(list.get(position).getSummary());
holder.tv_changed.setText(list.get(position).getChanged());
}
/**
* 返回当前适配器中加载的数据的条目 BaseAdapter getCount()
* @return
*/
@Override
public int getItemCount() {
return list.size();
}
/**
* 在适配器的内部创建自定义的MyViewHolder类 必须继承RecyclerView.ViewHolder
* 该类构造时必须传入view对象 该view对象相当于ListView中getView()中的convertView
*
*  ListView中convertView是复用的 在RecyclerView中把convertView作为ViewHolder
*  的成员变量存储
*/
class MyViewHolder extends RecyclerView.ViewHolder{
ImageView iv;
TextView tv_subject,tv_summary,tv_changed;
//必须实现的构造函数
public MyViewHolder(View itemView) {
super(itemView);
iv= (ImageView) itemView.findViewById(R.id.iv);
tv_subject= (TextView) itemView.findViewById(R.id.tv_subject);
tv_summary= (TextView) itemView.findViewById(R.id.tv_summary);
tv_changed= (TextView) itemView.findViewById(R.id.tv_changed);
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  RecyclerView design
相关文章推荐