如何動態增減自訂ListView

如何動態增減自訂ListView

情境

基本上強烈建議使用 RecyclerView 來取代 ListView,可以參考如何使用RecyclerView

如何利用自訂的ListView來動態增加或刪除呢?
我們利用如何在ListView中使用Holder pattern來重用view的例子來進行改寫。
我們首先利用Menu讓使用者能夠動態的增加或刪除,
Menu可以參考如何使用Menu來操作。

程式碼說明

先在Menu裡面加入add item選項

@Override
public boolean onCreateOptionsMenu(Menu menu) {
 menu.add(0, Menu.FIRST, 0, "add item");
    return super.onCreateOptionsMenu(menu);
}

就會看到這樣的一個畫面




接著我們想要按下add item的時候,讓ListView多出一列,
在加入public boolean onOptionsItemSelected(MenuItem item) ,
當你按下menu選項的處理事件

@Override
public boolean onOptionsItemSelected(MenuItem item) {
 switch(item.getItemId()){
  case Menu.FIRST://add item
   mAdapter.addItem(mAdapter.getCount() + 1);
   mAdapter.notifyDataSetChanged();
   break;
 }
 return super.onOptionsItemSelected(item);
}

這時候,切換到MyAdapter.java的頁面,新增兩個方法,分別是addItem跟removeItem

public void addItem(Integer i){
 mList.add(i);
}
public void removeItem(int index){
 mList.remove(index);
}

當按下add item的時候,就會呼叫addItem(),
而按下remove item的時候,就會呼叫removeItem(),
這邊應該ListView來存位置,

private ArrayList<Integer> mList;

在建構子初始化它

public MyAdapter(){
 mList = new ArrayList<>();
}

再來就是在getCount()的return變成arrayList的大小

@Override
public int getCount() {
 return mList.size();
}

等到呼叫Adapter.notifyDataSetChanged()方法的時候, 就會在call一次getView方法

@Override
public View getView(int position, View convertView, ViewGroup parent) {
 View v = convertView;
 Holder holder;
 if(v == null){
  v = LayoutInflater.from(getApplicationContext()).inflate(R.layout.list_item, null);
  holder = new Holder();
  holder.text = (TextView) v.findViewById(R.id.text);

  v.setTag(holder);
 } else{
  holder = (Holder) v.getTag();
 }
 holder.text.setText("item " + position);
 return v;
}

現在你可以跑看看程式,一開始什麼都沒有,當按下Menu->add item
就會跑出一列我們自訂的ListView了


接著我們來寫remove item部份
透過listview的長按功能, 可以方便知道按下哪一個item,
最後再透過如何使用AlertDialog內所說的呼叫AlertDialog來讓使用者選擇是否刪除

mListView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
 @Override
 public boolean onItemLongClick(AdapterView<?> parent, View view, final int position, long id) {
  new AlertDialog.Builder(MainActivity.this)
    .setTitle("want to delele?")
    .setMessage("Want to delete " + position + " item?")
    .setPositiveButton("Yes", new DialogInterface.OnClickListener() {
     @Override
     public void onClick(DialogInterface dialog, int which) {
      mAdapter.removeItem(position);
      mAdapter.notifyDataSetChanged();
     }
    })
    .setNegativeButton("No", new DialogInterface.OnClickListener() {
     @Override
     public void onClick(DialogInterface dialog, int which) {

     }
    })
    .show();

  return false;
 }
});

到這裡為止,我們就可以操作新增/刪除的功能了
如果成功就會出現下面的畫面



程式碼