您的位置:首页 > 移动开发

一个小应用解析webview,adapter,以及listview中item点击事件

2015-11-05 17:18 423 查看
最近搞了一个类似NBA新闻的小APP,主要使用的就是webview,adapter,以及listview中item点击事件。

上效果图:



点击每个item可以跳转到另一个web页面,比如点击第三个item将跳转到我的个人博客。



话不多说,上代码:

MainActivity.java

<span style="font-size:18px;">package com.example.administrator.mytestadapter;

import android.app.ListActivity;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.SimpleAdapter;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;

public class MainActivity extends ListActivity {
private ListView mylistview;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mylistview= getListView();
final List<Map<String,Object>> list=new ArrayList<Map<String,Object>>();
final Map<String,Object> map0=new HashMap<String,Object>();
final Map<String,Object> map1=new HashMap<String,Object>();
final Map<String,Object> map2=new HashMap<String,Object>();
final Map<String,Object> map3=new HashMap<String,Object>();
final Map<String,Object> map4=new HashMap<String,Object>();

map0.put("img", R.drawable.dayanmei);//drawable中保存的图像文件名
map0.put("title", "我的女神");
map0.put("info", "一只眼睛超大的蚊子,哈哈");
list.add(map0);

map1.put("img", R.drawable.claus);
map1.put("title", "我的男神");
map1.put("info", "初代吸血鬼男主角,约瑟夫摩根");
list.add(map1);

map2.put("img", R.drawable.haha);
map2.put("title", "老来疯");
map2.put("info", "");
list.add(map2);

map3.put("img", R.drawable.luoli);
map3.put("title", "我的未来老婆");
map3.put("info", "还在上幼儿园");
list.add(map3);

map4.put("img", R.drawable.kobe);
map4.put("title", "科比布莱恩特");
map4.put("info","一个我追了十年的人,激励我不断努力。");
list.add(map4);
SimpleAdapter adapter=new SimpleAdapter(this,list,
R.layout.layout,new String[]{"img","title","info"},
new int[]{R.id.img,R.id.title,R.id.info});
mylistview.setAdapter(adapter);
mylistview.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
if (list.get(position).equals(map0)){
Intent i=new Intent(MainActivity.this,Dayanmei.class);
startActivity(i);
}
else if(list.get(position).equals(map1)){
startActivity(new Intent(MainActivity.this,Claus.class));
}
else if(list.get(position).equals(map2)){
startActivity(new Intent(MainActivity.this,Me.class));
}
else if(list.get(position).equals(map3)){
startActivity(new Intent(MainActivity.this,Luoli.class));
}
else if(list.get(position).equals(map4)){
startActivity(new Intent(MainActivity.this,Kobe.class));
}
}
});
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}

}
</span>
主界面activity_main.xml:
<span style="font-size:18px;"><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
android:orientation="vertical"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity">
<TextView
android:layout_width="fill_parent"
android:layout_height="40dp"
android:id="@+id/textview"
android:text="Itemlists:"
android:textSize="30dp"
android:textColor="#f0f"/>

<ListView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@id/android:list"   //此处id必须为@id/android:list,因为MainActivity继承自ListActivity
 android:dividerHeight="18dp"    //而继承自listactivity的类会自动在xml中寻找一个ID为list的listview。
android:divider="#00000000"     //dividerheight减小item之间间距,divider设置item间分割线透明
android:layout_alignParentTop="true">

</ListView>

</LinearLayout>
</span>
listview中每个item的样式在layout.xml中定义:

<span style="font-size:18px;"><?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">
<ImageView
android:layout_width="80dp"
android:layout_height="60dp"
android:scaleType="fitXY"  //使图片适应屏幕大小
android:id="@+id/img"/>
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content">

<TextView
android:id="@+id/title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="20dp"
android:textColor="#f0f"
android:paddingLeft="10dp"/>
<TextView
android:id="@+id/info"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="14dp"
android:paddingLeft="10dp"/>

</LinearLayout>
</LinearLayout>
</span>
点击item后出现的web网页
info.xml

<span style="font-size:18px;"><?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">
<WebView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/webview">

</WebView>
</LinearLayout>
</span>


点击item后跳转到另一个Activity,以第三个item为例:

Me.java

<span style="font-size:18px;">package com.example.administrator.mytestadapter;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.Button;

/**
* Created by Administrator on 2015/11/3.
*/
public class Me extends Activity {
private WebView webView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.info);
webView= (WebView) findViewById(R.id.webview);
WebSettings webSettings=webView.getSettings();
webSettings.setJavaScriptEnabled(true);//设置可读取JavaScript网页
webSettings.setAllowFileAccess(true);//可读取文件
webSettings.setBuiltInZoomControls(true);
webView.loadUrl("http://blog.csdn.net/qq_29407877");//要跳转的网页地址
webView.setWebViewClient(new WebViewClient());
}
private class webViewClient extends WebViewClient{
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
view.loadUrl(url);
return true;
}
}
}
</span>


之后记得在androidmanifest文件中注册activity以及获取网络权限
AndroidManifest.xml

<span style="font-size:18px;"><?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.administrator.mytestadapter" >
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name=".MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".Claus"></activity>
<activity android:name=".Dayanmei"></activity>
<activity android:name=".Luoli"></activity>
<activity android:name=".Me"></activity>
<activity android:name=".Kobe"/>
</application>
<uses-permission android:name="android.permission.INTERNET"/>//获取网络权限
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>//获取网络状态权限
</manifest>
</span>
大致的代码就是酱紫,说说coding过程中遇到的问题吧
1.listview搭配的类继承自listactivity的时候,需要把ID设为@id/android:list,同时在activity中用getListView()获取到这个listview。

2.好几次unfortunately has stopped,一看logcat发现有一个是java.lang.nullpointerexception,空指针异常,才明白在java中不能随便用空指针,百度百科一下发现

当应用程序试图在需要对象的地方使用 null 时,抛出该异常。这种情况包括:

调用 null 对象的实例方法。

访问或修改 null 对象的字段。

如果一个数组为null,试图用属性length获得其长度时。

如果一个数组为null,试图访问或修改其中某个元素时。

在需要抛出一个异常对象,而该对象为 null 时。

所以尽量避免使用空指针。
还有的是androidmanifest.xml中activity没注册,以及把adapter中的R,layout.layout写成了R.layout.activity_main。

3.当上述问题解决后已经可以运行了,然而网页加载不出,安装时也没有显示需要网络权限,于是我查了下androidmanifest.xml中发现<uses-permission android:name="android.permission.INTERNET"/>我写成了<uses-permission android:name="ANDROID.PERMISSION.INTERNET"/>更可怕的是居然没报错。。。

我查了一下所有的常见permission都是小写加大写,改过来之后APP可以正常运行了。记得还有一次用handler传递message的时候也是,代码正常却报错了,查了好几遍才发现handler引错包了,该

import android.os.Handler

结果搞成了
import java.util.logging.Handler

改正过来就好了,还有之前使用handler遇到了内存泄露问题,先记下,日后再解决。
再浅浅谈一下这次coding中学到的东西

基本上就是标题说的webview,listview中每个item样式的设置,还有adapter绑定item样式,item点击事件。以及成就感,多写代码是进步最快的方法。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息