关于listview或gridview刷新问题

1.notifydataSetChanged与notifyDataSetInvalidated

  

  该文章是分析NotifydataSetView源码的:http://www.cnblogs.com/kissazi2/p/3721941.html

  

  Changed means the data set changed. Individual items updated, 

  or items were added or removed. Invalidated means the data source is no longer available.

  ————两者的区别

2 局部刷新listview

  面试的时候被问及你是如何刷新listview的,我很干脆的就notifydatachanged。。没了,但是notifydatachanged

  重新绘制的是整个listivew(此处待考证,网络上说是刷新当前可见区域)

  

  以下就是局部刷新的重要代码 

 public void updateView(int itemIndex) {

		//得到第一个可显示控件的位置
		int visiblePosition = mListView.getFirstVisiblePosition();

		//只有当要更新的view在可见的位置时才更新,不可见时,跳过不更新
		if (itemIndex - visiblePosition >= 0) {

			//得到要更新的item的view
			View view = mListView.getChildAt(itemIndex -
                        visiblePosition);

		 if(view!=null){
	           //此处的getView是调用adpater重写的方法getView
                  getVIew(itemIndex,view,listview);
                }
	   }		
   }

3 gridview单选实现

   gridview的单选实现方法重要代码如下

@override
  ..getView(..){
   ...
   //该img是打钩图片
   ImageView img = (ImageView) arg1.findViewById(R.id.img_cest);
   setChecked(img, arg0);
   ...
  }


 /**
   * 如果点击选择了该item则显示打钩的图片,否则隐藏
   *
   **/
  public void setChecked(ImageView img, int arg0) {
	if (check[arg0] == 0) {
		img.setVisibility(View.INVISIBLE);
	} else {
		img.setVisibility(View.VISIBLE);
	}
  }

public void setSelectedItem(int itemPostion) {
	this.currentItem = itemPostion;
	getChecked();
	//调用notifydatasetChanged()重绘制listview
	notifyDataSetChanged();
  }
  
  /**
   * check[]保存选中状态0表示未选中,1表示选中
   *
   **/
  public void getChecked() {
	for (int i = 0; i < check.length; i++) {
		if (currentItem == i) {
			if (check[i] == 0) {
				check[i] = 1;
			} else if (check[i] == 1) {
				check[i] = 0;
			}
		}
	}
  }



 

    大概思路就是将选中状态进行更改保存,根据选中状态更改图片显示情况

   

    

   

猜你喜欢

转载自l-willin.iteye.com/blog/2092323