智能文章系统实战-Android文章客户端(8)
admin 发布于:2018-6-21 16:53 有 4034 人浏览,获得评论 0 条 标签: Android
1. 列表模板XML
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.demo.article.MainActivity">
<ListView
android:id="@+id/listview"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</RelativeLayout>
2.列表项模板
<?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">
<TextView
android:id="@+id/title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
/>
</LinearLayout>
3.文章类程序
public class Item {
private int id;
private String title;
private String url;
public Item(int id,String title, String url) {
this.id = id;
this.title = title;
this.url = url;
}
public int getId() {
return id;
}
public String getTitle() {
return title;
}
public String getUrl() {
return url;
}
}
4.数据适配器
public class ItemAdapter extends ArrayAdapter<Item> {
private int layoutId;
public ItemAdapter(Context context, int layoutId, List<Item> list) {
super(context, layoutId, list);
this.layoutId = layoutId;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view;
ViewHolder viewHolder;
Item item = getItem(position);
if (convertView == null) {
view = LayoutInflater.from(getContext()).inflate(layoutId, parent, false);
viewHolder = new ViewHolder();
viewHolder.textView = (TextView) view.findViewById(R.id.title);
view.setTag(viewHolder);
} else {
view = convertView;
viewHolder = (ViewHolder) view.getTag();
}
viewHolder.textView.setText(item.getTitle());
return view;
}
class ViewHolder {
TextView textView;
}
}
3.列表程序
public class MainActivity extends Activity {
private List<Item> list = new ArrayList<>();
private ListView listView
private ItemAdapter<Item> itemAdapter;
private ProgressDialog dialog;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
/*
//初始化数据
initList();
//用自定义的数据适配器和自定义的布局显示列表
ItemAdapter itemAdapter = new ItemAdapter(MainActivity.this, R.layout.item, list);
ListView listView = (ListView) findViewById(R.id.listview);
listView.setAdapter(itemAdapter);
*/
//进度条
dialog = new ProgressDialog(MainActivity.this);
//列表显示控件listView
listView = (ListView) findViewById(R.id.listview);
//请求服务器获取数据,解析数据,加载列表
new dataAsyncTask().execute("http://news.demo.com/app.php");
//短暂点击跳到详情页
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
//详情页
Item item = list.get(position);
Intent intent = new Intent(MainActivity.this, ContentActivity.class);
intent.putExtra("title",item.getTitle());
intent.putExtra("url",item.getUrl());
startActivity(intent);
}
});
//长按Toast显示标题
listView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
Item item = list.get(position);
Toast.makeText(MainActivity.this, "long click " + item.getTitle(), Toast.LENGTH_SHORT).show();
return true;
}
});
}
//仅仅用来做测试,实际是对接的服务器接口的数据
private void initList() {
for (int i = 0; i < 100; i++) {
//public Item(int id,String title, String url)
Item item = new Item(i,"T" + i, "#" + i);
list.add(item);
}
}
//解析JSON数据
private List<Item> parseJSON(jsonStr)
JSONObject obj = new JSONObject(jsonStr); //最外层的JSONObject对象
String errCode = obj.getString("errCode");//通过errCode字段获取其所包含的字符串
String errMsg = obj.getString("errMsg"); //通过errMsg字段获取其所包含的字符串
JSONArray array = obj.getJSONArray("data");
for(int i = 0 ; i<array.length();i++){
JSONObject jsonObj = array.getJSONObject(i); //索引值,获取数组中包含的值
//System.out.println(jsonObj.getString("title"));
//把即系的数据加载到列表里
Item item = new Item(jsonObj.getInt("id"),jsonObj.getString("title"),jsonObj.getString("url"));
list.add(item);
}
return list;
}
//请求服务器数据
public String httpData(String path)
{
String result = "";
HttpClient httpClient = new DefaultHttpClient();
try
{
HttpPost httpPost = new HttpPost(path);
HttpResponse httpResponse = httpClient.execute(httpPost);
if(httpResponse.getStatusLine().getStatusCode() == HttpStatus.SC_OK)
{
HttpEntity httpEntity = httpResponse.getEntity();
if(httpEntity != null)
{
result = EntityUtils.toString(httpEntity, "utf-8");
}
}
}
catch (Exception e)
{
e.printStackTrace();
}
finally
{
httpClient.getConnectionManager().shutdown();
}
return result;
}
public class dataAsyncTask extends AsyncTask<String, Void, List<String>>
{
@Override
protected void onPreExecute()
{
//预加载
dialog.setTitle("提示信息");
dialog.setMessage("loading......");
dialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
dialog.setCancelable(false);
dialog.show();
}
@Override
protected List<Item> doInBackground(String... params)
{
//后台解析数据
List<Item> tempList = new ArrayList<Item>();
String jsonStr = httpData(params[0]);
//解析服务器端的json数据
tempList = parseJSON(jsonStr);
return tempList;
}
@Override
protected void onPostExecute(List<Item> list)
{
//显示列表数据
itemAdapter = new ItemAdapter(MainActivity.this, R.layout.item, list);
listView.setAdapter(itemAdapter);
dialog.dismiss();
}
}
}
4.详细页模板
<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/color_White">
<WebView
android:id="@+id/web_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
/>
</android.support.design.widget.CoordinatorLayout>
5.详细页程序
public class ContentActivity extends Activity {
private WebView webView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_content);
webView = (WebView)findViewById(R.id.web_view);
webView.getSettings().setJavaScriptEnabled(true);
webView.setWebViewClient(new WebViewClient());
String url = getIntent().getStringExtra("url");
//String title = getIntent().getStringExtra("title");
webView.loadUrl(url);
}
}
6. 临时总结
暂时没有实现 下拉刷新,上拉加载更多数据,目前仅仅加载第1页的数据。后期优化。
adapter.setData(list);//刷新列表数据
adapter.notifyDataSetChanged();
