Java 集成新闻源不显示(ANDROID KITKAT)
因此,我正在为爱狗者创建一个应用程序(大学项目),我正在尝试创建一个集成的新闻提要,显示与狗有关的新闻,点击后会将用户带到网站。我做了一个虚拟应用程序来测试系统,它工作得非常好。当我把它切换到我目前的狗应用程序,它完全停止工作。问题是,我用来显示文章列表的活动完全没有显示任何内容 这里有两个活动,一个链接活动和一个新闻项目活动。“链接”活动是页面使用的主要活动,并以某种方式在页面上显示文本。newsItem活动充当getter,通过JSON文件查找数组中的某些单词,并将它们解析回应用程序。我还使用localHost来托管JSON文件 如果你们能帮我,那太不可思议了!我撞到了一堵完整的砖墙 Links\u活动类连接到Activity\u Links.xml文件 newsItem类连接到Article.xml文件 链接\u活动类Java 集成新闻源不显示(ANDROID KITKAT),java,android,json,xml,feed,Java,Android,Json,Xml,Feed,因此,我正在为爱狗者创建一个应用程序(大学项目),我正在尝试创建一个集成的新闻提要,显示与狗有关的新闻,点击后会将用户带到网站。我做了一个虚拟应用程序来测试系统,它工作得非常好。当我把它切换到我目前的狗应用程序,它完全停止工作。问题是,我用来显示文章列表的活动完全没有显示任何内容 这里有两个活动,一个链接活动和一个新闻项目活动。“链接”活动是页面使用的主要活动,并以某种方式在页面上显示文本。newsItem活动充当getter,通过JSON文件查找数组中的某些单词,并将它们解析回应用程序。我还使
package uk.ac.napier.doggo;
import android.content.Intent;
import android.net.Uri;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
import com.android.volley.DefaultRetryPolicy;
import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.JsonObjectRequest;
import com.android.volley.toolbox.Volley;
import com.squareup.picasso.Picasso;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.ArrayList;
import java.util.List;
public class Links_Activity extends AppCompatActivity {
private List<newsItem> newsFeed = new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_links);
engine();
addClickListener();
}
private void engine() {
RequestQueue queue = Volley.newRequestQueue(this);
JsonObjectRequest myReq = new JsonObjectRequest(Request.Method.GET,
"http://10.0.2.2/news.json",
null,
new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
try {
JSONArray newsItems = response.getJSONArray("newsItems");
for (int i = 0; i < newsItems.length(); i++) {
JSONObject temp = newsItems.getJSONObject(i);
String image = temp.getString("image");
String title = temp.getString("title");
String time = temp.getString("time");
String date = temp.getString("date");
String content = temp.getString("content");
String link = temp.getString("link");
newsFeed.add(new newsItem(title, content, date, time, link, image));
}
} catch(JSONException e){
Log.i("myTag", e.toString());
}
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Log.i("myTag", error.toString());
}
});
myReq.setRetryPolicy(new DefaultRetryPolicy(
30*1000,
DefaultRetryPolicy.DEFAULT_MAX_RETRIES,
DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
queue.add(myReq);
ArrayAdapter<newsItem> adapter = new customAdapter();
ListView newsItems = (ListView) (findViewById(R.id.newsItems));
newsItems.setAdapter(adapter);
}
private void addClickListener() {
ListView newsItems = (ListView) (findViewById(R.id.newsItems));
newsItems.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
newsItem currentItem = newsFeed.get(position);
Intent i = new Intent (Intent.ACTION_VIEW);
i.setData(Uri.parse(currentItem.getUrl()));
startActivity(i);
}
});
}
private class customAdapter extends ArrayAdapter<newsItem> {
public customAdapter() {
super(Links_Activity.this, R.layout.article, newsFeed);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if(convertView == null) {
convertView = getLayoutInflater().inflate(R.layout.article, parent, false);
}
newsItem currentItem = newsFeed.get(position);
ImageView newsImage = (ImageView) convertView.findViewById(R.id.leftIco);
TextView heading = (TextView) convertView.findViewById(R.id.heading);
TextView desc = (TextView) convertView.findViewById(R.id.desc);
heading.setText(currentItem.getNewsHeading());
desc.setText(currentItem.getNewsDesc());
Picasso.with(Links_Activity.this).load(currentItem.getImageURL()).into(newsImage);
return convertView;
}
}
public void Back(View view) {
Intent startBackActivity = new Intent(this, Menu_Activity.class);
startActivity(startBackActivity);
}
}
package uk.ac.napier.doggo;
import java.util.PriorityQueue;
/**
* Created by MarkB on 10/03/2017.
*/
public class newsItem {
private String newsHeading;
private String newsDesc;
private String newsDescSmall;
private String time;
private String date;
private String url;
private String imageURL;
public newsItem(String newsHeading, String newsDesc, String date, String time, String url, String imageURL) {
this.newsHeading = newsHeading;
this.newsDesc = newsDesc;
this.time = time;
this.date = date;
this.url = url;
this.imageURL = imageURL;
this.newsDescSmall = this.newsDesc.substring(0, 50) + "...";
}
public String getNewsHeading() {
return newsHeading;
}
public String getNewsDesc() {
return newsDesc;
}
public String getTime() {
return time;
}
public String getDate() {
return date;
}
public String getUrl() {
return url;
}
public String getImageURL() {
return imageURL;
}
}
article.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="News Feed"
android:textSize="25sp"
android:textAlignment="center"
android:id="@+id/logo"
android:layout_alignParentRight="true"
android:layout_alignParentEnd="true"/>
<TextView
android:text="Articles Courtesy of Dogster.com"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/textView"
android:layout_alignParentBottom="true"
android:layout_alignParentStart="true" />
<ListView
android:layout_width="wrap_content"
android:layout_height="400dp"
android:id="@+id/newsItems"
android:layout_centerVertical="true"
android:layout_alignParentStart="true" />
</RelativeLayout>
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="10dp">
<ImageView
android:layout_width="80dp"
android:layout_height="100dp"
android:id="@+id/leftIco"
android:src="@mipmap/ic_launcher"
android:maxHeight="100dp"
android:maxWidth="100dp"
android:adjustViewBounds="true"
android:layout_alignParentTop="true"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="16sp"
android:text="Heading Text"
android:id="@+id/heading"
android:scrollHorizontally="false"
android:maxLines="100"
android:ellipsize="none"
android:layout_alignParentTop="true"
android:layout_toRightOf="@+id/leftIco"
android:layout_toEndOf="@+id/leftIco"
android:layout_marginLeft="24dp"
android:layout_marginStart="24dp"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Description"
android:id="@+id/desc"
android:lineSpacingExtra="-3dp"
android:layout_marginBottom="26dp"
android:layout_alignBottom="@+id/leftIco"
android:layout_alignLeft="@+id/heading"
android:layout_alignStart="@+id/heading"/>
</RelativeLayout>
试试这个:
将数组项传递给适配器:
customAdapter adapter = new customAdapter(this, newsFeed);
ListView newsItems = (ListView) (findViewById(R.id.newsItems));
newsItems.setAdapter(adapter);
现在在适配器类中使用:
private List<newsItem> newsFeed_list ;
public customAdapter(Context context, ArrayList<newsItem> items) {
super(context, items);
this.newsFeed_list = items;
}
您从未调用过适配器。notifyDataSetChanged() 但是,您有一个ArrayAdapter,因此只需添加到其中,而不是Arraylist,您就不需要通知了
// See here
adapter.add(new newsItem(title, content, date, time, link, image));
} // end loop
} catch(JSONException e){
Log.i("myTag", e.toString());
}
对代码的一些重新安排应该是可行的
public class LinksActivity extends AppCompatActivity
implements AdapterView.OnItemClickListener, Response.ErrorListener {
private List<NewsItem> newsFeed = new ArrayList<>();
private ArrayAdapter<NewsItem> adapter;
// Moved the Volley response to top-level
private Response.Listener<JSONObject> newsListener = new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
try {
JSONArray newsItems = response.getJSONArray("newsItems");
for (int i = 0; i < newsItems.length(); i++) {
JSONObject temp = newsItems.getJSONObject(i);
String image = temp.getString("image");
String title = temp.getString("title");
String time = temp.getString("time");
String date = temp.getString("date");
String content = temp.getString("content");
String link = temp.getString("link");
newsFeed.add(new newsItem(title, content, date, time, link, image));
}
// Important!
adapter.notifyDataSetChanged();
} catch(JSONException e){
Log.i("myTag", e.toString());
}
}
};
// This is Volley's error listener over the entire Activity
@Override
public void onErrorResponse(VolleyError error) {
Log.i("myTag", error.toString());
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_links);
// Set and define the List and Adapter here
ListView newsItems = (ListView) findViewById(R.id.newsItems);
newsItems.setOnItemClickListener(this);
adapter = new CustomAdapter();
newsItems.setAdapter(adapter);
engine();
}
private void engine() {
RequestQueue queue = Volley.newRequestQueue(this);
// Now this method is much 'cleaner'
JsonObjectRequest myReq = new JsonObjectRequest(Request.Method.GET,
"http://10.0.2.2/news.json",
null,
newsListener, this);
myReq.setRetryPolicy(new DefaultRetryPolicy(
30*1000,
DefaultRetryPolicy.DEFAULT_MAX_RETRIES,
DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
queue.add(myReq);
}
// The Activity itself handles the clicking
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
NewsItem currentItem = newsFeed.get(position);
Intent i = new Intent (Intent.ACTION_VIEW);
i.setData(Uri.parse(currentItem.getUrl()));
startActivity(i);
}
}
公共类链接活动扩展了AppCompative活动
实现AdapterView.OnItemClickListener、Response.ErrorListener{
private List newsFeed=new ArrayList();
专用阵列适配器;
//将截击反应移动到最高级别
private Response.Listener newsListener=新的Response.Listener(){
@凌驾
公共void onResponse(JSONObject响应){
试一试{
JSONArray新闻项=response.getJSONArray(“新闻项”);
对于(int i=0;i
是否存在任何有用的错误?此代码是否生成?customAdapter
方法看起来可疑。代码生成很好,但没有显示任何相关错误。我认为这可能与本地主机和JSON对象请求有关。为什么不在您的onResponse
中打印所述JSON来确保它与JSON有关?查明问题是什么将是调试问题的良好的第一步。我是否做了与catch异常类似的事情来进行调试?我仍然是Android的一个noob你能告诉我在Links_活动中会去哪里吗?我不完全明白我到底把这些信息放在哪里了,以及如何处理这些信息。我对安卓开发非常陌生,它不是安卓专用的。它只是java。您已经有了新闻源。添加。我知道这很令人沮丧,但你必须明白我是一个彻头彻尾的笨蛋。你能给我看看代码和它的位置吗?比如说写代码,因为我不理解术语或者这些方法是如何工作的。基本上,你成功地添加到了一个列表中,是的。但是Android不会更新ArrayAdapter,除非你明确告诉它。因此,adapter.notifyDataSetChanged()
需要位于onResponse
中的循环的之后。你可以看到我对相关部分的回答
newsItem currentItem = newsFeed_list.get(position);
newsFeed.add(new newsItem(title, content, date, time, link, image));
} // end loop
// notify the adapter to display the new data
adapter.notifyDataSetChanged()
} catch(JSONException e){
Log.i("myTag", e.toString());
}
// See here
adapter.add(new newsItem(title, content, date, time, link, image));
} // end loop
} catch(JSONException e){
Log.i("myTag", e.toString());
}
public class LinksActivity extends AppCompatActivity
implements AdapterView.OnItemClickListener, Response.ErrorListener {
private List<NewsItem> newsFeed = new ArrayList<>();
private ArrayAdapter<NewsItem> adapter;
// Moved the Volley response to top-level
private Response.Listener<JSONObject> newsListener = new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
try {
JSONArray newsItems = response.getJSONArray("newsItems");
for (int i = 0; i < newsItems.length(); i++) {
JSONObject temp = newsItems.getJSONObject(i);
String image = temp.getString("image");
String title = temp.getString("title");
String time = temp.getString("time");
String date = temp.getString("date");
String content = temp.getString("content");
String link = temp.getString("link");
newsFeed.add(new newsItem(title, content, date, time, link, image));
}
// Important!
adapter.notifyDataSetChanged();
} catch(JSONException e){
Log.i("myTag", e.toString());
}
}
};
// This is Volley's error listener over the entire Activity
@Override
public void onErrorResponse(VolleyError error) {
Log.i("myTag", error.toString());
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_links);
// Set and define the List and Adapter here
ListView newsItems = (ListView) findViewById(R.id.newsItems);
newsItems.setOnItemClickListener(this);
adapter = new CustomAdapter();
newsItems.setAdapter(adapter);
engine();
}
private void engine() {
RequestQueue queue = Volley.newRequestQueue(this);
// Now this method is much 'cleaner'
JsonObjectRequest myReq = new JsonObjectRequest(Request.Method.GET,
"http://10.0.2.2/news.json",
null,
newsListener, this);
myReq.setRetryPolicy(new DefaultRetryPolicy(
30*1000,
DefaultRetryPolicy.DEFAULT_MAX_RETRIES,
DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
queue.add(myReq);
}
// The Activity itself handles the clicking
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
NewsItem currentItem = newsFeed.get(position);
Intent i = new Intent (Intent.ACTION_VIEW);
i.setData(Uri.parse(currentItem.getUrl()));
startActivity(i);
}
}