Cet article présente principalement en détail le client de navigation d'actualités Android basé sur l'arrière-plan PHP. Il a une certaine valeur de référence et les amis intéressés peuvent s'y référer. J'espère que cela aide tout le monde.
Le contenu spécifique est le suivant
1 Utilisez HBuilder pour configurer l'environnement PHP et tester si l'instruction MySQL peut être interrogée. Cela a déjà été expliqué en détail.
2. Ici, l'arrière-plan PHP implémente la fonction de requête de mysql et renvoie un client au format de données JSON
Créez un fichier mysql_connect.php ici en PHP pour réaliser la connexion à la base de données et définir le jeu de caractères. format.
<?php $con = mysql_connect("localhost","root","123456"); //设置字符集为UTF-8 可解决中文乱码 mysql_query("SET NAMES 'utf8'"); mysql_query("SET CHARACTER SET utf8"); mysql_query("SET CHARACTER_SET_RESULT=utf8"); if(!$con){ die(mysql_error()); } mysql_select_db("newsdemo",$con); ?>
Créez ensuite un nouveau fichier getNewsJSON.php pour convertir les résultats de la requête au format de chaîne JSON. Seule la méthode json_encode est nécessaire.
<?php /*获得JSON数据 * 返回值:title desc time content_url pic_url*/ require 'mysql_connect.php'; $n = 0; $result = mysql_query("select * from news"); while($row = mysql_fetch_array($result)){ $arr[$n++] = array( "title"=>$row['title'], "desc"=>$row['desc'], "time"=>$row['time'], "content_url"=>$row['content_url'], "pic_url"=>$row['pic_url'] ); } //数组转化为JSON字符串 echo json_encode($arr); ?>
L'accent est mis sur la conception et le développement du côté Android
1. Interface de conception
Puisqu'il est nécessaire de définir le même format dans chaque élément de le ListView, il est utilisé ici Sous la forme de ListView+Adapter
Ajouter un contrôle ListView dans l'interface principale LinearLayout
2 Le programme Mainactivity est le suivant :
public class MainActivity extends Activity implements OnItemClickListener{ private ListView lvNews ; private NewsAdapter adapter ; //定义集合 private List<News> newsList ; //获取json字符串的URL地址 public static final String GET_NEWS_URL = "http://211.87.234.20/NewsDemo/getNewsJSON.php"; //获取msg之后如何处理 private Handler getNewsHandler = new Handler(){ public void handleMessage(android.os.Message msg){ String jsonData = (String) msg.obj ; System.out.println(jsonData) ; try { JSONArray jsonArray = new JSONArray(jsonData) ; for(int i=0;i<jsonArray.length();i++){ JSONObject object = jsonArray.getJSONObject(i) ; String title = object.getString("title") ; String desc = object.getString("desc") ; String time = object.getString("time") ; String content_url = object.getString("content_url") ; String pic_url = object.getString("pic_url") ; System.out.println("title="+title) ; //add一个News类型的Object newsList.add(new News(title,desc,time,content_url,pic_url)) ; } //通知更新 adapter.notifyDataSetChanged() ; } catch (JSONException e) { // TODO Auto-generated catch block e.printStackTrace(); } } ; } ; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState) ; setContentView(R.layout.activity_main) ; lvNews = (ListView) findViewById(R.id.lvNews) ; //初始化 newsList = new ArrayList<News>(); adapter = new NewsAdapter(this,newsList) ; lvNews.setAdapter(adapter) ; lvNews.setOnItemClickListener(this) ; HttpUtils.getNewsJSON(GET_NEWS_URL,getNewsHandler) ; } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } @Override public void onItemClick(AdapterView<?> arg0, View arg1, int position, long arg3) { // TODO Auto-generated method stub News news = newsList.get(position) ; Intent intent = new Intent(this,BrowseNewsActivity.class) ; intent.putExtra("content_url",news.getContent_url()) ; startActivity(intent) ; } }
Ici, vous avez besoin d'une classe d'outils HttpUtils et self- Le NewsAdapter défini est utilisé pour réaliser l'affichage de la vue de l'élément
Le code HttpUtils est le suivant :
package com.MR.news.utils; import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.os.Handler; import android.os.Message; import android.widget.ImageView; public class HttpUtils { //工具类直接定义成静态方法即可 /*url用于内部类中,所以要将其设定为final类型*/ /*读取完成需要通知主线程,需要使用handler*/ public static void getNewsJSON(final String url,final Handler handler){ //访问网络,时间长,开启新线程 new Thread(new Runnable(){ @Override public void run() { // TODO Auto-generated method stub HttpURLConnection conn ; InputStream is ; try { conn = (HttpURLConnection) new URL(url).openConnection() ; //GET方式获取 conn.setRequestMethod("GET") ; //得到输入流 is=conn.getInputStream() ; //读取数据用缓冲,里面要传入一个reader BufferedReader reader = new BufferedReader(new InputStreamReader(is)); //一行一行读取数据 String line = ""; //没读完一行进行拼接,高效 StringBuilder result = new StringBuilder(); while((line = reader.readLine()) != null){ result.append(line); } Message msg = new Message() ; //msg.obj可以放进去任何对象 msg.obj = result.toString() ; handler.sendMessage(msg) ; } catch (Exception e) { e.printStackTrace(); } }}).start() ; } public static void setPicBitMap(final ImageView ivPic,final String pic_url){ new Thread(new Runnable(){ @Override public void run() { // TODO Auto-generated method stub try { HttpURLConnection conn = (HttpURLConnection) new URL(pic_url).openConnection() ; conn.connect() ; InputStream is = conn.getInputStream() ; //bitmap就是所需图片资源 /*从资源文件中的到图片*/ Bitmap bitmap = BitmapFactory.decodeStream(is) ; ivPic.setImageBitmap(bitmap) ; is.close() ; } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } }).start() ; } }
Le code NewsAdapter. est la suivante :
package com.MR.news.adapter; import java.util.List; import com.MR.news.R; import com.MR.news.model.News; import com.MR.news.utils.HttpUtils; import android.content.Context; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.ImageView; import android.widget.TextView; public class NewsAdapter extends BaseAdapter { //声明上下文对象,后面的getView方法需要 private Context context; private List<News> newsList; public NewsAdapter(Context context, List<News> newsList){ this.context = context ; this.newsList = newsList ; } @Override public int getCount() { // TODO Auto-generated method stub return newsList.size(); } @Override public Object getItem(int position) { // TODO Auto-generated method stub return newsList.get(position); } @Override public long getItemId(int position) { // TODO Auto-generated method stub return position; } @Override public View getView(int position, View convertView, ViewGroup arg2) { // TODO Auto-generated method stub if(convertView == null){ convertView = LayoutInflater.from(context).inflate(R.layout.news_item,null) ; } TextView tvTitle = (TextView) convertView.findViewById(R.id.tvTitle) ; TextView tvDesc = (TextView) convertView.findViewById(R.id.tvDesc) ; TextView tvTime = (TextView) convertView.findViewById(R.id.tvTime) ; ImageView ivPic = (ImageView) convertView.findViewById(R.id.ivPic); News news = newsList.get(position) ; tvTitle.setText(news.getTitle()) ; tvDesc.setText(news.getDesc()) ; tvTime.setText(news.getTime()) ; String pic_url = news.getPic_url() ; HttpUtils.setPicBitMap(ivPic, pic_url) ; return convertView; } }
news_item est utilisé pour définir la valeur de chaque élément Format d'affichage
<?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" > <ImageView android:id="@+id/ivPic" android:layout_width="42dp" android:layout_height="42dp" android:src="@drawable/ic_launcher" /> <TextView android:id="@+id/tvTitle" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentTop="true" android:layout_toRightOf="@+id/ivPic" android:text="title" android:textSize="18sp" /> <TextView android:id="@+id/tvDesc" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignLeft="@+id/tvTitle" android:layout_below="@+id/tvTitle" android:text="desc" android:textSize="18sp" /> <TextView android:id="@+id/tvTime" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:text="time" android:textSize="10sp" /> </RelativeLayout>
Remarque : Cet élément doit afficher une seule image, la classe Bitmap est donc utilisé. Puisque la transmission réseau est utilisée, la notion de thread doit être utilisée ! !
La clé est de comprendre la relation entre le message du gestionnaire et la boucle.
Recommandations associées :
configuration nginx accès inter-domaines ajax php api
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!