2012-02-26 4 views
0

SQLite 테이블이 있고 특정 작업에서 테이블에서 모든 이름을 가져 와서이 이름으로 listview를 채 웁니다.앱. ListView에서 항목을 삭제할 때 충돌이 발생했습니다.

목록 뷰 수신기 내부에서 사용자는 선택한 항목을 삭제할 수 있습니다.

문제는 응용 프로그램이 충돌하는 항목을 삭제할 때입니다.() {

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 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를 할 수있는 배열을 변환하는 방법 및 목록보기 리스너입니다

것은 내 코드에 봐 주시기 바랍니다

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

여기 DB 및 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

+0

개인 무효 setListView() {= 새로운 ArrayAdapter와 \t \t \t \t 어댑터를 참조하십시오 (this, android.R.layout.simple_list_item_1, android.R.id.text1, str); lv.setAdapter (adapter); \t} – LetsamrIt

+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 (adapter)와 비슷한 것처럼 보입니다. . 차이점은 ListView 액티비티 내에서 호출하고 ListView lv = ... 객체가 있고 setAdapter의 외부 호출을 사용하여 어댑터를 설정한다는 것입니다. – Moritz

관련 문제