android之listview分頁載入上拉重新整理、更新listview
阿新 • • 發佈:2019-01-07
==========系統方法實現上啦重新整理=========
public class GreatToolsActivity extends Activity { private TextView tv; private ListView listtest; private LinearLayout lt; private TestSmsSafeAdapt adp; private ArrayList<String> oneStr; @Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_greatetools); TextView tv = findViewById(R.id.tv_guishudi); tv.setClickable(true); //手機號碼歸屬地的textView的點選事件 tv.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Intent intent = new Intent(GreatToolsActivity.this, NuberAdressActivty.class); startActivity(intent); } }); //********************listview分批載入資料測試****************** oneStr = new ArrayList<String >();//更新的資料 for (int m=0;m<5;m++){ oneStr.add(m+""); } lt = findViewById(R.id.nowLoading); listtest = findViewById(R.id.listtest); loadingListview();//載入資料 //給listview註冊滾動事件的監聽器 listtest.setOnScrollListener(new AbsListView.OnScrollListener() { //當滾動的狀態發生變化的時候 @Override public void onScrollStateChanged(AbsListView absListView, int i) { switch (i) { case AbsListView.OnScrollListener.SCROLL_STATE_IDLE: Log.e("scroll", "空閒狀態"); //判斷當前listview的位置 int lastposition = listtest.getLastVisiblePosition();//獲取最後一個可見條目在所有資料集合中的位置 Log.e("scroll", "空閒狀態"+lastposition); if (lastposition == oneStr.size() - 1) { //列表被移動到最後的位置,載入更過資料 for (int n = 0; n < 2; n++) { if(oneStr.size()+n<100) { oneStr.add((oneStr.size() + 1)+""); } } loadingListview();//重新整理listview } break; case AbsListView.OnScrollListener.SCROLL_STATE_TOUCH_SCROLL: Log.e("scroll", "手指觸控狀態"); break; case AbsListView.OnScrollListener.SCROLL_STATE_FLING: Log.e("scroll", "慣性滑行狀態"); break; } } // 滾動的時候 @Override public void onScroll(AbsListView absListView, int i, int i1, int i2) { } }); } //********載入資料 private void loadingListview() { lt.setVisibility(View.VISIBLE);//設定轉圈的佈局可見 if (adp == null) { adp = new TestSmsSafeAdapt(); } lt.setVisibility(View.INVISIBLE);//設定轉圈的佈局不可見 listtest.setAdapter(adp); } private class TestSmsSafeAdapt extends BaseAdapter { @Override public int getCount() { return oneStr.size(); } @Override public Object getItem(int i) { return null; } @Override public long getItemId(int i) { return 0; } //有多少個條目,這個方法就會被呼叫多少次 @Override public View getView(final int i, View view, ViewGroup viewGroup) { final View v; if (view != null) { v = view; } else { v = View.inflate(getApplicationContext(), R.layout.listtestitem, null); tv = (TextView) v.findViewById(R.id.list_testitemtv); } tv.setText(oneStr.get(i)); return v; } } }
============更新listView的資料==========
public class CallSmsSafeActivty extends Activity { private TextView tv_blackname; private ListView lst_blackname; private List<BlackNumberInfo> infos; private BlacknameDao dao; private CallSmsSafeAdapt adp; private Button adblackBtn; @Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.callsmssafe_activity); tv_blackname = findViewById(R.id.tv_blackname); lst_blackname = findViewById(R.id.lst_blackname); dao = new BlacknameDao(this); infos = dao.findAll(); adp = new CallSmsSafeAdapt(); lst_blackname.setAdapter(adp); adblackBtn =(Button)findViewById(R.id.addblacknameBtn); adblackBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { addblacknameClick(view);//點選天加按鈕 } }); } private class CallSmsSafeAdapt extends BaseAdapter { private viewHolder holder; @Override public int getCount() { return infos.size(); } @Override public Object getItem(int i) { return null; } @Override public long getItemId(int i) { return 0; } //有多少個條目,這個方法就會被呼叫多少次 @Override public View getView(final int i, View view, ViewGroup viewGroup) { final View v; if (view != null) { v = view; holder = (viewHolder) v.getTag(); } else { v = View.inflate(getApplicationContext(), R.layout.list_callblackname_item, null); holder = new viewHolder(); holder.tv = (TextView) v.findViewById(R.id.list_blackname_item); v.setTag(holder); } holder.tv.setText(infos.get(i).getNumber()); AlertDialog.Builder bu=new AlertDialog.Builder(CallSmsSafeActivty.this);//注意這裡不能用getApplicationContext(),對話方塊只能用this,this代表當前的activity; bu.setTitle("警告"); bu.setMessage("確定給取消"); bu.setPositiveButton("確定", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { //刪除 holder.image=v.findViewById(R.id.image_blackname_item); holder.image.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { //刪除資料 dao.delete(infos.get(i).getNumber()); //通知介面卡更新listview adp.notifyDataSetChanged(); } }); } }); bu.setNegativeButton("取消", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { } }); bu.show(); return v; } } //記事本儲存textview的記憶體地址 class viewHolder { private TextView tv; private ImageView image; } private EditText enterbalckname; private Button cancelBtn; private Button sureBtn; //新增黑名單按鈕,彈出dialog public void addblacknameClick(View view) { Log.e("addblack","d"); AlertDialog.Builder builder = new AlertDialog.Builder(this); final AlertDialog dialog = builder.create(); View contentview = View.inflate(this, R.layout.dialog_enterblackname, null); dialog.setView(contentview, 0, 0, 0, 0); dialog.show(); // enterbalckname = findViewById(R.id.et_enterblackname); cancelBtn = findViewById(R.id.enterBlacknamecancelclick); sureBtn = findViewById(R.id.enterBlacknamesureclick); sureBtn.setOnClickListener(new View.OnClickListener() { @SuppressLint("WrongConstant") @Override public void onClick(View view) { String blackname = enterbalckname.getText().toString().trim(); if (TextUtils.isEmpty(blackname)) { // 電話不能為空 Toast.makeText(getApplicationContext(), "號碼不能為空", 1); return; } //吧資料加到資料庫 dao.add(blackname); //更新listView BlackNumberInfo info=new BlackNumberInfo(); info.setNumber(blackname); infos.add(info); //通知listview資料介面卡更新 adp.notifyDataSetChanged(); dialog.dismiss(); } }); cancelBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { dialog.dismiss(); } }); } }
listview.setDevice(null);//分割線設定為null
listview.setverticalscrollbarEnabled(false);//設定垂直方向不能滾動;
item和button點選事件衝突的解決:
android:descendantFocusability="blocksDescendants"
如果ListView的item中包含了button等同樣需要點選事件監聽的控制元件時,系統在預設情況下使item中的事件監聽的控制元件獲取焦點,使ListView失去焦點,導致無法響應setOnItemClickListener()方法。
那麼新增的這個屬性是什麼意思呢?
beforeDescendants:viewGroup會優先其子控制元件而獲取到焦點。
afterDescendants:viewGroup只有當子類控制元件不需要獲取焦點時才獲取焦點。
blocksDescendants:viewGroup會覆蓋子類控制元件而直接獲取焦點。