应用场景: 像qq空间的点赞功能,只需要局部更新点赞次数
- 思路: 对listview的某一个item进行刷新
1.要获取要刷新的item当前索引position和数据
2.对获取的数据进行重置
3.手动调用getView()方法刷新UI
效果显示

下面上代码
<?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:id="@+id/activity_main"
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="com.spore.developart.MainActivity">
<ListView
android:id="@+id/lv"
android:layout_width="match_parent"
android:layout_height="wrap_content">
</ListView>
</RelativeLayout>
<?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="wrap_content"
android:minHeight="40dp"
android:orientation="vertical">
<TextView
android:id="@+id/tv"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:text="测试view"
/>
</LinearLayout>
private ArrayList<String> mList;
private MyListAdapter mListAdapter;
private ListView mLv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mLv = (ListView) findViewById(R.id.lv);
mList = new ArrayList<>();
for (int i = 0; i < 100; i++) {
mList.add("我是数据: " + i);
}
mListAdapter = new MyListAdapter();
mLv.setAdapter(mListAdapter);
mLv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
int firstVisiblePosition = mLv.getFirstVisiblePosition();
Toast.makeText(MainActivity.this, "被单击了", Toast.LENGTH_SHORT).show();
View v =mLv.getChildAt(position-firstVisiblePosition);
TextView tv = (TextView) v.findViewById(R.id.tv);
System.out.println("po: " + position);
tv.setText("我被点击了....");
mList.set(position,"我被点击了.... "+position);
mLv.getAdapter().getView(position, v, mLv);
}
});
}
class MyListAdapter extends BaseAdapter {
@Override
public int getCount() {
return mList.size();
}
@Override
public Object getItem(int position) {
return mList.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView == null) {
convertView = View.inflate(getBaseContext(), R.layout.item_temp_textview, null);
holder = new ViewHolder();
holder.tv = (TextView) convertView.findViewById(tv);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
holder.tv.setText("我是数据: " + mList.get(position));
return convertView;
}
}
class ViewHolder {
TextView tv;
}
- 其中需要注意的是 : View v =mLv.getChildAt(position-firstVisiblePosition);
- getChildAt的得到时屏幕显示的条目总数, 比如: 一个屏幕显示8个条目, 最多9个条目.