package com.example.fudanbbs; import java.io.IOException; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.concurrent.ExecutionException; import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; import org.jsoup.select.Elements; import com.example.fudanbbs.Top10Fragment.top10AsycTask; import android.app.Fragment; import android.app.ProgressDialog; import android.content.Intent; import android.os.AsyncTask; import android.os.Bundle; import android.os.Handler; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.BaseExpandableListAdapter; import android.widget.ExpandableListView; import android.widget.ExpandableListView.OnChildClickListener; import android.widget.LinearLayout; import android.widget.TextView; import android.widget.AdapterView.OnItemClickListener; public class RecommendBoardFragment extends Fragment { private String TAG = "##################"+this.getClass().getName(); private ArrayList<HashMap<String, ArrayList<String[]>>> recommendboardlist; private View rootView; private int textsize; private FudanBBSApplication currentapplication; private HashMap<String, String> cookie; private ProgressDialog progressdialog; private ExpandableListView listview; private expandableAdapter adapter; static class ViewHolder{ TextView boardname; TextView boardnamefake; } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // TODO Auto-generated method stub rootView = inflater.inflate(R.layout.recommendboardfragment, container,false); listview = (ExpandableListView)rootView.findViewById(R.id.recommendBoardexpandableListView); progressdialog = new ProgressDialog(getActivity()); progressdialog.setMessage(getString(R.string.loadingboardlist)); progressdialog.setCancelable(false); progressdialog.setCanceledOnTouchOutside(false); progressdialog.setProgressStyle(progressdialog.STYLE_SPINNER); textsize = 20; recommendBoardAsyncTask task = new recommendBoardAsyncTask(); task.execute(); return rootView; } public class expandableAdapter extends BaseExpandableListAdapter{ ViewHolder holder; @Override public int getGroupCount() { // TODO Auto-generated method stub return recommendboardlist.size(); } @Override public int getChildrenCount(int groupPosition) { // TODO Auto-generated method stub return recommendboardlist.get(groupPosition).get("boards").size(); } @Override public Object getGroup(int groupPosition) { // TODO Auto-generated method stub return null; } @Override public Object getChild(int groupPosition, int childPosition) { // TODO Auto-generated method stub return null; } @Override public long getGroupId(int groupPosition) { // TODO Auto-generated method stub return groupPosition; } @Override public long getChildId(int groupPosition, int childPosition) { // TODO Auto-generated method stub return childPosition; } @Override public boolean hasStableIds() { // TODO Auto-generated method stub return false; } @Override public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) { // TODO Auto-generated method stub TextView textview = new TextView(parent.getContext()); ArrayList arraylist = recommendboardlist.get(groupPosition).get("secinfo"); String[] string = (String[]) arraylist.get(0); textview.setText(" "+string[0]+" "+string[1]); textview.setTextSize(textsize); textview.setPadding(0, 6, 0, 6); return textview; } @Override public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) { // TODO Auto-generated method stub if(null == convertView){ LayoutInflater inflater = LayoutInflater.from(getActivity()); convertView = inflater.inflate(R.layout.recommendboard, null); holder = new ViewHolder(); holder.boardname = (TextView) convertView.findViewById(R.id.boardname); holder.boardnamefake = (TextView) convertView.findViewById(R.id.boardnamefake); convertView.setTag(holder); }else{ holder = (ViewHolder) convertView.getTag(); } ArrayList arraylist = recommendboardlist.get(groupPosition).get("boards"); String[] string = (String[]) arraylist.get(childPosition); holder.boardname.setText(" ["+string[0]+"] "+string[1]); holder.boardname.setPadding(0, 6, 0, 6); holder.boardname.setTextSize(textsize); holder.boardnamefake.setText(string[0]); return convertView; } @Override public boolean isChildSelectable(int groupPosition, int childPosition) { // TODO Auto-generated method stub return true; } } public class recommendBoardAsyncTask extends AsyncTask{ @Override protected void onPreExecute() { // TODO Auto-generated method stub super.onPreExecute(); progressdialog.show(); if(null == recommendboardlist){ recommendboardlist = new ArrayList<HashMap<String, ArrayList<String[]>>>(); }else{ recommendboardlist.clear(); } } @Override protected void onPostExecute(Object result) { // TODO Auto-generated method stub super.onPostExecute(result); adapter = new expandableAdapter(); listview.setAdapter(adapter); listview.setOnChildClickListener(new OnChildClickListener(){ @Override public boolean onChildClick( ExpandableListView parent, View v, int groupPosition, int childPosition, long id) { // TODO Auto-generated method stub TextView boardnamefake = (TextView) v.findViewById(R.id.boardnamefake); TextView boardname = (TextView) v.findViewById(R.id.boardname); Intent intent = new Intent(); intent.setClassName(getActivity(), "com.example.fudanbbs.BoardActivity"); Bundle bundle = new Bundle(); String boardURL = "http://bbs.fudan.edu.cn/bbs/doc?board="+boardnamefake.getText().toString().trim(); bundle.putString("boardURL", boardURL); bundle.putString("boardname", boardname.getText().toString().trim()); intent.putExtras(bundle); startActivity(intent); return false; } }); if(progressdialog.isShowing()){ progressdialog.dismiss(); } } @Override protected Object doInBackground(Object... params) { // TODO Auto-generated method stub Log.v("RecommendBoardFragement", "doInBackground"); currentapplication = (FudanBBSApplication) getActivity().getApplication(); String url = "http://bbs.fudan.edu.cn/bbs/sec"; Document doc; try { if(currentapplication.isCurrentUserGuest()){ Log.v(TAG, "is guest"); doc = Jsoup.connect(url).get(); }else{ cookie = new HashMap<String, String>(); cookie = currentapplication.get_cookie(); Log.v("RecommendBoardFragementcoolie", cookie.get("utmpuser")); doc = Jsoup.connect(url).cookies(cookie).get(); } Elements sections = doc.getElementsByTag("sec"); for(Element section: sections){ HashMap<String, ArrayList<String[]>> map = new HashMap<String, ArrayList<String[]>>(); //add section info to overrall arraylist ArrayList<String[]> sectionarray = new ArrayList<String[]>(); String[] sectionstring = new String[2]; sectionstring[0] = section.attr("id"); sectionstring[1] = section.attr("desc"); sectionarray.add(sectionstring); map.put("secinfo", sectionarray); // add each board info to overrall arraylist Elements boards = section.getElementsByAttribute("name"); ArrayList<String[]> boardarray = new ArrayList<String[]>(); for(Element board: boards){ String[] boardstring = new String[2]; boardstring[0] = board.attr("name"); boardstring[1] = board.attr("desc"); boardarray.add(boardstring); } map.put("boards", boardarray); recommendboardlist.add(map); } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } return null; } } }