2012-02-26 96 views
0

我有一个SQLite表,并在某些活动中,我获取表中的所有名称,并使用这些名称填充列表视图。该应用程序。从ListView删除项目时崩溃

在listview监听器中,用户可以删除选定的项目。

问题是当我删除应用程序崩溃的项目。

请把我的代码来看看:

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.mylocations); 

    tv_counter = (TextView) findViewById(R.id.counter); 
    tv_testCounter = (TextView) findViewById(R.id.testCounter); 
    lv = (ListView) findViewById(R.id.mylist); 

    mpoh = new MP_DB(this); 
    db = mpoh.getWritableDatabase(); 
    cv = new ContentValues(); 


     if (hasRecords()) { 
      Toast.makeText(getBaseContext(), getRowsNum()+" row(s)", Toast.LENGTH_SHORT).show(); 
      get_MPNames(); 
      arrayToArrayList(); 
      setListView(); 
      lv.setOnItemClickListener(listViewListener); 
     } else { 
      Toast.makeText(getBaseContext(), "NO RECORDS"+","+getRowsNum()+"rows", Toast.LENGTH_SHORT).show(); 
     } 
} 

以下是数组ArrayList的转换方法,和列表视图听众:

private void arrayToArrayList() { 
    int s = str.length; 
    al = new ArrayList<String>(); 
    for (int i=0; i < s; i++) { 
     al.add(str[i]); 
    } 
} 

private int getRowsNum() { 
    return mpoh.getCurrentRowNumber(); 
} 

OnItemClickListener listViewListener =新OnItemClickListener(){

@Override 
    public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, 
      long arg3) { 
     // TODO Auto-generated method stub 
     pos = arg2; 
     showDialoge();   
    } 
}; 

这里我如何从数据库和ListView中删除元素:

private void deleteMPfromListView(int pos) { 
    al.remove(pos); 
    adapter.notifyDataSetChanged(); 
    Toast.makeText(getBaseContext(), al.size()+" rows left in list view", Toast.LENGTH_SHORT).show(); 
} 

private void deleteMPFromDB(int pos) { 
    mpoh.deleteMP(pos); 
    Toast.makeText(getBaseContext(), getRowsNum()+" rows left in DB", Toast.LENGTH_SHORT).show(); 
} 

private Boolean hasRecords() { 
    if (getRowsNum() == 0) { 
     return false; 
    } else { 
     return true; 
    } 
} 

private void setListView() { 

    adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, 
      android.R.id.text1, al); 
    lv.setAdapter(adapter);  
} 

private void get_MPNames() { 

    str = new String[getRowsNum()]; 

    for (int i=0; i <= getRowsNum()-1; i++) { 
     str[i] = mpoh.getMP_Name(i+1); 
    } //tv_testCounter.setText(str[87]); 
} 

回答

1

从数据库中删除与将它们从ListView中删除无关。我有你的实现不是代码,但你可以尝试这样的东西太多动态添加或删除项目:

public class LVDemo extends ListActivity { 

// handles the ListView data 
ArrayAdapter<String> adapter; 

// Items that are displayed 
ArrayList<String> listItems=new ArrayList<String>(); 

@Override 
public void onCreate(Bundle icicle) { 

    super.onCreate(icicle); 
    setContentView(R.layout.main); 
    adapter=new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, 
     listItems); 
    setListAdapter(adapter); 
} 

/** 
* Remove item. 
*/ 
public void removeItem(int index) { 
    listItems.remove(index); 
    adapter.notifyDataSetChanged(); 
} 

}

在将军:你改变ArrayList中含有的元素,然后通知该适配器ListView控件

+0

但似乎我的列表视图比你贴的不同,请参见下面 – LetsamrIt 2012-02-26 09:32:44

+0

私人无效setListView(){ \t \t \t \t适配器=新ArrayAdapter (this,android.R.layout.simple_list_item_1, android.R.id.text1,str); lv.setAdapter(adapter); \t} – LetsamrIt 2012-02-26 09:33:54

+0

我没有看到任何真正的区别。您有适配器的第四个参数。这只是布局中ListView的ID。有关详细信息,请参阅http://developer.android.com/reference/android/widget/ArrayAdapter.html#ArrayAdapter%28android.content.Context,%20int,%20int,%20java.util.List%3CT%3E%29。 ArrayAdapter。 lv.setAdapter(adapter);似乎与setListAdapter(适配器)类似; 。不同之处在于我在ListView Activity中调用了它,并且您有一个对象ListView lv = ...,然后使用setAdapter的外部调用来设置适配器。 – Moritz 2012-02-26 09:48:36

相关问题