動態重新整理listview資料
阿新 • • 發佈:2019-01-07
之前一直困擾listview重新整理後位置的問題,現在才明白,原來不能重新設定listview的adapter,而應該用notifyDataSetChanged()來重新整理,這樣位置就不會置頂。
下面做了一個測試的例子,點選最後一條記錄,會增加一條新的記錄,
程式碼如下,使用繼承SimpleAdapter
1.TestAdapter
package com.TestAdapter; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import android.app.Activity; import android.content.Context; import android.os.Bundle; import android.view.View; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.AbsListView.OnScrollListener; import android.widget.AdapterView.OnItemClickListener; import android.widget.AdapterView.OnItemSelectedListener; import android.widget.AbsListView; import android.widget.ImageView; import android.widget.ListView; import android.widget.SimpleAdapter; import android.widget.TextView; import android.widget.Toast; public class TestAdapter extends Activity { /** Called when the activity is first created. */ private int[] images ; private ListView listview; private MyAdapter adapter; List<Map<String,Integer>> al; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); images = new int[]{android.R.drawable.ic_btn_speak_now, android.R.drawable.alert_light_frame, android.R.drawable.arrow_down_float, android.R.drawable.arrow_up_float, android.R.drawable.btn_star_big_off, android.R.drawable.btn_star_big_on, android.R.drawable.button_onoff_indicator_off, android.R.drawable.button_onoff_indicator_on, android.R.drawable.checkbox_off_background, android.R.drawable.checkbox_on_background, android.R.drawable.ic_btn_speak_now, android.R.drawable.ic_delete}; listview = (ListView)findViewById(R.id.listview); al = new ArrayList<Map<String,Integer>>(); for(int i=0; i<12; i++){ HashMap<String,Integer > map = new HashMap<String,Integer>(); map.put(""+i, images[i]); al.add(map); } adapter = new MyAdapter(this, al, R.layout.list_item, new String[]{"imageview", "tv"}, new int[]{R.id.imageview, R.id.tv}); listview.setAdapter(adapter); listview.setOnItemClickListener(new OnItemClickListener() { public void onItemClick(AdapterView<?> arg0, View arg1, int count, long arg3) { if(adapter.getCount()==count+1){ HashMap<String ,Integer> map = new HashMap<String, Integer>(); map.put(""+(adapter.mItemList.size()), android.R.drawable.ic_dialog_email); al.add(map); adapter.mItemList = al; adapter.notifyDataSetChanged(); Toast.makeText(TestAdapter.this, "正在重新整理", Toast.LENGTH_SHORT).show(); } } }); } private class MyAdapter extends SimpleAdapter{ int count = 0; private List<Map<String, Integer>> mItemList; public MyAdapter(Context context, List<? extends Map<String, Integer>> data, int resource, String[] from, int[] to) { super(context, data, resource, from, to); mItemList = (List<Map<String, Integer>>) data; if(data == null){ count = 0; }else{ count = data.size(); } } public int getCount() { return mItemList.size(); } public Object getItem(int pos) { return pos; } public long getItemId(int pos) { return pos; } @Override public View getView(int position, View convertView, ViewGroup parent) { Map<String ,Integer> map = mItemList.get(position); int image = map.get(""+position); View view = super.getView(position, convertView, parent); ImageView imageview = (ImageView)view.findViewById(R.id.imageview); TextView tv = (TextView)view.findViewById(R.id.tv); imageview.setBackgroundResource(image); tv.setText(""+position); return view; } } }
下面我們再來看看使用繼承BaseAdapter來重新整理listview資料:
public class PersonAdapter extends BaseAdapter { private ArrayList<PersonBean> mList; private Context mContext; public PersonAdapter(ArrayList<PersonBean> list, Context context) { mList = list; mContext = context; } public void refresh(ArrayList<PersonBean> list) { mList = list;//傳入list,然後呼叫notifyDataSetChanged方法 notifyDataSetChanged(); } @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) { Holder holder = null; if (convertView == null) { LayoutInflater inflater = LayoutInflater.from(mContext); convertView = inflater.inflate(R.layout.list_item, null); holder = new Holder(); holder.mNameText = (TextView)convertView.findViewById(R.id.name_text); holder.mIDText = (TextView)convertView.findViewById(R.id.id_text); convertView.setTag(holder); } else { holder = (Holder) convertView.getTag(); } holder.mNameText.setText(mList.get(getCount() - position - 1).getName()); holder.mIDText.setText(mList.get(getCount() - position - 1).getID()); return convertView; } class Holder { private TextView mNameText, mIDText; } }
在使用這種型別時,在Activity使用mAdapter.notifyDataSetChanged()時候,有時候會發現資料不能夠及時的更新。下面看一下主Activity:
public class ListViewRefreshActivity extends Activity { private ListView mListView; private ArrayList<PersonBean> mList; private PersonAdapter mAdapter; private Handler mHandler; private String mName, mID; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); mListView = (ListView)findViewById(R.id.listView); mList = new ArrayList<PersonBean>(); mAdapter = new PersonAdapter(mList, ListViewRefreshActivity.this); mListView.setAdapter(mAdapter); mHandler = new Handler() { @Override public void handleMessage(Message msg) { super.handleMessage(msg); mList.add((PersonBean) msg.obj); Log.v("@@@@@@", "this is get message"); mAdapter.refresh(mList); // mAdapter.notifyDataSetChanged(); } }; // final Message message = new Message(); new Thread(new Runnable() { @Override public void run() { try { for (int i = 0; i < 10; i++) { mName = "hao :" + i; mID = "" + i; PersonBean bean = new PersonBean(); bean.setID(mID); bean.setName(mName); Message message = new Message(); message.obj = bean; Thread.sleep(3000); mHandler.sendMessage(message); // mHandler.sendMessageDelayed(message, 10000); }}catch (Exception e) { e.printStackTrace(); } } }).start(); } }