[英]Parse JSON value to an Activity from a ListView. Beginner
I just learned java and also android app development. 我刚学过Java,还学习了android应用程序开发。
I've been able to populate json
object to a listview
from a web-service
to my NewActivity.class
. 我已经能够将
json
对象填充到从web-service
到NewActivity.class
的listview
。 but having problems with setting OnItemClickListener
for my listview
by parsing json
value from my jsonparser
class to my DetailActivity.class
. 但与设置问题
OnItemClickListener
我的listview
通过解析json
从我的价值jsonparser
类我DetailActivity.class
。
I tried reading some answers from here but got lost at some point. 我试图从这里阅读一些答案,但是在某个时候迷路了。 I Will be very glad if anyone makes an input.
如果有人输入我将非常高兴。 Thanks
谢谢
JSON PARSER CLASS JSON解析器类
public class JSONParser {
public static List<Events> parseFeed(String content) {
try {
JSONArray ar = new JSONArray(content);
List<Events> eventList = new ArrayList<>();
for (int i = 0; i < ar.length(); i++) {
JSONObject obj = ar.getJSONObject(i);
String headline = obj.optString("Content");
Events events = new Events();
events.setId(obj.getInt("id"));
events.setTitle(obj.getString("Title"));
events.setPostDate(obj.getString("PostDate"));
events.setSummary(obj.getString("Summary"));
events.setContent(obj.getString("Content"));
events.setPicture(obj.getString("Picture"));
eventList.add(events);
}
return eventList;
} catch (JSONException e) {
e.printStackTrace();
return null;
}
}
This is my NewActivity.class. 这是我的NewActivity.class。
public class NewActivity extends AppCompatActivity implements AdapterView.OnItemClickListener {
final String LOG = "ListActivity";
private List<Events> eventsList;
private ListView lvEvents;
ProgressBar pb;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_new);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
lvEvents = (ListView) findViewById(R.id.listview1);
pb = (ProgressBar) findViewById(R.id.progressBar);
pb.setVisibility(View.INVISIBLE);
if (isOnline()){
requestData("http://json/events.php");
} else {
Toast.makeText(this, "No Internet Connection", Toast.LENGTH_LONG).show();
}
}
protected void updateDisplay() {
EventListAdapter adapter = new EventListAdapter(this, R.layout.mylist_view, eventsList );
lvEvents.setAdapter(adapter);
lvEvents.setOnItemClickListener(this);
}
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Intent intent = new Intent(NewActivity.this, EventsDetail.class);
intent.putExtra("selectedEvents", eventlist[position]);
startActivity(intent);
}
private void requestData(String uri){
MyTask task = new MyTask();
task.execute(uri);
}
protected boolean isOnline(){
ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo netinfo = cm.getActiveNetworkInfo();
if (netinfo != null && netinfo.isConnectedOrConnecting()) {
return true;
} else {
return false;
}
}
public class MyTask extends AsyncTask<String, String, List<Events>> {
@Override
protected void onPreExecute() {
pb.setVisibility(View.VISIBLE);
}
@Override
protected List<Events> doInBackground(String... params) {
String data = HttpManager.getData(params[0]);
eventsList = JSONParser.parseFeed(data);
for (Events events : eventsList) {
try {
String imageUrl = events.getPicture();
InputStream imageRead = (InputStream) new URL(imageUrl).getContent();
Bitmap bitmap = BitmapFactory.decodeStream(imageRead);
events.setBitmap(bitmap);
imageRead.close();
} catch (Exception e){
e.printStackTrace();
}
}
return eventsList;
}
@Override
protected void onPostExecute(List<Events> results) {
eventsList = results;
updateDisplay();
pb.setVisibility(View.INVISIBLE);
}
}
And this my Events.class 这是我的Events.class
public class Events implements Serializable {
public int id;
public String Title;
public String PostDate;
public String Summary;
public String Content;
public String Picture;
public Bitmap bitmap;
public String getContent() {
return Content;
}
public void setContent(String content) {
Content = content;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getPicture() {
return Picture;
}
public void setPicture(String picture) {
Picture = picture;
}
public String getPostDate() {
return PostDate;
}
public void setPostDate(String postDate) {
PostDate = postDate;
}
public String getSummary() {
return Summary;
}
public void setSummary(String summary) {
Summary = summary;
}
public String getTitle() {
return Title;
}
public void setTitle(String title) {
Title = title;
}
public Bitmap getBitmap() {
return bitmap;
}
public void setBitmap(Bitmap bitmap) {
this.bitmap = bitmap;
}
Lastly my DetailActivity.class which has three TextView to receive the JSON values 最后,我的DetailActivity.class具有三个TextView来接收JSON值
public class EventsDetail extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_events_detail);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
TextView detailname = (TextView) findViewById(R.id.detailTitle);
TextView eventDetail = (TextView) findViewById(R.id.detailContent);
TextView eventDate = (TextView) findViewById(R.id.detailDate);
}
You can try this :) 你可以试试这个:)
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Intent intent = new Intent(NewActivity.this, EventsDetail.class);
//try type casting Events instance as Serializable :)
Events selectedEvent = eventList[position];
intent.putExtra("selectedEvent",(Serializable)selectedEvent);
startActivity(intent);
}
This will add selected event as an arguement to your intent :) which is responsible for invoking eventdetail activity :) 这会将选定的事件作为您的意图的论据:)负责调用eventdetail活动:)
and in event detail activity :) 并在活动详细信息中:)
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_events_detail);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
Events passedEvent = getIntent().getSerializableExtra("selectedEvent");
TextView detailname = (TextView) findViewById(R.id.detailTitle);
TextView eventDetail = (TextView) findViewById(R.id.detailContent);
TextView eventDate = (TextView) findViewById(R.id.detailDate);
//set the textview values now from the recieved events instance :)
}
All being said :) for the above code to work you must implement implements Serializable to your Event class :) 所有人都说:)为了使上述代码正常工作,您必须实现对事件类可序列化的实现:)
This is very simple :) just requires you to specify implement Serializable and write setter and getter for all the properties of Events class :) Thats all :) 这非常简单:)只需要您指定实现Serializable并为Events类的所有属性编写setter和getter :)那就是所有的:)
Here is a link for how to implement serialization :) http://www.vogella.com/tutorials/JavaSerialization/article.html 这是有关如何实现序列化的链接:) http://www.vogella.com/tutorials/JavaSerialization/article.html
Hope my answer helped you :) Happy coding buddy :) 希望我的回答对您有所帮助:)快乐的编码伙伴:)
You need to this way: 您需要这样:
1. Make class Serializable
1.使类可
Serializable
public class Events implements Serializable{
// Other stuff
}
2. onItemClick
of ListView
. 2.
ListView
onItemClick
。
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Intent intent = new Intent(NewActivity.this, EventsDetail.class);
intent.putExtra("object",eventList[position]);
startActivity(intent);
}
3. EventsDetail class. 3. EventsDetail类。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_events_detail);
// Other stuff
Events event = (Events) getIntent().getSerializableExtra("object");
}
Hope this will help you. 希望这会帮助你。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.