XML parsing and layout of the head and tail

XML parsing and layout of the head and tail

xml parsing

SAX parsing

The document is scanned sequentially when scanned in case 4 (the beginning of the document, the end of the document, start tag, end tag) when the method notifications back DefaultHandler in, repeating this method until the end of
advantages: fast parsing speed, small footprint
shortcomings : parsing an xml file corresponding to a handler class, troublesome
characteristics: parsing flow, where the resolution is resolved is synchronized supervision where
use
custom class that inherits DefaultHandler override method startElement endElement characters
obtained plant SAXParserFactory factory = SAXParserFactory.newInstance () ;
obtaining parser SAXParser parser = factory.newSAXParser ();
Sets the parse documents and analytical methods parser.parse (file, handler objects);
pull resolve
analytically similar to the sax when an element begin calling parse.nextText () value from the document

pull parsing

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 resolve

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 add head and tail layout

Master layout

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

Head layout

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

Last layout

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

The main class

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

adapter

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

Guess you like

Origin blog.csdn.net/wangwei_weibo/article/details/93784654