package cheng.app.cnbeta; import android.app.Activity; import android.content.Context; import android.os.AsyncTask; import android.os.Bundle; import android.support.v4.app.ListFragment; import android.text.TextUtils; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.widget.ArrayAdapter; import android.widget.Button; import android.widget.ListView; import android.widget.TextView; import android.widget.Toast; import cheng.app.cnbeta.util.Configs; import cheng.app.cnbeta.util.DataUtil; import cheng.app.cnbeta.util.HttpUtil; import cheng.app.cnbeta.util.TimeUtil; import java.lang.ref.WeakReference; import java.util.LinkedList; import java.util.List; public class PageCommentsFragment extends ListFragment { private List<CBComment> mData = new LinkedList<CBComment>(); private CommentListAdapter mAdapter; private boolean mIsLoading; private OnClickListener mSupportListener = new OnClickListener() { @Override public void onClick(View v) { CBComment cmt = (CBComment) v.getTag(); if (cmt != null) { new ActionTask(PageCommentsFragment.this, ActionTask.TYPE_SUPPORT, cmt.tid).execute(); } } }; private OnClickListener mAgainstListener = new OnClickListener() { @Override public void onClick(View v) { CBComment cmt = (CBComment) v.getTag(); if (cmt != null) { new ActionTask(PageCommentsFragment.this, ActionTask.TYPE_AGAINST, cmt.tid).execute(); } } }; public void support(long tid) { if (!mData.isEmpty()) { int size = mData.size(); for (int i = 0; i < size; i++) { CBComment item = mData.get(i); if (item.tid == tid) { item.support += 1; mData.set(i, item); break; } } } mAdapter.notifyDataSetChanged(); } public void aggainst(long tid) { if (!mData.isEmpty()) { int size = mData.size(); for (int i = 0; i < size; i++) { CBComment item = mData.get(i); if (item.tid == tid) { item.against += 1; mData.set(i, item); break; } } } mAdapter.notifyDataSetChanged(); } @Override public void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); } @Override public void onViewCreated(View view, Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); ListView lv = getListView(); lv.setItemsCanFocus(true); lv.setDrawSelectorOnTop(true); lv.setDivider(view.getResources().getDrawable(android.R.color.transparent)); lv.setDividerHeight(view.getResources().getDimensionPixelSize(R.dimen.multipane_padding)); setEmptyText(getString(R.string.cmt_empty_text)); mAdapter = new CommentListAdapter(getActivity(), mData); lv.setAdapter(mAdapter); } @Override public void onActivityCreated(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onActivityCreated(savedInstanceState); } public void LoadData(long articleId) { if (mIsLoading) return; if (mData.isEmpty()) { setListShown(false); mIsLoading = true; new LoadTask(this).execute(articleId); } else { setListShown(true); mAdapter.notifyDataSetChanged(); } } class CommentListAdapter extends ArrayAdapter<CBComment> { final LayoutInflater mInflater; public CommentListAdapter(Context context, List<CBComment> list) { super(context, 0, list); mInflater = LayoutInflater.from(context); } @Override public View getView(int position, View convertView, ViewGroup parent) { CommentViewHolder holder = null; if (convertView == null) { convertView = mInflater.inflate(R.layout.cmt_list_item, null); } Object tag = convertView.getTag(); if (tag instanceof CommentViewHolder) { holder = (CommentViewHolder) tag; } CBComment item = getItem(position); if (holder == null) { holder = new CommentViewHolder(); convertView.setTag(holder); holder.name = (TextView) convertView.findViewById(R.id.cmt_list_name); holder.time = (TextView) convertView.findViewById(R.id.cmt_list_time); holder.comment = (TextView) convertView.findViewById(R.id.cmt_list_text); holder.support = (Button) convertView.findViewById(R.id.cmt_list_support); holder.against = (Button) convertView.findViewById(R.id.cmt_list_against); holder.support.setOnClickListener(mSupportListener); holder.against.setOnClickListener(mAgainstListener); } holder.support.setTag(item); holder.against.setTag(item); if (TextUtils.isEmpty(item.name)) holder.name.setText(R.string.no_name); else holder.name.setText(item.name); holder.comment.setText(item.comment); holder.time.setText(TimeUtil.formatTime(getContext(), item.date)); holder.support.setText(String.valueOf(item.support)); holder.against.setText(String.valueOf(item.against)); return convertView; } } static class CommentViewHolder { TextView name; TextView time; TextView comment; Button support; Button against; } static class ActionTask extends AsyncTask<Void, Void, String> { private WeakReference<PageCommentsFragment> mFragment; static final int TYPE_SUPPORT = 0; static final int TYPE_AGAINST = 1; static final int TYPE_REPORT = 2; int mType; long mTid; ActionTask(PageCommentsFragment f, int type, long tid) { mFragment = new WeakReference<PageCommentsFragment>(f); mType = type; mTid = tid; } @Override protected String doInBackground(Void... params) { String result = null; switch (mType) { case TYPE_SUPPORT: result = HttpUtil.getInstance().httpGet(Configs.SUPPORT_URL + mTid); break; case TYPE_AGAINST: result = HttpUtil.getInstance().httpGet(Configs.AGGAINST_URL + mTid); break; case TYPE_REPORT: result = HttpUtil.getInstance().httpGet(Configs.REPORT_URL + mTid); break; } return result; } @Override protected void onPostExecute(String result) { PageCommentsFragment f = mFragment.get(); if (f == null || !f.isResumed()) { return; } Activity a = f.getActivity(); if (a == null || a.isFinishing()) { return; } if (!TextUtils.isEmpty(result)) { switch (mType) { case TYPE_SUPPORT: if (result.substring(0, 1).equals("0")) { f.support(mTid); Toast.makeText(a, R.string.vote_success, Toast.LENGTH_SHORT).show(); } else { Toast.makeText(a, R.string.vote_fail, Toast.LENGTH_SHORT).show(); } break; case TYPE_AGAINST: if (result.substring(0, 1).equals("0")) { f.aggainst(mTid); Toast.makeText(a, R.string.vote_success, Toast.LENGTH_SHORT).show(); } else { Toast.makeText(a, R.string.vote_fail, Toast.LENGTH_SHORT).show(); } break; case TYPE_REPORT: if (result.substring(0, 1).equals("0")) { Toast.makeText(a, R.string.report_success, Toast.LENGTH_SHORT).show(); } else if (result.substring(0, 1).equals("1")) { Toast.makeText(a, R.string.report_fail_1, Toast.LENGTH_SHORT).show(); } else if (result.substring(0, 1).equals("2")) { Toast.makeText(a, R.string.report_fail_2, Toast.LENGTH_SHORT).show(); } else { Toast.makeText(a, R.string.report_fail_3, Toast.LENGTH_SHORT).show(); } break; } } } } private static class LoadTask extends AsyncTask<Long, Void, List<CBComment>> { private WeakReference<PageCommentsFragment> mFragment; public LoadTask(PageCommentsFragment f) { mFragment = new WeakReference<PageCommentsFragment>(f); } @Override protected List<CBComment> doInBackground(Long... params) { long articleId = params[0]; return DataUtil.readComments(articleId); } @Override protected void onPostExecute(List<CBComment> result) { PageCommentsFragment f = mFragment.get(); if (f != null && f.isResumed()) { if (result != null) { f.mData.clear(); f.mData.addAll(result); } f.mAdapter.notifyDataSetChanged(); f.mIsLoading = false; f.setListShown(true); } } } }