从网络获取json后实现新闻列表界面

public class MainActivity extends Activity implements OnItemClickListener{

private ListView lvNews;
private NewsAdapter adapter;
private List<News> newsList;

//此处需要修改为自己的服务器地址
public static final String GET_NEWS_URL = "http://172.31.28.208/NewsDemo/getNewsJSON.php";

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");
newsList.add(new News(title, desc, time, content_url, pic_url));
}
adapter.notifyDataSetChanged();
} catch (Exception e) {
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 void onItemClick(AdapterView<?> arg0, View arg1, int position, long arg3) {
News news = newsList.get(position);
Intent intent = new Intent(this, BrowseNewsActivity.class);
intent.putExtra("content_url", news.getContent_url());
startActivity(intent);
}

}


布局文件:

<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:orientation="vertical"
    tools:context=".MainActivity" >
    <ListView
        android:id="@+id/lvNews"
        android:layout_width="match_parent"
        android:layout_height="match_parent" >
    </ListView>

</LinearLayout>


public class News {

private String title;
private String desc;
private String time;
private String content_url;
private String pic_url;

public News(String title, String desc, String time, String content_url, String pic_url){
setTitle(title);
setDesc(desc);
setTime(time);
setContent_url(content_url);
setPic_url(pic_url);
}

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;
}
public String getTime() {
return time;
}
public void setTime(String time) {
this.time = time;
}
public String getContent_url() {
return content_url;
}
public void setContent_url(String content_url) {
this.content_url = content_url;
}
public String getPic_url() {
return pic_url;
}
public void setPic_url(String pic_url) {
this.pic_url = pic_url;
}

}

public class NewsAdapter extends BaseAdapter {

private Context context;
private List<News> newsList;

public NewsAdapter(Context context, List<News> newsList){
this.context = context;
this.newsList = newsList;
}


@Override
public int getCount() {
return newsList.size();
}


@Override
public News getItem(int position) {
return newsList.get(position);
}


@Override
public long getItemId(int position) {
return position;
}


@Override
public View getView(int position, View convertView, ViewGroup parent) {
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;
}
}

<?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_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_below="@id/tvTitle"
        android:layout_toRightOf="@id/ivPic"
        android:text="desc" />


    <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>



public class HttpUtils {//这个类最关键的,从网络获取json数据,发送到handle处理后显示出来

public static void getNewsJSON(final String url, final Handler handler){

new Thread(new Runnable() {
@Override
public void run() {
HttpURLConnection conn;
InputStream is;
try {
conn = (HttpURLConnection) new URL(url).openConnection();
conn.setRequestMethod("GET");
is = conn.getInputStream();
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 = result.toString();
handler.sendMessage(msg);
} catch (Exception e) {
e.printStackTrace();

}
}).start();
}

public static void setPicBitmap(final ImageView ivPic, final String pic_url){//通过网络获取图片,显示到ImageView上面
new Thread(new Runnable() {
@Override
public void run() {
try {
HttpURLConnection conn = (HttpURLConnection) new URL(pic_url).openConnection();
conn.connect();
InputStream is = conn.getInputStream();
Bitmap bitmap = BitmapFactory.decodeStream(is);
ivPic.setImageBitmap(bitmap);
is.close();
} catch (Exception e) {
e.printStackTrace();

}
}).start();
}

}

public class BrowseNewsActivity extends Activity {

private WebView webView;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.acitivy_browse_news);

webView = (WebView) findViewById(R.id.webView);
String pic_url = getIntent().getStringExtra("content_url");
webView.loadUrl(pic_url);
webView.getSettings().setJavaScriptEnabled(true);
webView.getSettings().setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);
}
}

<?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:id="@+id/webView"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />


</LinearLayout>





  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,这是一个比较典型的 Android 开发流程。我会尽可能详细地回答你的问题。 1. 使用 OkHttp 请求数据 首先,你需要在你的项目中添加 OkHttp 的依赖。可以在 `build.gradle` 文件中添加以下代码: ```groovy implementation 'com.squareup.okhttp3:okhttp:4.9.0' ``` 接下来,你可以在你的 Activity 中使用 OkHttp 发送 GET 请求获取数据。这里假设你要获取一个名为 `news.json` 的 JSON 数据文件。代码如下: ```java OkHttpClient client = new OkHttpClient(); String url = "http://yourdomain.com/news.json"; Request request = new Request.Builder() .url(url) .build(); try { Response response = client.newCall(request).execute(); if (response.isSuccessful()) { String jsonData = response.body().string(); // 在这里处理 JSON 数据 } else { // 处理请求失败的情况 } } catch (IOException e) { e.printStackTrace(); // 处理网络错误的情况 } ``` 2. 解析 JSON 数据 接下来,你需要将获取到的 JSON 数据解析成 Java 对象。这里我推荐使用 Google 提供的 Gson 库。你可以在 `build.gradle` 文件中添加以下代码: ```groovy implementation 'com.google.code.gson:gson:2.8.7' ``` 然后,你可以在你的代码中使用 Gson 将 JSON 数据解析成 Java 对象。假设你的 JSON 数据结构如下: ```json { "news": [ { "id": 1, "title": "News title 1", "content": "News content 1" }, { "id": 2, "title": "News title 2", "content": "News content 2" }, ... ] } ``` 那么对应的 Java 类可以定义如下: ```java public class News { private int id; private String title; private String content; // 这里省略了 getter 和 setter 方法 } ``` 然后,你可以使用以下代码将 JSON 数据解析成 Java 对象: ```java Gson gson = new Gson(); NewsList newsList = gson.fromJson(jsonData, NewsList.class); ``` 其中,`NewsList` 类是一个包含 `List<News>` 的类,可以定义如下: ```java public class NewsList { private List<News> news; // 这里省略了 getter 和 setter 方法 } ``` 3. 存储数据数据库 接下来,你可以将解析得到的数据存储到数据库中。这里我推荐使用 Android 自带的 SQLite 数据库。具体操作可以参考官方文档:https://developer.android.com/training/data-storage/sqlite 4. 在 ListView 中展示数据 最后,你可以在你的 Activity 中使用 ListView 来展示数据。具体操作可以参考官方文档:https://developer.android.com/guide/topics/ui/layout/listview 假设你的 ListView 的 item 布局文件为 `news_item.xml`,代码如下: ```xml <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="wrap_content"> <TextView android:id="@+id/news_title" android:layout_width="match_parent" android:layout_height="wrap_content" android:textSize="18sp" android:textStyle="bold" /> <TextView android:id="@+id/news_content" android:layout_width="match_parent" android:layout_height="wrap_content" /> </LinearLayout> ``` 然后,你可以在你的代码中使用 `ArrayAdapter` 来将数据绑定到 ListView 上。代码如下: ```java // 假设你已经将解析得到的 Java 对象存储在 newsList 变量中了 List<News> news = newsList.getNews(); ArrayAdapter<News> adapter = new ArrayAdapter<News>(this, R.layout.news_item, news) { @Override public View getView(int position, View convertView, ViewGroup parent) { if (convertView == null) { convertView = LayoutInflater.from(getContext()).inflate(R.layout.news_item, parent, false); } News news = getItem(position); TextView titleTextView = (TextView) convertView.findViewById(R.id.news_title); titleTextView.setText(news.getTitle()); TextView contentTextView = (TextView) convertView.findViewById(R.id.news_content); contentTextView.setText(news.getContent()); return convertView; } }; ListView listView = (ListView) findViewById(R.id.list_view); listView.setAdapter(adapter); ``` 5. 添加单击事件 最后,你可以在 ListView 上添加单击事件,实现跳转到详情页面的功能。代码如下: ```java listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { News news = (News) parent.getItemAtPosition(position); Intent intent = new Intent(MainActivity.this, NewsDetailActivity.class); intent.putExtra("news_id", news.getId()); startActivity(intent); } }); ``` 其中,`NewsDetailActivity` 是你要跳转到的详情页面的 Activity。在 `NewsDetailActivity` 中,你可以根据 `news_id` 从数据库中获取对应的新闻数据,然后展示在页面上。 好了,以上就是实现新闻界面展示的完整流程。希望对你有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值