策划在itv程序中加入留言板模块,老板掏不出来外包钱所以只有自己做了。在功能上具有主帖列表和跟帖列表界面,发主贴,发跟帖,刷新列表就这些功能,暂时没有好友等类似百度贴吧app的功能。(PS:我自己的代码写出来无所谓,特意删除实现的都是公司前辈的代码,我不会说也别问我!)
其中:1、实现逻辑是具有3个缓存,pTargetList是主动更新用的。pIndeedList是实际listadapter的数据。m_pFreshNewList也是主动更新用的。
2、其中的listview控件是网上下载的。稍微改了下。后续将会专门写出自己的心得。
package com.itv.v.view;
import java.util.List;
import android.content.Intent;
import android.os.Bundle;
import android.os.Message;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.TextView;
import com.itv.Define;
import com.itv.c.entity.BlogTotalType;
import com.itv.c.entity.IEntity;
import com.itv.c.view.R;
import com.itv.u.CodeUtil;
import com.itv.u.ImageUtil;
import com.itv.u.listview.DropDownListView;
import com.itv.u.listview.GetDataTask.IGetDataTaskCallback;
import com.itv.u.listview.IListAdpterCallBack;
import com.itv.u.listview.ListAdpter;
/**
* 总的留言板分为3个:谈天说地,游戏心得,玩家反馈
*
* 虽然分为3个但是区别仅是信息不一样,所以用一个Activity来表示全部
*
* @author Administrator
*
*/
public class BlogActivity extends BaseActivity {
private String TAG = "BlogActivity";
@Override
protected void onPause() {
super.onPause();
pAddTag = 0 ;
}
@Override
protected void onResume() {
super.onResume();
//这种情况是为了应对添加一个主题条目制作
if( pAddTag == 1 )
{
sendRefreshDataRequest () ;
}
//这种情况是为了返回跟新回帖信息制作
if(m_pUpdateNumTag == 2)
{
m_pUpdateNumTag = -1 ;
BlogTotalType pBlog = (BlogTotalType) pIndeedList.get(m_pUpdateNumId) ;
pBlog.m_nPostNum = pBlog.m_nPostNum +1 ;
pListAdpter.updateItem(m_pUpdateNumId,pBlog) ;
pListAdpter.notifyDataSetChanged() ;
}
}
public static int pAddTag ;
private int m_nBlogType;// 1 谈天。。,2游戏。。,3玩家反馈。
public static List<IEntity> pTargetList;
public List<IEntity> pIndeedList;
public static List<IEntity> m_pFreshNewList ;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
pTargetList = null;
pIndeedList = null;
m_pFreshNewList = null ;
initLayoutForAnyScreen();
}
@Override
public void onBackPressed() {
pTargetList = null;
pIndeedList = null;
m_pFreshNewList = null ;
m_pUpdateNumTag = -1 ;
m_pUpdateNumId = - 1;
super.onBackPressed();
}
@Override
void initLayoutForAnyScreen() {
setContentView(R.layout.blog_total);
mInflater = LayoutInflater.from(this) ;
Intent intent = getIntent();
int tag = intent.getIntExtra(Define.TAG, -1); //这个仅仅是区别进入的是那个主题的留言板
fixXY();
m_nBlogType = tag;
decroateTitle(tag);
addListener();
addTotalBlog();
}
private IViewListener pList = new MyViewListener();
private void addTotalBlog() {
MainActivity.pManager.getBloginfoByPostclass(0, m_nBlogType, pList); //0:请求数据集合的初始索引即从id为0开始的N条数据。
}
private void addListener() {
OnClickListener pLi = new MyListener();
CodeUtil.AddImageButtonListener(this, R.id.blog_total_backBtn, pLi);
CodeUtil.addViewListener(this, R.id.blog_total_btn, pLi) ;
}
class MyViewListener implements IViewListener {
@Override
public void OnError(int nErrCode) {
switch(nErrCode)
{
case 0:
findViewById(R.id.blog_total_process) .setVisibility(View.GONE) ;
CustomToast.showToast(BlogActivity.this,"请求主贴列表失败!", 1000) ;
break ;
case 1:
findViewById(R.id.blog_total_process) .setVisibility(View.GONE) ;
CustomToast.showToast(BlogActivity.this,"主帖获得完毕,但内容为空!", 1000) ;
break ;
case 3://网络获取出错
CustomToast.showToast(BlogActivity.this,"请求失败请稍后再试!", 1000) ;
break ;
case 4://没有信息了
CustomToast.showToast(BlogActivity.this,"已经没有更多信息了,请稍后再试!", 1000) ;
pListView.setHasMore(false) ;
m_bSendLimit = false ;
CodeUtil.e(TAG, "却是没有值了") ;
pListView.onBottomComplete();
break ;
case 5:
CustomToast.showToast(BlogActivity.this,"网络问题无法获得最新主帖数据!", 1000) ;
m_bFreshNewDataLimit = false ;
pListView.onDropDownComplete() ;
break ;
case 6:
CustomToast.showToast(BlogActivity.this,"当前已经是最新主帖数据!", 1000) ;
m_bFreshNewDataLimit = false ;
pListView.onDropDownComplete() ;
break ;
}
}
@Override
public void OnViewUpdate(int type) {
if(pTargetList != null)
CodeUtil.e(TAG, "onViewUpdate!" + pTargetList.size()+":"+type);
if(pTargetList != null)
CustomToast.showToast(BlogActivity.this, "已经成功获取留言板信息:"
+ pTargetList.size() + "条", 1000);
findViewById(R.id.blog_total_process) .setVisibility(View.GONE) ;
switch(type) //type仅仅是区分回调的种类。
{
case 0:
initList(); //初次获得可能只有10条
break ;
case 1:
addList() ;//点击加载后可能多获得一些 (很久之前的数据)
break ;
case 2:
freshNewData();//下拉列表后可能更新一些数据。(初次获取信息后之后后台收到的新的添加数据)
break ;
}
}
@Override
public void OnViewUpdate(Message msg) {
}
}
class MyListener implements OnClickListener {
@Override
public void onClick(View v) {
int id = v.getId();
switch (id) {
case R.id.blog_total_backBtn:
BlogActivity.this.onBackPressed();
break;
case R.id.blog_total_btn:
jump2AddActivity() ;
break ;
}
}
}
private void jump2AddActivity() {
Intent intent = new Intent(this,AddPostActivity.class) ; //具体的添加View
intent.putExtra(Define.TAG, m_nBlogType) ;
startActivity(intent) ;
}
/**
* @param tag
* :种类
*/
private void decroateTitle(int tag) {
TextView textView = (TextView) findViewById(R.id.blog_total_title);
String text = "";
switch (tag) {
case 1:
text = "谈天说地";
break;
case 2:
text = "游戏心得";
break;
case 3:
text = "玩家反馈";
break;
}
textView.setText(text.toString());
}
private LayoutInflater mInflater;
private DropDownListView pListView;
private ListAdpter pListAdpter;
private void addList()
{
int count = pTargetList.size();
CodeUtil.e(TAG, "tarsize:"+pTargetList.size()) ;
if(count != 0){
for (int i = 0; i < count; i++)
pIndeedList.add(pTargetList.get(i));
CodeUtil.e(TAG, "addList"+pIndeedList.size()+":"+pListAdpter.getCount()) ;
pListAdpter.addListItems(pTargetList) ;
CodeUtil.e(TAG, "addList2 "+pIndeedList.size()+":"+pListAdpter.getCount()) ;
pListAdpter.notifyDataSetChanged() ;
CodeUtil.e(TAG, "addList3 "+pIndeedList.size()+":"+pListAdpter.getCount()) ;
}
else
{
pListView.setHasMore(false) ;
}
pListView.onBottomComplete();
m_bSendLimit = false ;
}
public void initList() {
if (pListAdpter == null)
pListAdpter = new ListAdpter(this);
if (pIndeedList == null)
pIndeedList = pTargetList;
else {
//已在addList中实现,如果出现运行这里将会报错。
return;// 添加数据
}
// 初始化数据
if (pListView == null) {
CodeUtil.e(TAG, "init list"+pIndeedList.size()) ;
pListView = (DropDownListView) findViewById(R.id.blog_total_list_view);
pListAdpter.setList(pIndeedList) ;
IListAdpterCallBack tempL = new ListAdapterListenerBlogImpl() ;
pListAdpter.setExtraListener(tempL);
}
pListView.setDropDownStyle(true);
pListView.setAutoLoadOnBottom(true);
pListView.setOnDropDownListener(new DropDownListView.OnDropDownListener() {
@Override
public void onDropDown() {
//这里面执行
sendRefreshDataRequest() ; //处理下拉回调,即更新之后得数据
}
});
pListView.setOnBottomStyle(true);
pListView.setOnBottomListener(null);
final IGetDataTaskCallback callback = new BlogItemTaskCallback();
pListView.setOnBottomListener(new OnClickListener() {
@Override
public void onClick(View v) {
new com.itv.u.listview.GetDataTask(false, callback)
.execute(); //即添加之前的数据
}
});
pListView.SetExtraOnScrollStateListener(pListAdpter.mExtraListener);
pListView.setAdapter(pListAdpter);
}
private void sendRefreshDataRequest()
{
if(pListAdpter == null || pListView == null || pIndeedList == null || pIndeedList.size() == 0)
{
addTotalBlog() ;
return ;
}
if(m_bFreshNewDataLimit){
pListView.onDropDownComplete() ;
return ;
}
m_bFreshNewDataLimit = true ;
BlogTotalType bo = (BlogTotalType) pIndeedList.get(0) ; //获得索引
MainActivity.pManager.sendRefreshDataRequest(bo.m_nMainID,m_nBlogType,pList) ;
}
private boolean m_bFreshNewDataLimit = false ;
private void freshNewData()
{
if(pListView != null && pIndeedList!=null && m_pFreshNewList!=null)
{
int count = m_pFreshNewList.size() ;
IEntity pEntity = null ;
boolean pFlag = false ;
for(int i = count- 1 ; i >= 0 ; i--)
{
pFlag = true ;
pEntity = m_pFreshNewList.get(i) ;
pIndeedList.add(0, pEntity) ;
pListAdpter.addItem(pEntity) ;
}
if(pFlag)
pListAdpter.notifyDataSetChanged() ;
}
m_bFreshNewDataLimit = false ;
pListView.onDropDownComplete() ;
}
private boolean m_bSendLimit = false;
class BlogItemTaskCallback implements IGetDataTaskCallback
{
@Override
public String[] doInBackgroundCallback(Void... params) {
return null;
}
@Override
public void onPostExecuteCallback(String[] result, boolean isDropDown) {
//这里发送信息请求
pTargetList = null ;
if(pIndeedList == null || pIndeedList.size() == 0)
{
CustomToast.showToast(BlogActivity.this,"请求额外留言板信息出错!", 1000) ;
return ;
}
if(m_bSendLimit)
{
CustomToast.showToast(BlogActivity.this, "发送消息过于频繁!", 1000) ;
return ;
}
m_bSendLimit = true ;
MainActivity.pManager.getBloginfoByPostclass(((BlogTotalType)pIndeedList.
get(pIndeedList.size() -1)).m_nMainID, m_nBlogType, pList);
}
}
class ListAdapterListenerBlogImpl implements IListAdpterCallBack
{
@Override
public View decorateViewOnGetView(List<IEntity> list, int position,
View convertView, ViewGroup parent) { //getview的回调
CodeUtil.e(TAG, pIndeedList.size()+"position:"+position+":::"+pListAdpter.getCount()) ;
if(position >= pIndeedList.size() )
return null ;
BlogTotalType blog = (BlogTotalType) pIndeedList.get(position) ;
if( null == convertView)
{
convertView = mInflater.inflate(R.layout.blog_item,
null);
}
View v = convertView.findViewById(R.id.blog_item_title) ;
ImageUtil.SetAutoScreenImageView(v, 0, 0, 10, 8, 0, 0) ;
CodeUtil.setTextViewText(v, blog.m_sPostitle) ;
v = convertView.findViewById(R.id.blog_item_count) ;
ImageUtil.SetAutoScreenImageView(v, 0, 0, 10, 0, 5, 0) ;
CodeUtil.setTextViewText(v, "贴数 : "+blog.m_nPostNum) ;
v = convertView.findViewById(R.id.blog_item_time) ;
ImageUtil.SetAutoScreenImageView(v, 0, 0, 0, 5, 5, 0) ;
CodeUtil.setTextViewText(v, blog.m_sDate) ;
v = convertView.findViewById(R.id.blog_item_nick) ;
ImageUtil.SetAutoScreenImageView(v,0, 0 , 0, 5, 5, 0) ;
CodeUtil.setTextViewText(v, blog.m_sUsername) ;
convertView.setTag(position) ;
convertView.findViewById(R.id.blog_item_btn).setOnClickListener(pInnerListener) ;
return convertView;
}
@Override
public void DecorateViewOnAddExtraList(List<IEntity> list) { //当有额外的数据添加时
View convertView = null;
CodeUtil.e(TAG, "DecorateViewOnAddExtraList") ;
decorateViewOnGetView(list, list.size() - 1, convertView, null);
}
OnClickListener pInnerListener = new InnerClassListener() ;
Intent pInnerIntent = new Intent(BlogActivity.this,BlogDetailActivity.class) ;
class InnerClassListener implements View.OnClickListener
{
@Override
public void onClick(View v) {
BlogTotalType b = (BlogTotalType) pIndeedList.get(Integer.parseInt(v.getTag().toString())) ;
CodeUtil.e(TAG, "click obj == null :"+(b == null)) ;
Bundle bx = new Bundle();
bx.putSerializable(Define.TAG, b) ;
pInnerIntent.putExtra(Define.TAG, bx) ;
BlogActivity.this.startActivity(pInnerIntent) ;
m_pUpdateNumId = Integer.parseInt(v.getTag().toString() );
m_pUpdateNumTag = 0 ;
}
}
}
public static int m_pUpdateNumTag =-1;//0 发送状态 , -1 待机,2需改变
public int m_pUpdateNumId =-1;
// 处理屏幕自适应
private void fixXY() {
//...
}
}