情境
基本上強烈建議使用 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;
}
});
到這裡為止,我們就可以操作新增/刪除的功能了
如果成功就會出現下面的畫面