安卓项目02:项目笔记及测试首页(listView、网络请求)
2019-04-12 本文已影响0人
biyu6
在安卓项目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;
}
}
});