2016-04-18 51 views
0

我剛學過java,也是android應用程序開發。將JSON值解析爲ListView中的Activity。初學者

我已經能夠將json對象填充到listviewweb-service到我的NewActivity.class。但通過將json值從我的jsonparser類解析爲我的DetailActivity.class而在設置OnItemClickListener for listview時遇到問題。

我試着從這裏讀到一些答案,但在某個時候迷了路。如果有人提出意見,我會很高興。由於

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

} 

這是我的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); 
    } 

} 

這我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; 
} 

最後我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); 

} 
+0

你必須通過選定的事件作爲一個爭議,意圖是你已經創建了調用事件詳細信息活動這是所有的朋友:) –

+0

@Phrytz,你有沒有嘗試過我的解決方案? –

+0

是的,但也許我做得不對。我認爲你必須看看NewActivity.class是如何構建的。我編輯了我的NewActivity.class看看。 @SandeepBhandari – Phrytz

回答

0

你可以試試這個:)

@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 a DD選擇的事件作爲arguement到你的意圖:)它負責調用eventdetail活動:)

,並在事件詳細活動:)

@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 :) 
} 

一切都這樣說:)上面的代碼工作,你必須實現實現Serializable你的事件類:)

這是很簡單的:)只需要你指定實現Serializable寫setter和getter的活動類的所有屬性:)這就是所有:)

這裏是一個鏈接如何實現系列化:) http://www.vogella.com/tutorials/JavaSerialization/article.html

希望我的回答幫你:)編碼愉快的好友:)

+0

我實現了serialisable,並且已經有了setter和getter,但是沒有工作。你的意思是「intent.put」或「intent.putExtra」,因爲「intent.put」給了我一個錯誤。以及來自「eventList [position]」的地方。無論如何,感謝您的努力 – Phrytz

+0

hey Phrytz :)在你的NewActivity.class中有一個名爲你聲明適配器的方法,你將一個數組eventList作爲參數傳遞給你:)你所要做的就是聲明一個實例屬性爲NewActivity並將該數組保存在該屬性中:)以便可以從類中的所有方法訪問數組:)不要將它作爲局部變量:)並且是的,您是正確的它是putExtra :)對於錯誤抱歉: )當我發佈它的時候有丁當工作室:)所以犯了一個錯誤:)我更新了我的答案:) –

+0

如果你仍然有問題在這裏留下評論哥們:) –

0

你需要這樣:

製作類Serializable

public class Events implements Serializable{ 

// Other stuff 

} 

2.onItemClick of ListView

@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); 
} 

EventsDetail類。

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

    // Other stuff 

    Events event = (Events) getIntent().getSerializableExtra("object"); 

} 

希望這會對你有幫助。

+0

@Phrytz,你有沒有嘗試過這種解決方案? –