美文网首页
安卓项目02:项目笔记及测试首页(listView、网络请求)

安卓项目02:项目笔记及测试首页(listView、网络请求)

作者: biyu6 | 来源:发表于2019-04-12 14:31 被阅读0次

在安卓项目01中,搞定了app的名称、图标和启动页,现在是进入到首页MainActivity了;但我是出于学习Android状态,所以我需要有一个项目笔记,而且首页不能搞得像一个正常的项目那样,而是应该是各种测试demo的目录入口。所以,我需要一个项目笔记以及一个有很多跳转的测试首页布局。

本篇主要内容有:

1.在Android工程中添加项目笔记,以便记录项目开发过程中的各种杂事;
2.listView的几种写法;
3.搭建本地服务器及xml解析;
4.去除标题栏title;
5.Intent意图的传值及跳转

1.在Android工程中添加项目笔记

这个笔记的定位是项目笔记,所以我打算添加到项目的根文件夹下,操作步骤为:
1.在Android Studio中将项目路径切换到project目录下(左上角);
2.选中项目根文件夹(项目名称),右键New - File - 输入笔记名称 - 选择"Text"
然后就有一个记事本供记录项目笔记

2.listView的简单介绍

1.搭建listView

//注意:fastScrollEnabled 是实现快速滚动的
 <ListView
        android:id="@+id/main_LV"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:fastScrollEnabled="true"></ListView>

2.加载view

ListView lv = (ListView) findViewById(R.id.main_LV);

 //加载数据适配器
        //第一种:BaseAdapter(复杂cell常用)
        lv.setAdapter(new MyListAdapter());//BaseAdapter(复杂cell常用)
        //第二种:ArrayAdapter(简单文本cell)
//        twoArrayAdapterCell();
        //第三种:SimpleAdapter(数据结构简单时使用)
//        threeSimpleAdapterCell();

        //设置listView的点击事件
        lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                Log.d(TAG, "onItemClick: 点击了"+ position);
            }
        });
    }

第一种:BaseAdapter(复杂cell常用)

//布局文件:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <com.loopj.android.image.SmartImageView
        android:id="@+id/lvcell1_icon"
        android:layout_width="45dp"
        android:layout_height="45dp"
        android:layout_marginLeft="5dp"
        android:layout_marginTop="5dp"
        android:background="@drawable/bg_border1"
        android:src="@drawable/test_icon"
        />
    <TextView
        android:id="@+id/lvcell1_title"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="3dp"
        android:layout_toRightOf="@+id/lvcell1_icon"
        android:ellipsize="end"
        android:singleLine="true"
        android:textColor="@color/blackColor"
        android:textSize="15sp"
        android:text="主标题:顶顶顶顶顶顶顶顶多对结构化风格"
        />
    <TextView
        android:id="@+id/lvcell1_msg"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_toRightOf="@+id/lvcell1_icon"
        android:layout_below="@+id/lvcell1_title"
        android:ellipsize="end"
        android:singleLine="true"
        android:textColor="@color/orangeColor"
        android:textSize="13sp"
        android:text="内容:了了解了解了解了解多刷单告诉个非官方个"
        />
</RelativeLayout>

 //第一种数据适配器:BaseAdapter(复杂cell常用)
    private class MyListAdapter extends BaseAdapter {
        @Override
        public int getCount() {//有几条
            return listArr.size();
        }

        @Override
        public Object getItem(int position) {//不用管
            return null;
        }

        @Override
        public long getItemId(int position) {//不用管
            return 0;
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {//展示cell
            View view;
            if (convertView == null) {//没有就创建
                //创建新的view对象,可以通过打气筒把一个布局资源转换成一个view对象
                //获取打气筒的第一种方法:
//              view = View.inflate(getApplicationContext(), R.layout.lvcell1, null);
                //获取打气筒的第二种方法:
//              view = LayoutInflater.from(getApplicationContext()).inflate( R.layout.lvcell1, null);
                //获取打气筒的第三种方法:(最常用,最底层)
                LayoutInflater inflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);
                view = inflater.inflate(R.layout.lvcell1, null);
            } else {//若有就复用
                view = convertView;
            }
            //获取控件
            SmartImageView img = (SmartImageView) view.findViewById(R.id.lvcell1_icon);
            TextView title_tv = (TextView) view.findViewById(R.id.lvcell1_title);
            TextView msg_tv = (TextView) view.findViewById(R.id.lvcell1_msg);
            //赋值
            img.setImageUrl(listArr.get(position).getImg(), R.drawable.test_icon);
            title_tv.setText(listArr.get(position).getTitle());
            msg_tv.setText(listArr.get(position).getDesc());

            return view;
        }
    }

//第二种:ArrayAdapter(简单文本cell)

//布局文件:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    >

    <TextView
        android:id="@+id/lvcell2_title"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="20sp" />
</LinearLayout>

 //第二种数据适配器:ArrayAdapter(简单文本cell)
    private void twoArrayAdapterCell() {
        String titleArr[] = {"1", "2", "3", "4", "5", "6"};
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, R.layout.lvcell2, R.id.lvcell2_title, titleArr);
        lv.setAdapter(adapter);
    }

第三种:SimpleAdapter(数据结构简单时使用)

//布局文件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   android:orientation="horizontal">

   <TextView
       android:id="@+id/lvcell3_name"
       android:layout_width="0dp"
       android:layout_height="wrap_content"
       android:layout_weight="1"
       android:textColor="@color/blueColor"
       android:textSize="20sp"
       android:text="aaaaaaaa"/>

   <TextView
       android:id="@+id/lvcell3_phone"
       android:layout_width="0dp"
       android:layout_height="wrap_content"
       android:layout_weight="2"
       android:textColor="@color/orangeColor"
       android:textSize="18sp"
       android:text="bbbbbbbbbbbb"/>
</LinearLayout>

  //第三种数据适配器:SimpleAdapter(数据结构简单时使用)
   private void threeSimpleAdapterCell() {
       //创建4条数据
       Map<String, String> map1 = new HashMap<String, String>();
       map1.put("name", "张三");
       map1.put("phone", "13311111111");
       Map<String, String> map2 = new HashMap<String, String>();
       map2.put("name", "李四");
       map2.put("phone", "1344444444");
       Map<String, String> map3 = new HashMap<String, String>();
       map3.put("name", "王五");
       map3.put("phone", "1355555555");
       Map<String, String> map4 = new HashMap<String, String>();
       map4.put("name", "赵六");
       map4.put("phone", "1366666666");
       //把数据加入到集合中
       List<Map<String, String>> data = new ArrayList<Map<String, String>>();
       data.add(map1);
       data.add(map2);
       data.add(map3);
       data.add(map4);
       //设置数据适配器
       SimpleAdapter adapter = new SimpleAdapter(getApplicationContext(), data, R.layout.lvcell3, new String[]{"name", "phone"}, new int[]{R.id.lvcell3_name, R.id.lvcell3_phone});
       lv.setAdapter(adapter);
   }

3.搭建本地服务器及xml解析;

搭建本地Apache服务器: https://blog.csdn.net/u012198209/article/details/81457160

//从网络中获取ListView的数据
private void initListData() {
        new Thread() {
            public void run() {//开一个子线程
                try {
                    //记得开网络权限
                    //    /Users/huzhongcheng/Sites
                    String pathStr = "http://192.168.1.107/AndroidData/homeMenuData.xml";
                    URL url = new URL(pathStr);
                    HttpURLConnection conn = (HttpURLConnection) url.openConnection();
                    conn.setRequestMethod("GET");
                    conn.setConnectTimeout(5000);
                    int code = conn.getResponseCode();
                    if (code == 200) {
                        Log.d(TAG, "run: 请求成功");
                        InputStream in = conn.getInputStream();//获取服务器返回的数据流
                        Log.d(TAG, "run: 数据流" + in);
                        //解析返回的xml数据
                        listArr = MainListXmlUtils.parserXml(in);
                        Log.d(TAG, "run: 数据为" + listArr);
                        //回主线程更新UI
                        runOnUiThread(new Runnable() {
                            @Override
                            public void run() {
                                lv.setAdapter(new MyListAdapter());
                            }
                        });
                    } else {
                        Log.d(TAG, "run: 请求失败");
                    }
                } catch (Exception e) {
                    Log.d(TAG, "run: 服务器异常");
                    e.printStackTrace();
                }
            };
        }.start();
    }


//数据model类
package com.biyu6.huzhongcheng.byandroidtest;

public class MainListModel {
    private String img;
    private String title;
    private String desc;

    public String getImg() {
        return img;
    }

    public void setImg(String img) {
        this.img = img;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getDesc() {
        return desc;
    }

    public void setDesc(String desc) {
        this.desc = desc;
    }
}



//首页list的xml数据解析器
public class MainListXmlUtils {
    public static List<MainListModel> parserXml(InputStream in) throws Exception {
        List<MainListModel> listArr = null;
        MainListModel model = null;

        //获取xml解析器
        XmlPullParser parser = Xml.newPullParser();
        //设置解析器要解析的内容
        parser.setInput(in, "utf-8");
        //获取解析的事件类型
        int type = parser.getEventType();
        while (type != XmlPullParser.END_DOCUMENT) {
            switch (type) {
                case XmlPullParser.START_TAG://解析开始节点
                    //判断解析的是哪个开始标签
                    if ("channel".equals(parser.getName())) {
                        listArr = new ArrayList<MainListModel>();
                    } else if ("item".equals(parser.getName())) {
                        model = new MainListModel();
                    } else if ("title".equals(parser.getName())) {
                        model.setTitle(parser.nextText());
                    } else if ("desc".equals(parser.getName())) {
                        model.setDesc(parser.nextText());
                    } else if ("img".equals(parser.getName())) {
                        model.setImg(parser.nextText());
                    }
                    break;
                case XmlPullParser.END_TAG://解析结束节点
                    if ("item".equals(parser.getName())) {
                        //把javabean添加到集合
                        listArr.add(model);
                        System.out.println("节点信息:" + model);
                    }
                    break;
                default:
                    break;
            }
            //不停的向下解析
            type = parser.next();
        }
        return listArr;
    }
}


//homeMenuData.xml资源文件内容:
<?xml version="1.0" encoding="UTF-8"?>
<channel>
    <item>
        <title>标题1:用ViewPager实现Tab</title>
        <desc>代码都在一个Activity中,维护不便!</desc>
        <img>http://192.168.1.107/AndroidData/Images/f1.png</img>
    </item>
    <item>
        <title>标题2:</title>
        <desc>描述2:</desc>
        <img>http://192.168.1.107/AndroidData/Images/k2.jpg</img>
    </item>
    <item>
        <title>标题3:</title>
        <desc>描述3:</desc>
        <img>http://192.168.1.107/AndroidData/Images/f2.jpg</img>
    </item>
    <item>
        <title>标题4:</title>
        <desc>描述4:</desc>
        <img>http://192.168.1.107/AndroidData/Images/s5.png</img>
    </item>
</channel>

4.去除标题栏title;

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        supportRequestWindowFeature(Window.FEATURE_NO_TITLE);//Activity继承自AppCompatActivity时,用他去除标题栏title
//requestWindowFeature(Window.FEATURE_NO_TITLE); //Activity继承自FragmentActivity时,用他去除标题栏title
        setContentView(R.layout.activity_main);
        //加载view
        initView();
    }

5.Intent意图的传值及跳转

 //设置listView的点击事件
        lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                String titleStr = listArr.get(position).getTitle();
                Log.d(TAG, "onItemClick: 点击了"+ titleStr);
                switch (position) {
                    case 0:
                        //从当前跳转到TabViewPagerActivity的意图
                        Intent intent = new Intent(getApplicationContext(), TabViewPagerActivity.class);
                        /**意图传值
                         * Intent 能够以名为 extra 的键值对形式携带数据类型。
                             * 键是上面定义的公共常量 EXTRA_MESSAGE ,下一个 Activity 将用该键来检索文本值。
                             * 值是输入框中的值
                         */
                        intent.putExtra(EXTRA_MESSAGE,titleStr);
                        startActivity(intent);
                        break;
                    default:
                        Toast.makeText(MainActivity.this, "敬请期待!", Toast.LENGTH_SHORT).show();
                        break;
                }
            }
        });

相关文章

网友评论

      本文标题:安卓项目02:项目笔记及测试首页(listView、网络请求)

      本文链接:https://www.haomeiwen.com/subject/esbqwqtx.html