Android定点刷新Listview(Gridview)I 4000 tem!实现指定Item刷新
2018-03-01 17:43
501 查看
最近在做Launcher,定制了拖拽互换应用图标位置,但在拖拽过程中,由于 notifyDataSetChanged();次数太多,造成拖拽卡顿不流畅,所以用到了定点刷新,只刷新指定的Item。 理论很简单,就是得到要刷新的Item的View,然后更改该View即可,下面上代码:效果图:step1:布局文件
<?xml version="1.0" encoding="utf-8"?><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:background="#fff"tools:context="com.god.reflashviewitem.MainActivity"><EditTextandroid:id="@+id/main_ed"android:layout_width="match_parent"android:layout_height="60dp"android:layout_marginTop="40dp"android:hint="仅限输入数字,刷新该Item"android:inputType="number"android:textColor="#f0001c"android:textColorHint="#00FF00"android:windowSoftInputMode="adjustUnspecified|stateHidden" /><TextViewandroid:id="@+id/main_aline"android:layout_width="0dp"android:layout_height="0dp"android:layout_centerHorizontal="true" /><Buttonandroid:id="@+id/main_bt_refresh"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_below="@id/main_ed"android:layout_marginRight="50dp"android:layout_toLeftOf="@id/main_aline"android:background="@null"android:onClick="onClick"android:text="定点刷新"android:textColor="#070b9c" /><Buttonandroid:id="@+id/main_bt_reset"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_below="@id/main_ed"android:layout_marginLeft="50dp"android:layout_toRightOf="@id/main_aline"android:background="@null"android:onClick="onClick"android:text="重置所有"android:textColor="#070b9c" /><GridViewandroid:id="@+id/main_listview"android:layout_width="match_parent"android:layout_height="match_parent"android:layout_below="@id/main_bt_refresh"android:layout_marginTop="20dp"android:numColumns="2" /></RelativeLayout>step2:写Adapter
package com.god.reflashviewitem;import android.content.Context;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.view.animation.AlphaAnimation;import android.view.animation.Animation;import android.view.animation.AnimationSet;import android.view.animation.ScaleAnimation;import android.widget.BaseAdapter;import android.widget.ImageView;import android.widget.TextView;import android.widget.Toast;import java.util.List;/*** @author David create on 2016/11/3 15:24.* @email david.forever.god@gmail.com* Learn from yesterday, live for today, hope for tomorrow.*/public class GridviewAdapter extends BaseAdapter {private Context context;private List<GridBean> data;private ViewHolder holder;public GridviewAdapter(Context context, List<GridBean> data) {this.context = context;this.data = data;}@Overridepublic int getCount() {return data.size();}@Overridepublic Object getItem(int position) {return data.get(position);}@Overridepublic long getItemId(int position) {return position;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {ViewHolder viewHolder;if (convertView == null) {convertView = LayoutInflater.from(context).inflate(R.layout.grid_item, null);viewHolder = new ViewHolder(convertView);convertView.setTag(viewHolder);} else {viewHolder = ((ViewHolder) convertView.getTag());}viewHolder.item_iv.clearAnimation();setUpView(position, convertView, viewHolder);return convertView;}private void setUpView(int position, View convertView, ViewHolder viewHolder) {GridBean gridBean = data.get(position);if (gridBean.getDrawable() != null) {viewHolder.item_iv.setImageDrawable(gridBean.getDrawable());}if (gridBean.getName() != null) {viewHolder.item_tv.setText(gridBean.getName());}}//关键方法,更新指定Itempublic void updateItem(int refreshItemPostion, final View view) {if (refreshItemPostion > data.size()) {Toast.makeText(context, "error:超出列表范围", Toast.LENGTH_SHORT).show();return;}holder = (ViewHolder) view.getTag();holder.item_tv.setText("定点刷新成功");holder.item_iv.setImageDrawable(context.getResources().getDrawable(R.drawable.lol_refresh));startAnimaSet(view);//添加了动画效果,根据需求而定}private AnimationSet animationSet;private void startAnimaSet(View view) {ScaleAnimation scaleAnimation = new ScaleAnimation(0.5f, 1, 0.5f, 1,Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);AlphaAnimation alphaAnimation = new AlphaAnimation(0.4f, 1f);animationSet = new AnimationSet(true);animationSet.addAnimation(scaleAnimation);animationSet.addAnimation(alphaAnimation);animationSet.setDuration(350);view.startAnimation(animationSet);}class ViewHolder {private ImageView item_iv;private TextView item_tv;public ViewHolder(View v) {item_iv = ((ImageView) v.findViewById(R.id.item_iv));item_tv = ((TextView) v.findViewById(R.id.item_tv));}}}Itme布局文件
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="wrap_content"android:layout_height="wrap_content"android:orientation="vertical"><ImageViewandroid:id="@+id/item_iv"android:layout_width="150dp"android:layout_height="150dp"android:layout_gravity="center"android:scaleType="fitXY"android:background="@null" /><TextViewandroid:id="@+id/item_tv"android:layout_width="150dp"android:layout_height="wrap_content"android:background="@null"android:gravity="center"android:textColor="#00e"android:layout_gravity="center"/></LinearLayout>step3:MainActivity
package com.god.reflashviewitem;import android.graphics.drawable.Drawable;import android.os.Bundle;import android.support.v7.app.AppCompatActivity;import android.view.View;import android.widget.EditText;import android.widget.GridView;import android.widget.Toast;import java.util.ArrayList;import java.util.List;public class MainActivity extends AppCompatActivity {private GridView gridview;private List<GridBean> gridBeen;private EditText main_ed;private GridviewAdapter gridviewAdapter;private GridBean lol_01;private int refreshPosition;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);initview();creatList();initData();gridviewAdapter = new GridviewAdapter(this, gridBeen);gridview.setAdapter(gridviewAdapter);}private void initview() {gridview = (GridView) findViewById(R.id.main_listview);main_ed = (EditText) findViewById(R.id.main_ed);}public void onClick(View view) {switch (view.getId()) {case R.id.main_bt_refresh://定点刷新if (main_ed != null) {String s = main_ed.getText().toString();refreshPosition = Integer.parseInt(s);}//在GridView和ListView中,getChildAt(int position)方法的参数position指的是当前可见区域中的ChildView位置。大于可见位置childAt=null;View childAt = gridview.getChildAt(refreshPosition-gridview.getFirstVisiblePosition());gridviewAdapter.updateItem(refreshPosition, childAt);Toast.makeText(MainActivity.this, "已刷新", Toast.LENGTH_SHORT).show();break;case R.id.main_bt_reset://重置所有initData();gridviewAdapter.notifyDataSetChanged();Toast.makeText(MainActivity.this, "已重置", Toast.LENGTH_SHORT).show();break;}}private void initData() {if (gridBeen != null) {gridBeen.clear();} else {gridBeen = new ArrayList<>();}for (int i = 0; i < 10; i++) {gridBeen.add(lol_01);}}private void creatList() {Drawable drawable1 = getResources().getDrawable(R.drawable.lol1);lol_01 = new GridBean("lol_01", drawable1);}}
相关文章推荐
- Android定点刷新Listview(Gridview)Item!实现指定Item刷新
- Android奇巧:ListView实现Item局部刷新
- android实现ListView或GridView中item的倒数功能
- Android中ListView和GridView通过getChildAt方法得到相应的Item并刷新
- 【Android 一般进阶】ListView刷新指定item
- Android 简单实现ListView指定ITEM滑到到顶停靠
- Android开发之ListView实现Item局部刷新
- Android 实现ListView/GridView等中Item被单击后背景色保持高亮
- Android开发之ListView实现Item局部刷新
- Android------Anndroid中ListView在划屏到底部的时候动态添加ListView的Item实现
- Android中ListView的item实现点击任意位置都触发事件
- ANDROID中自定义ADAPTER实现LISTVIEW动态刷新进度条
- android 开源项目(二)可以左右拖动删除、调换位置的的listview的 item的实现(drag-sort-listview)
- android ListView和GridView拖拽移位具体实现及拓展
- (转)用android LinearLayout和RelativeLayout实现listView的listItem布局
- Android实现listview、expandablelistview、scrollview等组件的下拉或上拉刷新
- android 开源项目(二)可以左右拖动删除、调换位置的的listview的 item的实现(drag-sort-listview)
- android ListView和GridView拖拽移位具体实现及拓展
- android中ListView在划屏到底部的时候动态添加ListView的Item实现
- Android ListView 实现 GridView 用以实现GridView的下拉刷新