listview,gridview局部重新整理,部分重新整理,listviewgridview
眾所周知Listview和Gridview的重新整理介面的方式是調用adapter.notifyDataSetChanged()進行介面重新整理。
但是此方法有其弊端,他是將介面中的資料全部重新整理一遍,不論資料有沒有變化。如果listview載入了很多的資料(如:100條)
在進行重新整理時就會造成很大的系統開銷如何像qq空間個人動態那樣點贊只重新整理一條呢:
主要原理:
對listview的某一個item進行重新整理
1.要擷取要重新整理的item當前索引position和資料
2.對擷取的資料進行重設
3.將重設的資料放到adapter中的資料集的原來的位置(根據position重新整理原資料集的某一條資料)
4.在listview中擷取需要重新整理的子item的view
5.從更新過的資料集中擷取新資料,更新viwe中的資料(handler中操作,實現介面的重新整理)
功能如下,代碼中有詳細注釋:
public class MainActivity extends Activity{ private ArrayList<MyListItem> list = null; private ListView lv; private MyListAdapter adapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); intitData(); lv = (ListView) findViewById(R.id.listView1); adapter = new MyListAdapter(list, getApplicationContext()); adapter.setListView(lv); lv.setAdapter(adapter); lv.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { // 擷取listview中點擊item的資料 MyListItem item = (MyListItem) parent.getItemAtPosition(position); Log.i("eee", item.getData() + " == " + item.getPosition()); // 更新資料 item.setData("update item " + position); // 更新介面 adapter.updateItemData(item); } }); } /** * 初始化資料 */ private void intitData() { list = new ArrayList<MyListItem>(); for (int i = 0; i < 20; i++) { MyListItem item = new MyListItem(); item.setData("item " + i); item.setPosition(i); list.add(item); } } /** * 自訂item資料類型 */ class MyListItem { /** * 資料id */ private int dataId; /** * 資料 */ private String data; public int getPosition() { return dataId; } public void setPosition(int position) { this.dataId = position; } public String getData() { return data; } public void setData(String data) { this.data = data; } }}activity進行調用,功能操作主要封裝在adapter中如下:
public class MyListAdapter extends BaseAdapter{ /** * listview中的資料集 */ private ArrayList<MyListItem> mDataList; private Context mContext; private ListView mListView; public MyListAdapter(ArrayList<MyListItem> list, Context cont) { this.mDataList = list; this.mContext = cont; } /** * 設定listview對象 * * @param lisv */ public void setListView(ListView lisv) { this.mListView = lisv; } /** * update listview 單條資料 * * @param item 新資料對象 */ public void updateItemData(MyListItem item) { Message msg = Message.obtain(); int ids = -1; // 進行資料對比擷取對應資料在list中的位置 for (int i = 0; i < mDataList.size(); i++) { if (mDataList.get(i).getPosition() == item.getPosition()) { ids = i; } } msg.arg1 = ids; // 更新mDataList對應位置的資料 mDataList.set(ids, item); // handle重新整理介面 han.sendMessage(msg); } @SuppressLint("HandlerLeak") private Handler han = new Handler() { public void handleMessage(android.os.Message msg) { updateItem(msg.arg1); }; }; /** * 重新整理指定item * * @param index item在listview中的位置 */ private void updateItem(int index) { if (mListView == null) { return; } // 擷取當前可以看到的item位置 int visiblePosition = mListView.getFirstVisiblePosition(); // 如添加headerview後 firstview就是hearderview // 所有索引+1 取第一個view // View view = listview.getChildAt(index - visiblePosition + 1); // 擷取點擊的view View view = mListView.getChildAt(index - visiblePosition); TextView txt = (TextView) view.findViewById(R.id.textView1); // 擷取mDataList.set(ids, item);更新的資料 MyListItem data = (MyListItem) getItem(index); // 重新設定介面顯示資料 txt.setText(data.getData()); } @Override public int getCount() { // TODO Auto-generated method stub return mDataList.size(); } @Override public Object getItem(int position) { // TODO Auto-generated method stub return mDataList.get(position); } @Override public long getItemId(int position) { // TODO Auto-generated method stub return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { // TODO Auto-generated method stub if (convertView == null) { convertView = LayoutInflater.from(mContext).inflate(R.layout.list_item, null); } TextView txt = (TextView) convertView.findViewById(R.id.textView1); txt.setText(mDataList.get(position).getData()); return convertView; }}
由於listview與gridview功能相似,只是顯示方式不同,原理一樣,需要的同學可以自己修改一下試試
源碼下載