RecyclerView添加头尾布局/xml解析
SAX解析
对文档进行顺序扫描,当扫描到4中情况(开始文档,结束文档,开始标签,结束标签)的时候回通知DefaultHandler中的方法,一直重复这个方法直到结束
优点:解析速度快,占用内存少
缺点:解析一个xml文件对应一个handler类,比较麻烦
特点:流式解析,解析是同步的督导哪里就是解析到哪里
用法
自定义类继承DefaultHandler 重写方法 startElement endElement characters
获得工厂 SAXParserFactory factory = SAXParserFactory.newInstance();
获得解析器SAXParser parser = factory.newSAXParser();
设置解析文件和解析方式parser.parse(文件,handler对象);
pull解析
解析方式类似sax当元素开始调用parse.nextText()从文档中取值
xml解析
pull解析
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
List<Book> list = new ArrayList<>();
try {
XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
XmlPullParser parser = factory.newPullParser();
InputStream open = getAssets().open("book.xml");
parser.setInput(open,"utf-8");
int type = parser.getEventType();
Book book = null;
while (type!=XmlPullParser.END_DOCUMENT){
switch (type){
case XmlPullParser.START_TAG:
if ("book".equals(parser.getName())){
book = new Book();
String attributeValue = parser.getAttributeValue(0);
book.setId(attributeValue);
} else if ("name".equals(parser.getName())) {
book.setName(parser.nextText());
}else if ("author".equals(parser.getName())){
book.setAuthor(parser.nextText());
}else if ("year".equals(parser.getName())){
book.setYear(parser.nextText());
}else if ("price".equals(parser.getName())){
book.setPrice(parser.nextText());
}
break;
case XmlPullParser.END_TAG:
if ("book".equals(parser.getName())){
list.add(book);
}
break;
}
type=parser.next();
}
} catch (XmlPullParserException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
Log.e("####",list+"");
}
}
Sax解析
public class Main2Activity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
SAXParserFactory factory = SAXParserFactory.newInstance();
try {
SAXParser parser = factory.newSAXParser();
InputStream open = getAssets().open("book.xml");
MyHandler myHandler = new MyHandler();
parser.parse(open,myHandler);
List<Book> list = myHandler.getList();
Log.e("####sax",list+"");
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
class MyHandler extends DefaultHandler{
List<Book> list = new ArrayList<>();
String tagname;
Book book;
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
super.startElement(uri, localName, qName, attributes);
if (qName.equals("book")){
book= new Book();
String value = attributes.getValue(0);
book.setId(value);
}
}
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
super.endElement(uri, localName, qName);
if (qName.equals("name")){
book.setName(tagname);
}else if (qName.equals("author")){
book.setAuthor(tagname);
}else if (qName.equals("year")){
book.setYear(tagname);
} else if (qName.equals("price")) {
book.setPrice(tagname);
}else if (qName.equals("book")){
list.add(book);
}
}
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
super.characters(ch, start, length);
tagname=new String(ch,start,length);
}
public List<Book> getList() {
return list;
}
}
}
RecyclerView添加头尾布局
主布局
<LinearLayout 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:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<android.support.v7.widget.RecyclerView
android:id="@+id/myrecycler"
android:layout_width="match_parent"
android:layout_height="match_parent"></android.support.v7.widget.RecyclerView>
</LinearLayout>
头布局
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent"
android:layout_height="wrap_content"
>
<ImageView
android:background="@drawable/tu4"
android:layout_width="match_parent"
android:layout_height="100dp" />
</LinearLayout>
尾布局
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent"
android:layout_height="wrap_content">
<ImageView
android:background="@drawable/tu1"
android:layout_width="match_parent"
android:layout_height="100dp" />
</LinearLayout>
Activity
public class MainActivity extends AppCompatActivity {
RecyclerView recyclerView;
MyAdapter myAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
init();
initData();
}
private void init() {
recyclerView = findViewById(R.id.myrecycler);
LinearLayoutManager manager = new LinearLayoutManager(this);
manager.setOrientation(LinearLayoutManager.VERTICAL);
recyclerView.setLayoutManager(manager);
myAdapter = new MyAdapter(this);
recyclerView.setAdapter(myAdapter);
addHeahView();
addFooterView();
}
public void addHeahView(){
View view =LayoutInflater.from(this).inflate(R.layout.name2,null);
myAdapter.addHeadView(view);
myAdapter.notifyDataSetChanged();
}
public void addFooterView(){
View view=LayoutInflater.from(this).inflate(R.layout.footer,null);
myAdapter.addFooterView(view);
myAdapter.notifyDataSetChanged();
}
public void initData(){
ArrayList<String> list= new ArrayList<>();
for (int i=0;i<80;i++){
list.add("第"+i+"个");
}
myAdapter.refershData(list);
}
}
RecyclerView.ViewHolder
public class MyHolder extends RecyclerView.ViewHolder {
SparseArray<View> array = new SparseArray<>();
Context context;
public MyHolder(@NonNull View itemView, Context context) {
super(itemView);
this.context=context;
}
public View getview(int id){
View view = array.get(id);
if (view == null){
view = itemView.findViewById(id);
array.put(id,view);
}
return view;
}
}
RecyclerView.Adapter
public class MyAdapter extends RecyclerView.Adapter<MyHolder> {
Context context;
View headView;
View footerView;
private final int HEADER_TYPE=1;
private final int NORMAL_TYPE=2;
ArrayList<String> list= new ArrayList<>();
public MyAdapter(Context context) {
this.context=context;
}
public void addHeadView(View view){
this.headView=view;
}
public void addFooterView(View view){
this.footerView=view;
}
public void refershData(ArrayList<String> mlist){
Log.e("###",mlist+"");
list.addAll( mlist);
Log.e("###1",list+"");
notifyDataSetChanged();
}
@NonNull
@Override
public MyHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
if (i ==HEADER_TYPE){
return new MyHolder(headView,context);//头布局
}else {
View view=LayoutInflater.from(context).inflate(R.layout.name1,viewGroup,false);
return new MyHolder(view,context);//身体
}
}
@Override
public void onBindViewHolder(@NonNull MyHolder myHolder, int i) {
Log.e("####5",list+"");
if (i==0 && headView !=null){
return;//如果是整个控件的第一行,被头占了,不要数据
}else if (i==list.size()){
return;
}else {
TextView textView = (TextView) myHolder.getview(R.id.t1);
if (headView!=null){//有头了,拿上一条数据
textView.setText(list.get(i-1));
}else {
textView.setText(list.get(i));
}
}
}
@Override
public int getItemViewType(int position) {
if (position ==0&& headView!=null){
return HEADER_TYPE;
}else if (position==list.size()){
return HEADER_TYPE;
}else {
return NORMAL_TYPE;
}
}
@Override
public int getItemCount() {
int count = list.size();//数据源长度
if (headView!=null){
count++;//有头布局的时候+1
}
return count;
}
}
头布局
尾部局