1. 程式人生 > >android之listview分頁載入上拉重新整理、更新listview

android之listview分頁載入上拉重新整理、更新listview

==========系統方法實現上啦重新整理=========

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()方法。

        那麼新增的這個屬性是什麼意思呢?

descendantFocusability屬性是當一個view獲取焦點時,定義viewGroup和其子控制元件之間的關係。該屬性的值有三種:

beforeDescendants:viewGroup會優先其子控制元件而獲取到焦點。

afterDescendants:viewGroup只有當子類控制元件不需要獲取焦點時才獲取焦點。

blocksDescendants:viewGroup會覆蓋子類控制元件而直接獲取焦點。