Adapter Adapter.notifyDataSetChanged()使用时容易出现的问题 跑马灯效果Demo

先来一段跑马灯效果的Demo 

此跑马灯下面的红点可以根据图片的 张数 进行动态的改变

源码下载地址:http://download.csdn.net/detail/v587ge/8200731

XML文件  activity-main 文件代码:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >

    <FrameLayout
        android:layout_width="match_parent"
        android:layout_height="100dip" >

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="100dip"
            android:orientation="horizontal" >

            <android.support.v4.view.ViewPager
                android:id="@+id/viewpager"
                android:layout_width="match_parent"
                android:layout_height="wrap_content" >
            </android.support.v4.view.ViewPager>
        </LinearLayout>

        <LinearLayout
            android:id="@+id/mylayout"
            android:layout_width="match_parent"
            android:layout_height="20dip"
            android:layout_gravity="bottom"
            android:gravity="center_horizontal"
            android:orientation="horizontal" >

            <GridView
                android:id="@+id/gridview"
                android:layout_width="30dp"
                android:columnWidth="20dp"
                android:layout_height="wrap_content" >
            </GridView>
        </LinearLayout>
    </FrameLayout>

</RelativeLayout>
 另两个XML文件


<?xml version="1.0" encoding="utf-8"?>
<ImageView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/image"
    android:layout_width="1dp"
    android:layout_height="wrap_content"
    android:src="@drawable/white_on" />


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <ImageView
        android:id="@+id/imageviews"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

</LinearLayout>




package com.viewpager.viewpager;

import java.util.ArrayList;
import java.util.List;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.GridView;
import android.widget.ImageView;
import android.widget.Toast;

@SuppressLint("NewApi")
public class MainActivity extends Activity {
	private List<ImageView> ImageList ;
	private ImageView image1,image2,image3;
	public  List<MyPoint> list ;
	public MyPoint myPoint ;
	private GridView gridView;
	BaseAdapter MyGridViewAdapter;

	Handler handler = new Handler(){
		@Override
		public void handleMessage(Message msg) {
			// TODO Auto-generated method stub
			super.handleMessage(msg);
			if(msg.what == 0x123){
             //屏幕滑动后通知 changeImage()方法 执行图片改变操作            
				Log.e("MainActivity", "收到了信息");
				changeImage(msg.arg1);
				Toast.makeText(MainActivity.this, ""+msg.arg1,Toast.LENGTH_SHORT).show();
			}
			if(msg.what == 0x11){
             //changeImage()方法执行完  执行 改变 Gridview里面的图片
				for(int i = 0;i<list.size();i++){
					Log.e("MainActivity", "此时的list内容是"+list.get(i).getIV());
				}
				/*if(gridViewAdapter == null){
					Log.e("MainActivity", "ADAPTERweikong");
				}*/
				MyGridViewAdapter.notifyDataSetChanged();
				//gridView.setAdapter(MyGridViewAdapter);
			Log.e("MainActivity", "notifi");
			}

		}
	};
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		ViewPager viewPager = (ViewPager) findViewById(R.id.viewpager);
		ImageList = new ArrayList<ImageView>();
		image1 = new ImageView(this);
		image2 = new ImageView(this);
		image3 = new ImageView(this);
		image1.setImageResource(R.drawable.food01);
		image2.setImageResource(R.drawable.food07);
		image3.setImageResource(R.drawable.ic_launcher);
		ImageList.add(image1);
		ImageList.add(image2);
		ImageList.add(image3);

		list = new ArrayList<MyPoint>();
		for(int i = 0 ;i<ImageList.size() ;i++){
			myPoint = new MyPoint() ;

			if(i==0){
				myPoint.setIV(R.drawable.red_off);

			}else{
				myPoint.setIV(R.drawable.white_on);
			}
			list.add(myPoint);
			Log.e("MainActivity", "存入的地址是:"+list.get(i).getIV());

		}
		for(int i =0 ;i<list.size();i++){
			Log.e("MainActivity", "地址是:"+list.get(i).getIV());
		}


		gridView = (GridView) findViewById(R.id.gridview);

		gridView.setNumColumns(list.size());
		
		MyGridViewAdapter = new BaseAdapter() {

			@Override
			public int getCount() {
				// TODO Auto-generated method stub
				return list.size();
			}

			@Override
			public Object getItem(int arg0) {
				// TODO Auto-generated method stub
				return list.get(arg0).getIV() ;
			}

			@Override
			public long getItemId(int arg0) {
				// TODO Auto-generated method stub
				return arg0;
			}

			@Override
			public View getView(int arg0, View arg1, ViewGroup arg2) {
				// TODO Auto-generated method stub
				Log.e("MainActivity", "进入了baseAdapter");
				arg1 = LayoutInflater.from(MainActivity.this).inflate(R.layout.imageview, null);
				ImageView image = (ImageView) arg1.findViewById(R.id.image);
				Log.e("MainAcitvity",""+list.get(arg0).getIV());
				image.setImageResource(list.get(arg0).getIV());
				return arg1;
			}
		};
		gridView.setAdapter(MyGridViewAdapter);
		viewPager.setAdapter(new MyViewPagerAdapter());
		viewPager.setOnPageChangeListener(new OnPageChangeListener() {

			@Override
			public void onPageSelected(int arg0) {
				// TODO Auto-generated method stub
				Toast.makeText(MainActivity.this,"onPageSeleted\n"+arg0+"", Toast.LENGTH_SHORT).show();
				Message message = handler.obtainMessage();
				message.what = 0x123;
				message.arg1 = arg0 ;
				handler.sendMessage(message);
			}

			@Override
			public void onPageScrolled(int arg0, float arg1, int arg2) {
				// TODO Auto-generated method stub
				//Log.e("MianActivity", arg0+" "+arg1+" "+arg2);

			}

			@Override
			public void onPageScrollStateChanged(int arg0) {
				// TODO Auto-generated method stub
				Log.e("MainActivity", "onPageScroolStateChanged\n"+arg0);
			}
		});

	}

	public class MyViewPagerAdapter extends PagerAdapter{

		@Override
		public int getCount() {
			// TODO Auto-generated method stub
			return ImageList.size();
		}

		@Override
		public boolean isViewFromObject(View arg0, Object arg1) {
			// TODO Auto-generated method stub
			return arg0 == arg1;
		}

		@Override
		public void destroyItem(View container, int position, Object object) {
			// TODO Auto-generated method stub
			((ViewPager)container).removeView(ImageList.get(position));
		}

		@Override
		public Object instantiateItem(View container, int position) {
			// TODO Auto-generated method stub
			((ViewPager)container).addView(ImageList.get(position));
			return ImageList.get(position);
		}
	}
	private void changeImage(int num) {
		// TODO Auto-generated method stub
		for(int i = 0 ;i<list.size();i++){

			if(i == num){
				list.get(i).setIV(R.drawable.red_off);
			}
			else{
				list.get(i).setIV(R.drawable.white_on);
			}
			Log.e("MainActivity", "xiangsuwei"+list.get(i).getIV());
		}
		Log.e("MainActivity", "通知改变");
		Message msg = handler.obtainMessage();
		msg.what = 0x11 ;
		msg.obj = list ;
		handler.sendMessage(msg);

	}

	/*public  class MyGridViewAdapter extends BaseAdapter{

		@Override
		public int getCount() {
			// TODO Auto-generated method stub
			Log.e("MainActivity", "getCount"+list.size());
			return list.size();
		}

		@Override
		public Object getItem(int arg0) {
			// TODO Auto-generated method stub
			Log.e("MainActivity", "getCount"+arg0);

			return list.get(arg0).getIV();
		}

		@Override
		public long getItemId(int arg0) {
			Log.e("MainActivity", "getCount"+arg0);

			// TODO Auto-generated method stub
			return arg0;
		}

		@Override
		public View getView(int arg0, View arg1, ViewGroup arg2) {
			// TODO Auto-generated method stub
			Log.e("MainActivity", "进入了baseAdapter");
			arg1 = LayoutInflater.from(MainActivity.this).inflate(R.layout.imageview, null);
			ImageView image = (ImageView) arg1.findViewById(R.id.image);
			Log.e("MainAcitvity",""+list.get(arg0).getIV());
			image.setImageResource(list.get(arg0).getIV());
			return arg1;
		}

	};
*/
}

MyPoint对象代码  为下面图片设计的

public class MyPoint {
	public int IV  = R.drawable.white_on ;

	public int getIV() {
		return IV;
	}

	public void setIV(int iV) {
		IV = iV;
	}

}


现在讲一下  在 执行Adapter.notifyDataSetChanged() 方法或者执行setAdapter方法 之后 不执行  getview方法 的情况:

第一:gridView在 MyGridViewAdapter初始化之前就进行了 setAdapter

<span style="background-color: rgb(255, 0, 0);">		gridView.setAdapter(MyGridViewAdapter);</span>

             MyGridViewAdapter = new BaseAdapter() {

			@Override
			public int getCount() {
				// TODO Auto-generated method stub
				return list.size();
			}

			@Override
			public Object getItem(int arg0) {
				// TODO Auto-generated method stub
				return list.get(arg0).getIV() ;
			}

			@Override
			public long getItemId(int arg0) {
				// TODO Auto-generated method stub
				return arg0;
			}

			@Override
			public View getView(int arg0, View arg1, ViewGroup arg2) {
				// TODO Auto-generated method stub
				Log.e("MainActivity", "进入了baseAdapter");
				arg1 = LayoutInflater.from(MainActivity.this).inflate(R.layout.imageview, null);
				ImageView image = (ImageView) arg1.findViewById(R.id.image);
				Log.e("MainAcitvity",""+list.get(arg0).getIV());
				image.setImageResource(list.get(arg0).getIV());
				return arg1;
			}
		};

第二:当执行Adapter.notifyDataSetChanged() 方法时 方法内的list内容没有改变 

第三:如果是Adapter写成内部类的情况下   要写成gridview.setadapter(Adapter); 因为没有初始化 Adapter

例如:public  class MyGridViewAdapter extends BaseAdapter{
@Override
public int getCount() {
// TODO Auto-generated method stub
Log.e("MainActivity", "getCount"+list.size());
return list.size();
}


@Override
public Object getItem(int arg0) {
// TODO Auto-generated method stub
Log.e("MainActivity", "getCount"+arg0);


return list.get(arg0).getIV();
}


@Override
public long getItemId(int arg0) {
Log.e("MainActivity", "getCount"+arg0);


// TODO Auto-generated method stub
return arg0;
}


@Override
public View getView(int arg0, View arg1, ViewGroup arg2) {
// TODO Auto-generated method stub
Log.e("MainActivity", "进入了baseAdapter");
arg1 = LayoutInflater.from(MainActivity.this).inflate(R.layout.imageview, null);
ImageView image = (ImageView) arg1.findViewById(R.id.image);
Log.e("MainAcitvity",""+list.get(arg0).getIV());
image.setImageResource(list.get(arg0).getIV());
return arg1;
}
};


如果list数据改变了  需要  为GridView重新setAdapter 






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值