您的位置:首页 > 移动开发 > Android开发

Android ListView滑动混乱解决方法

2011-08-18 17:25 260 查看
在写Adapter 时,比如可以取到数据,就显示出来。如果取不到数据不显示。但是滑动list,此时无数据的会显示有数据。解决办法就是用boolean判断,有为true,显示,没有为false,这样根据这个boolean值做显示,或是不显示,这样就可以解决了。

自己做项目的源代码供大家看看,各种技巧大家可以参考下。

package com.company.myname; //修改了这个,呵呵

import java.text.SimpleDateFormat;

import java.util.ArrayList;

import java.util.Calendar;

import java.util.Date;

import android.app.Dialog;

import android.app.ListActivity;

import android.app.ProgressDialog;

import android.content.ActivityNotFoundException;

import android.content.Context;

import android.content.Intent;

import android.content.SharedPreferences;

import android.content.SharedPreferences.Editor;

import android.os.Bundle;

import android.os.Handler;

import android.os.Message;

import android.os.Handler.Callback;

import android.telephony.TelephonyManager;

import android.text.TextUtils;

import android.util.Log;

import android.view.ContextMenu;

import android.view.ContextMenu.ContextMenuInfo;

import android.view.LayoutInflater;

import android.view.Menu;

import android.view.MenuItem;

import android.view.View;

import android.view.View.OnClickListener;

import android.view.ViewGroup;

import android.widget.AdapterView;

import android.widget.AdapterView.AdapterContextMenuInfo;

import android.widget.ArrayAdapter;

import android.widget.Button;

import android.widget.ImageView;

import android.widget.ListView;

import android.widget.TextView;

import android.widget.Toast;

public class AllChannelTabActivity extends ListActivity {

private static final String TAG = "AllChannelTabActivity";

public static InnoCmmbService mInnoCmmbService = null;

public static InnoMbbmsOperate mInnoMbbmsOperate = null;

public static ArrayList<MBBMSService> mMbbmsChannelList;

public static ArrayList<ServiceInfo> mCmmbChannelList;

private ArrayList<MBBMSContent> mMbbmsContentList;

private ArrayList<ScheduleInfo> mScheduleList;

public CmmbChannelAdapter mCmmbAdapter = null;

public MbbmsChannelAdapter mMbbmsAdapter = null;

private Preference_T mPreference_T;

private Context mContext;

private Handler mHandler;

ProgressDialog mDialog;

private TelephonyManager mTel;

private boolean simIn = false;

private boolean Inited = false;

private static final int MENU_CONTENT = 0;

private int mFavoriteFlag = -1;

private String mCurrentTime;

private String today;

public class MbbmsListener implements InnoMbbmsOperate.onMbbmsListener {

public void onMbbmsCallBack(ServiceEvent_T event, Object cookie)

{

}

}

public class HandlerListener implements Callback {

public boolean handleMessage(Message msg) {

// TODO Auto-generated method stub

return AllChannelTabActivity.this.handleMessage(msg);

}

}

@Override

protected void onCreate(Bundle savedInstanceState) {

// TODO Auto-generated method stub

super.onCreate(savedInstanceState);

setContentView(R.layout.all_channel_list);

Log.i(TAG,"onCreate ......");

mContext = getApplicationContext();

mTel = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);

if (mTel.getSimState() == 5) {

simIn = true;

}

//get current time

Date date = new Date();

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

mCurrentTime = sdf.format(date);

Log.i(TAG,"current time is "+mCurrentTime);

//get date

Calendar cal = Calendar.getInstance();

SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");

today = formatter.format(cal.getTime());

Log.i(TAG,"today is "+today);

if (!simIn) {

mCmmbChannelList = new ArrayList<ServiceInfo>();

mScheduleList = new ArrayList<ScheduleInfo> ();

mCmmbAdapter = new CmmbChannelAdapter(mContext,mCmmbChannelList);

setListAdapter(mCmmbAdapter);

} else {

mMbbmsChannelList = new ArrayList<MBBMSService>();

mMbbmsAdapter = new MbbmsChannelAdapter(mContext,mMbbmsChannelList);

setListAdapter(mMbbmsAdapter);

}

mHandler = new Handler(new HandlerListener());

Log.i(TAG,"oncreat handler inited ..............................");

mInnoCmmbService = new InnoCmmbService(this);

mInnoMbbmsOperate = new InnoMbbmsOperate(this);

InnoCmmbService.INNO_Init("/data/data/com.innofidei.cmmb","/data/data/com.innofidei.cmmb",1);

Log.i(TAG,"cmmb set init path ...........");

InnoCmmbService.INNO_SetLogLevel(InnoCmmbService.LOG_ALL);

Log.i(TAG,"InnoCmmbService has inited.........");

if (!simIn) {

InitCmmbChannel();

} else {

InitMbbmsChannel();

}

getListView().smoothScrollToPosition(4);

getListView().setOnCreateContextMenuListener(this);

}

@Override

protected void onResume() {

// TODO Auto-generated method stub

super.onResume();

Log.i(TAG,"onResume................");

//refresh when cancel favarite channel in set

if (simIn) {

if (mMbbmsChannelList.size() > 0)

mMbbmsAdapter.notifyDataSetChanged();

} else {

if (mCmmbChannelList.size() > 0)

mCmmbAdapter.notifyDataSetChanged();

}

}

protected void onDestroy() {

super.onDestroy();

InnoCmmbService.INNO_Deinit();

}

public void InitMbbmsChannel() {

Log.i(TAG,"InitMbbmsChannel carry out......");

mDialog = ProgressDialog.show(this, "MBBMS", getString(R.string.init_sg), true);

mPreference_T = new Preference_T();

mMbbmsContentList = new ArrayList<MBBMSContent>();

mInnoMbbmsOperate.mStatus = InnoMbbmsOperate.STATUS_START;

mInnoMbbmsOperate.INNO_MBBMS_Start(null, mPreference_T);

Log.i(TAG," mInnoMbbmsOperate.INNO_MBBMS_Start(null, mPreference_T) carry out");

MBBMSContent [] a = mInnoMbbmsOperate.GetContent(null);

Log.i(TAG,"a length is "+a.length);

for (int i=0;i<a.length;i++) {

if (a[i].m_StartTime.contains(today)

&& a[i].m_StartTime.compareToIgnoreCase(mCurrentTime) <= 0

&& a[i].m_EndTime.compareToIgnoreCase(mCurrentTime) > 0) {

mMbbmsContentList.add(a[i]);

Log.i(TAG,"###mbbms content is "+a[i].m_Name+" ; ref id is "+a[0].m_ServiceReferenceidRef);

}

}

Log.i(TAG,"mMbbmsContentList length is "+mMbbmsContentList.size());

}

public void InitCmmbChannel() {

Log.i(TAG,"init cmmb channel..........");

InnoCmmbService.INNO_ScanChannel(13, 48);

mDialog = ProgressDialog.show(this, "CMMB", getString(R.string.scan_channel));

}

@Override

protected void onListItemClick(ListView l, View v, int position, long id) {

// TODO Auto-generated method stub

super.onListItemClick(l, v, position, id);

boolean cmmbWatch = false;

boolean mbbmsWatch = false;

if (!simIn)

{

Log.i(TAG,"play cmmb program...............");

ServiceInfo service = mCmmbChannelList.get(position);

if (!service.mForFree) {

Toast.makeText(this,getString(R.string.can_not_watch) , Toast.LENGTH_SHORT).show();

} else {

cmmbWatch = true;

mInnoCmmbService.INNO_PlayChannel(service.mFreqNo, service.mId);

}

} else {

Log.i(TAG,"play mbbms program..............");

MBBMSService service = mMbbmsChannelList.get(position);

if (service.m_isSubscribed || service.m_forfree) {

mbbmsWatch = true;

if (mInnoMbbmsOperate.mAuthorize == InnoMbbmsOperate.STATUS_AUTHORIZE_OK

|| mInnoMbbmsOperate.mAuthorize == InnoMbbmsOperate.STATUS_AUTHORIZE_ING) {

mInnoMbbmsOperate.INNO_MBBMS_PlayTV(service.m_id, MbbmsOperate.REQ_MSK_NONE);

} else {

mInnoMbbmsOperate.mAuthorize = InnoMbbmsOperate.STATUS_AUTHORIZE_ING;

mInnoMbbmsOperate.INNO_MBBMS_PlayTV(service.m_id, MbbmsOperate.REQ_MSK_ALL_SERVICE);

}

} else {

//request modify to subscribe channel

Toast.makeText(this,getString(R.string.do_not_watch), Toast.LENGTH_SHORT).show();

}

}

if (cmmbWatch || mbbmsWatch) {

Intent intent = new Intent();

intent.setClass(this, VideoViewActivity.class);

try {

startActivity(intent);

} catch (ActivityNotFoundException ae) {

Log.v(TAG, "Activity not found");

ae.printStackTrace();

} catch (Exception e) {

Log.v(TAG, "Exception found");

e.printStackTrace();

}

}

}

@Override

public void onCreateContextMenu(ContextMenu menu, View v,

ContextMenuInfo menuInfo) {

// TODO Auto-generated method stub

super.onCreateContextMenu(menu, v, menuInfo);

AdapterView.AdapterContextMenuInfo info = (AdapterContextMenuInfo) menuInfo;

mFavoriteFlag = info.position;

Log.i(TAG,"create context menu position is "+mFavoriteFlag);

menu.add(0, MENU_CONTENT, 0, R.string.favo_unfavo);

}

@Override

public boolean onContextItemSelected(MenuItem item) {

// TODO Auto-generated method stub

switch (item.getItemId()) {

case MENU_CONTENT:

if (!simIn) {

String [] mChannelName = new String [5];

SharedPreferences sharedPreferences=getSharedPreferences("favoriteinfo",Context.MODE_PRIVATE);

for (int i=0;i<5;i++) {

mChannelName[i] = sharedPreferences.getString("channel"+i,"");

Log.i(TAG,"channel name "+i+" is "+mChannelName[i]);

}

String mRecordName = mCmmbChannelList.get(mFavoriteFlag).mName;

boolean findFlag = false;

for (int i=0;i<5;i++) {

if (!TextUtils.isEmpty(mChannelName[i])) {

if (mRecordName.equals(mChannelName[i])) {

Editor edit = sharedPreferences.edit();

edit.putString("channel"+i, "");

edit.commit();

findFlag = true;

Toast.makeText(this,mChannelName[i]+getString(R.string.unfavorite_success),Toast.LENGTH_SHORT).show();

break;

}

}

}

if (!findFlag) {

for (int i=0;i<5;i++) {

if (TextUtils.isEmpty(mChannelName[i])) {

Editor edit = sharedPreferences.edit();

edit.putString("channel"+i, mRecordName);

edit.commit();

Toast.makeText(this,mRecordName+getString(R.string.favorite_success),Toast.LENGTH_SHORT).show();

break;

}

}

}

mCmmbAdapter.notifyDataSetChanged();

} else {

String [] mChannelName = new String [5];

SharedPreferences sharedPreferences=getSharedPreferences("mbbmsfavoriteinfo",Context.MODE_PRIVATE);

for (int i=0;i<5;i++) {

mChannelName[i] = sharedPreferences.getString("channel"+i,"");

}

String mRecordName = mMbbmsChannelList.get(mFavoriteFlag).m_Name;

boolean findFlag = false;

//already exist,remove it

for (int i=0;i<5;i++) {

if (!TextUtils.isEmpty(mChannelName[i])) {

if (mRecordName.equals(mChannelName[i])) {

Editor edit = sharedPreferences.edit();

edit.putString("channel"+i, "");

edit.commit();

findFlag = true;

Toast.makeText(this,mChannelName[i]+getString(R.string.unfavorite_success),Toast.LENGTH_SHORT).show();

break;

}

}

}

//not exist,add it

if (!findFlag) {

for (int i=0;i<5;i++) {

if (TextUtils.isEmpty(mChannelName[i])) {

Editor edit = sharedPreferences.edit();

edit.putString("channel"+i, mRecordName);

edit.commit();

Toast.makeText(this,mRecordName+getString(R.string.favorite_success),Toast.LENGTH_SHORT).show();

break;

}

}

}

mMbbmsAdapter.notifyDataSetChanged();

}

break;

}

return super.onContextItemSelected(item);

}

private class MbbmsChannelAdapter extends ArrayAdapter<MBBMSService> {

public MbbmsChannelAdapter(Context context, ArrayList<MBBMSService> mList) {

super(context, 0, mList);

}

@Override

public View getView(int position, View convertView, ViewGroup parent) {

MBBMSService info = mMbbmsChannelList.get(position);

Log.i(TAG,"---------------MbbmsAdapter channnel is "+info.m_Name);

Log.i(TAG," position is "+position);

boolean findFlag = false;

if (convertView == null) {

final LayoutInflater inflater = getLayoutInflater();

convertView = inflater.inflate(R.layout.text_view, parent, false);

}

ImageView mLock = (ImageView) convertView.findViewById(R.id.lock_channel);

if (info.m_isSubscribed == true || info.m_forfree){

mLock.setImageResource(R.drawable.unlock);

} else {

mLock.setImageResource(R.drawable.lock);

}

TextView aChannel = (TextView) convertView.findViewById(R.id.one_channel);

aChannel.setText((CharSequence)info.m_Name);

TextView time = (TextView) convertView.findViewById(R.id.time_item);

TextView describe = (TextView) convertView.findViewById(R.id.describe_item);

for (int i=0;i<mMbbmsContentList.size();i++) {

if (info.m_id.equalsIgnoreCase(mMbbmsContentList.get(i).m_ServiceReferenceidRef)){

findFlag = true;

String [] start = mMbbmsContentList.get(i).m_StartTime.split(" ");

String [] end = mMbbmsContentList.get(i).m_EndTime.split(" ");

time.setText(start[1]+" "+end[1]);

describe.setText(" "+mMbbmsContentList.get(i).m_Name);

Log.i(TAG,"****************convertview position is "+position+":"+info.m_Name+" :"+mMbbmsContentList.get(i).m_Name);

break;

}

}

if (!findFlag) {

time.setText("");

describe.setText("");

}

ImageView mFavoView = (ImageView) convertView.findViewById(R.id.favo_channel);

mFavoView.setImageResource(R.drawable.collection);

mFavoView.setVisibility(View.GONE);

String [] mChannelName = new String [5];

SharedPreferences sharedPreferences=getSharedPreferences("mbbmsfavoriteinfo",Context.MODE_PRIVATE);

String channelName0 = sharedPreferences.getString("channel0","");

for (int i=0;i<5;i++) {

mChannelName[i] = sharedPreferences.getString("channel"+i,"");

}

for (int i=0;i<5;i++) {

if (info.m_Name.equals(mChannelName[i])) {

mFavoView.setVisibility(View.VISIBLE);

break;

}

}

return convertView;

}

}

private class CmmbChannelAdapter extends ArrayAdapter<ServiceInfo> {

public CmmbChannelAdapter(Context context, ArrayList<ServiceInfo> mList) {

super(context, 0, mList);

}

@Override

public View getView(int position, View convertView, ViewGroup parent) {

boolean findFlag = false;

final ServiceInfo info = mCmmbChannelList.get(position);

if (convertView == null) {

final LayoutInflater inflater = getLayoutInflater();

convertView = inflater.inflate(R.layout.text_view, parent, false);

}

ImageView mLockView = (ImageView) convertView.findViewById(R.id.lock_channel);

if (info.mForFree == false) {

mLockView.setImageResource(R.drawable.lock);

} else {

mLockView.setImageResource(R.drawable.unlock);

}

TextView mChannel = (TextView) convertView.findViewById(R.id.one_channel);

mChannel.setText(info.mFreqNo+" "+info.mName);

TextView time = (TextView) convertView.findViewById(R.id.time_item);

TextView describe = (TextView) convertView.findViewById(R.id.describe_item);

for (int i=0;i<mScheduleList.size();i++) {

if (info.mId == mScheduleList.get(i).mServiceId){

findFlag = true;

String [] start = mScheduleList.get(i).mBeginTime.split(" ");

String [] end = mScheduleList.get(i).mEndTime.split(" ");

time.setText(start[1]+" "+end[1]);

describe.setText(" "+mScheduleList.get(i).mTitleStr);

Log.i(TAG,"****************convertview position is "+position+":"+info.mName+" :"+mScheduleList.get(i).mTitleStr);

break;

}

}

if (!findFlag) {

time.setText("");

describe.setText("");

}

ImageView mFavoView = (ImageView) convertView.findViewById(R.id.favo_channel);

mFavoView.setImageResource(R.drawable.collection);

mFavoView.setVisibility(View.GONE);

String [] mChannelName = new String [5];

SharedPreferences sharedPreferences=getSharedPreferences("favoriteinfo",Context.MODE_PRIVATE);

String channelName0 = sharedPreferences.getString("channel0","");

for (int i=0;i<5;i++) {

mChannelName[i] = sharedPreferences.getString("channel"+i,"");

}

for (int i=0;i<5;i++) {

if (info.mName.equals(mChannelName[i])) {

mFavoView.setVisibility(View.VISIBLE);

break;

}

}

return convertView;

}

}

public void bindChannelList() {

if (simIn) {

Log.i(TAG,"bind mbbms ChannelList carry out");

mMbbmsAdapter.notifyDataSetChanged();

} else {

Log.i(TAG,"bind cmmb ChannelList carry out");

mCmmbAdapter.notifyDataSetChanged();

}

}

public Handler getMyHandler() {

return mHandler;

}

public boolean handleMessage(Message msg) {

Log.i(TAG, "msg.what = " + msg.what);

if (msg.what == InnoMbbmsOperate.SERVICE_UPDATESG_COMPLETED)

{

if (mInnoMbbmsOperate.mStatus == InnoMbbmsOperate.STATUS_START)

{

mDialog.dismiss();

}

if (msg.arg1 == 0)

{

Toast.makeText(this, getString(R.string.init_sg_sucess), Toast.LENGTH_SHORT).show();

mDialog = ProgressDialog.show(this, "MBBMS", getString(R.string.init_st), true);

}

else

{

Toast.makeText(this, getString(R.string.init_sg_fail), Toast.LENGTH_SHORT).show();

}

}

else if (msg.what == InnoMbbmsOperate.SERVICE_UPDATEST_COMPLETED)

{

if (mInnoMbbmsOperate.mStatus == InnoMbbmsOperate.STATUS_START)

{

mDialog.dismiss();

}

if (msg.arg1 == 128 || msg.arg1 == 129 || msg.arg1 == 130)

{

Toast.makeText(this, getString(R.string.init_st_success), Toast.LENGTH_SHORT).show();

if (!Inited)

{

Inited = true;

mDialog = ProgressDialog.show(this, "MBBMS", getString(R.string.init_gba), true);

}

mMbbmsChannelList.clear();

if (mInnoMbbmsOperate.m_MbbmsServiceArray != null) {

Log.i(TAG, "rService length = " + mInnoMbbmsOperate.m_MbbmsServiceArray.length);

for (int i = 0; i < mInnoMbbmsOperate.m_MbbmsServiceArray.length; i++) {

Log.i(TAG, "add service id = " + mInnoMbbmsOperate.m_MbbmsServiceArray[i].m_id + "; name = "

+ mInnoMbbmsOperate.m_MbbmsServiceArray[i].m_Name + "; subscribed=" + mInnoMbbmsOperate.m_MbbmsServiceArray[i].m_isSubscribed);

mMbbmsChannelList.add(mInnoMbbmsOperate.m_MbbmsServiceArray[i]);

}

}

bindChannelList();

}

else

{

Toast.makeText(this, getString(R.string.init_st_fail), Toast.LENGTH_SHORT).show();

}

}

else if (msg.what == InnoMbbmsOperate.SERVICE_INITIALIZE_COMPLETED)

{

if (mInnoMbbmsOperate.mStatus == InnoMbbmsOperate.STATUS_START)

{

mDialog.dismiss();

mInnoMbbmsOperate.mStatus = InnoMbbmsOperate.STATUS_IDLE;

}

if (msg.arg1 == 0)

{

Toast.makeText(this, getString(R.string.gba_ok), Toast.LENGTH_SHORT).show();

}

else

{

Toast.makeText(this, getString(R.string.gba_fail), Toast.LENGTH_SHORT).show();

}

}

else if (msg.what == InnoCmmbService.SOURCE_SERVICE) {

if (mDialog.isShowing()) {

mDialog.dismiss();

}

ServiceInfo[] rService = InnoCmmbService

.INNO_GetAllCMMBServiceInfo(0);

if (rService != null) {

Log.i(TAG, "################# mService length = " + rService.length);

for (int i = 0; i < rService.length; i++) {

//filter the channel which name is number

if (rService[i].mName.startsWith("1")) {

continue;

} else if (rService[i].mName.startsWith("2")) {

continue;

} else if (rService[i].mName.startsWith("3")) {

continue;

} else if (rService[i].mName.startsWith("4")) {

continue;

}

boolean bExist = false;

for (int j = 0; j < mCmmbChannelList.size(); j++) {

ServiceInfo service = mCmmbChannelList.get(j);

if (service.mId == rService[i].mId

&& service.mFreqNo == rService[i].mFreqNo) {

bExist = true;

break;

}

}

if (!bExist) {

mCmmbChannelList.add(rService[i]);

}

}

} else {

Log.i(TAG,"can not get ServiceInfo ..........");

}

//add

ScheduleInfo[] a = InnoCmmbService.INNO_GetAllCMMBScheduleInfo(0, 0);

if (a!=null) {

for (int i=0;i<a.length;i++) {

if (a[i].mBeginTime.contains(today)

&& a[i].mBeginTime.compareToIgnoreCase(mCurrentTime) <= 0

&& a[i].mDescription.compareToIgnoreCase(mCurrentTime) > 0) {

mScheduleList.add(i, a[i]);

}

}

Log.i(TAG, "schedule number is "+a.length);

} else {

Log.i(TAG, "can not get schedule info");

}

bindChannelList();

}

else if (msg.what == InnoMbbmsOperate.SOURCE_INQUIRY)

{

if (mInnoMbbmsOperate.m_MbbmsSubscribePurchaseItems != null)

{

Log.i(TAG, "m_MbbmsSubscribePurchaseItems length=" + mInnoMbbmsOperate.m_MbbmsSubscribePurchaseItems.length);

for (int i=0; i<mInnoMbbmsOperate.m_MbbmsSubscribePurchaseItems.length; i++)

{

Log.i(TAG, "Unsubscribe id=" + mInnoMbbmsOperate.m_MbbmsSubscribePurchaseItems[i].m_globalPurchaseItemID

+ " name=" + mInnoMbbmsOperate.m_MbbmsSubscribePurchaseItems[i].m_Name);

if (mInnoMbbmsOperate.m_MbbmsSubscribePurchaseItems[i].m_service != null)

{

for (int j=0; j<mInnoMbbmsOperate.m_MbbmsSubscribePurchaseItems[i].m_service.length; j++)

{

Log.i(TAG, "service id=" + mInnoMbbmsOperate.m_MbbmsSubscribePurchaseItems[i].m_service[j].m_id

+ " name=" + mInnoMbbmsOperate.m_MbbmsSubscribePurchaseItems[i].m_service[j].m_Name);

}

}

}

String[] purchaseID = new String[1];

purchaseID[0] = mInnoMbbmsOperate.m_MbbmsSubscribePurchaseItems[0].m_globalPurchaseItemID;

mInnoMbbmsOperate.Unsubscribe(purchaseID, 1);

}

}

return true;

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: