关于RecycleView的介绍网上有很多,据说是谷歌为了解决ListView的某些问题和实现更多的功能在ListView的基础开发出来的,可以实现瀑布流和左右滑动以及上下滑动,相关方法再网上都可以找到,这里只写本人用到的功能,单纯只是为了总结知识
导入包
implementation "com.android.support:recyclerview-v7:25.3.1"
代码中调用
LinearLayoutManager layoutManager = new LinearLayoutManager(this);
layoutManager.setOrientation(LinearLayoutManager.VERTICAL);
//设置RecyclerView 布局
recyclerView.setLayoutManager(layoutManager);
//设置Adapter
MyTopicAdapter adapter = new MyTopicAdapter(topicsBean,"F");
recyclerView.setAdapter(adapter);
其中MyTopicAdapter代码如下:
package adapter;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.CompoundButton;
import com.example.donview.campusspirit.R;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import topics.TopicsBean;
import viewholder.BaseViewHolder;
/**
* Created by Donview on 2018/8/16.
*/
public class MyTopicAdapter extends RecyclerView.Adapter {
private static TopicsBean topicsBean;
private static TopicsBean topicsEBean;
public static Map isSelected=new HashMap<>();
public static Map isESelected=new HashMap<>();
protected int size=2;
private int count=0;
protected BaseViewHolder holder;
protected String type;
public MyTopicAdapter(TopicsBean topicsBean, String type){
switch (type){
case "F":
this.topicsBean=topicsBean;
count=topicsBean.getOptionCount();
initSelected(topicsBean.getOptionCount(),"F");
break;
case "E":
this.topicsEBean=topicsBean;
count=topicsEBean.getOptionCount();
map=new HashMap<>();
initSelected(topicsBean.getOptionCount(),"E");
break;
}
this.type=type;
}
//创建时自动调用
@Override
public BaseViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
switch (type){
case "F":
inflaterFView(parent);
break;
case "E":
inflaterEView(parent);
break;
}
return holder;
}
//关联ViewHolder
@Override
public void onBindViewHolder(BaseViewHolder viewHolder, int position) {
//设置选项内容
switch (type){
case "F":
bindFView(viewHolder,position);
break;
case "E":
bindEView(viewHolder,position);
break;
}
}
//解析F题型的布局文件
private void inflaterFView(ViewGroup parent) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_type2_option,parent,false);
holder = new BaseViewHolder(view,"F");
}
//赋值F题型
private void bindFView(BaseViewHolder viewHolder, int position) {
if (position select=this.type=="F"?isSelected:isESelected;
if ( position < size) {
viewHolder.cb_optionA.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (select.get(position) == false) {
select.put(position, true);
//type==1?单选:不定项
if (type==1){
unSelect(position);
notifyDataSetChanged();
}
} else {
select.put(position, false);
}
}
});
viewHolder.cb_optionA.setChecked(select.get(position));
}
}
//初始化checkbox的选中状态
public void initSelected(int size,String typeName) {
this.size=size;
Map selected=typeName=="F"?isSelected:isESelected;
for (int i = 0; i < size; i++) {
selected.put(i, false);
if (typeName=="E")
map.put(i," ");
}
}
//取消当前选项以外所有选项选中
private void unSelect(int position) {
for (int i=0;i=1)
result=result.substring(0,result.length()-1);
return result;
}
private static Map map;
//E题型的选中事件
private class MyOnCheckedListener implements CompoundButton.OnCheckedChangeListener {
int position=0;
public MyOnCheckedListener(int position) {
this.position=position;
}
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
buttonView.setText(isChecked?"√":"╳");
map.put(position,isChecked?"√":"╳");
}
}
}
自身就可以封装自定义的ViewHolder比ListView方便很多而且简洁得多:
package viewholder;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.widget.CheckBox;
import android.widget.LinearLayout;
import android.widget.TextView;
import com.example.donview.campusspirit.R;
/**
* Created by Donview on 2018/8/17.
*/
public class BaseViewHolder extends RecyclerView.ViewHolder{
public TextView tv_className;
public TextView tv_teacherName;
public TextView tv_topicName;
public TextView tv_date;
public TextView tv_time;
public LinearLayout ll_work_content;
public CheckBox cb_optionA;
public TextView tv_content1;
public BaseViewHolder(View itemView, String type) {
super(itemView);
switch (type){
case "F":
findViewFromF(itemView);
break;
case "E":
findViewFromE(itemView);
break;
case "Work":
findViewFromWork(itemView);
break;
}
}
//F题型配置
private void findViewFromF(View itemView) {
cb_optionA= (CheckBox) itemView.findViewById(R.id.cbf_optionA);
tv_content1=(TextView)itemView.findViewById(R.id.tvf_content1);
}
//E题型配置
private void findViewFromE(View itemView) {
cb_optionA= (CheckBox) itemView.findViewById(R.id.cbe_optionA);
tv_content1=(TextView)itemView.findViewById(R.id.tve_content1);
}
//WorkPage配置
private void findViewFromWork(View itemView) {
ll_work_content=(LinearLayout)itemView.findViewById(R.id.ll_work_content);
tv_className= (TextView) itemView.findViewById(R.id.tv_work_className);
tv_teacherName= (TextView) itemView.findViewById(R.id.tv_work_teacherName);
tv_topicName= (TextView) itemView.findViewById(R.id.tv_work_topicName);
tv_date= (TextView) itemView.findViewById(R.id.tv_work_date);
tv_time= (TextView) itemView.findViewById(R.id.tv_work_time);
}
}
RecycleView本身不实现点击事件,需要自己实现,方法多种,这里给出在Adapter里面实现接口的方法
package adapter;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import com.example.donview.campusspirit.R;
import java.util.ArrayList;
import java.util.Map;
import viewholder.BaseViewHolder;
/**
* Created by Donview on 2018/8/21.
*/
public class MyWorkAdapter extends RecyclerView.Adapter implements View.OnClickListener{
private ArrayList
然后代码中调用:
//RecycleView选项监听
private class MyWorkOnItemClickListener implements MyWorkAdapter.OnItemClickListener {
@Override
public void onItemClick(View view, int position) {
if (position>arrayList.size()){
Log.i("FoolException","IndexOutOfBoundsException!WorkPage数组下标超出了");
return;
}
MyApplication.setTask_id((int)arrayList.get(position).get("task_id"));
Log.i("TestViewHolder","Click:task_id="+ MyApplication.getTask_id()+
",userId="+ MyApplication.getUserId()+",userName="+
MyApplication.getUserName()+",task_name="+arrayList.get(position).get("task_name")+",all_done="+
arrayList.get(position).get("all_done"));
context.startActivity(new Intent(context, TopicListActivity.class));
}
}