简体   繁体   English

从ListView将JSON值解析为Activity。 初学者

[英]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-serviceNewActivity.classlistview 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.

相关问题 安卓 列表显示。 从活动1过渡到活动2中的片段 - Android. ListView. Transition to fragment in activity2 from activity1 Android:从列表视图中点击的项目计算价格。 应用程序在总活动中崩溃 Logcat:Invalid float: &quot;&quot; - Android: Calculate price from clicked items in listview. App crashes in total activity Logcat:Invalid float: "" 复选框未在arraylist上单击时未在列表中添加值 - Value not added in arraylist on checkbox click in listview. 将选定的字段从ArrayList加载到ListView。 - Load selected fields from ArrayList to ListView. 您好,我正在尝试将 url 中的 json 数据显示到列表视图中。 虽然什么都没有显示 - Hello i am trying to display json data from url into listview. Nothing is displayed though Android 6棉花糖ListView。 使用运行时权限开始活动 - Android 6 Marshmallow ListView. Start activity with runtime permissions JSON - 帮助将 JSONArray 转换为 Arraylist 并填充列表视图。 - JSON - Help Converting JSONArray to Arraylist and populate a listview. 存储在自定义ListView中的复选框的值。 - Storing value of checkbox that lies inside custom ListView. Android:从列表视图中删除SQLite项目。 空指针异常 - Android: delete SQLite item from listview. NullPointerException 从具有JSON的listView启动新活动 - Launching a new activity from a listView that has JSON
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM