XML解析及头尾布局

XML解析及头尾布局

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()从文档中取值

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>

主类

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);
}
}

适配器

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;
}
}

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;
}
}

猜你喜欢

转载自blog.csdn.net/wangwei_weibo/article/details/93784654