2015-01-09 24 views
0

항목을 클릭 한 후 데이터베이스에서 항목의 ID를 가져오고이 ID를 다른 활동으로 보내려고합니다.Android에서 getItemAtPosition 메소드로 ID 받기

java.lang.ClassCastException: java.lang.String cannot be cast to com.example.myPackage.Place 

그 오류가 선으로 일으키는 : 나는 아래 줄에 그 선을 변경하는 경우 물론

Place mPlace = (Place)(lv.getItemAtPosition(position)); 

는 응용 프로그램이 작동하지만 난 점점

는 오류가 발생합니다 대신 화면에 표시되는 단일 행의 이름은 id입니다.

String str = (String)(lv.getItemAtPosition(position)); 

여기 내 전체 코드가 있습니다.

public class VisitedPlaces extends ListActivity { 

    private ArrayList<String> results = new ArrayList<String>(); 

    protected void onCreate(Bundle savedInstanceState) { 
     . 
     . 
     . 
     fillTheList(); 
     displayResultList(); 
    } 

    public void fillTheList(){ 
     DataBaseHelper dbHelper = new DataBaseHelper(this.getApplicationContext()); 

     List<Place> placesList = new ArrayList<>(); 
     String sql = "SELECT _id, Name, Description, Latidute, Longtidute FROM Places WHERE Visited=1"; 
     placesList = dbHelper.getAllPlaces(sql); 

     for (Place place : placesList){ 
      results.add(place.getPlaceName()); 
     } 
    } 

    public void displayResultList() { 

     ListView lv = getListView(); 
     lv.addHeaderView(tvNew); 
     lv.setTextFilterEnabled(true); 
     setListAdapter(new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1, results)); 

     lv.setOnItemClickListener(new OnItemClickListener() { 
      @Override 
      public void onItemClick(AdapterView<?> parent, View view, int position, 
        long id) { 

//  String str = (String)(lv.getItemAtPosition(position)); 
     Place mPlace = (Place)(lv.getItemAtPosition(position)); //HERE IS A PROBLEM 
     int mID = mPlace.getID(); 

     Toast.makeText(getApplicationContext(),"Click ListItem: " + mID + ", " + id + ", " , Toast.LENGTH_LONG).show();        

     goToPlaceDescriptions(view, id); 

      } 
     });  
    } 

    public void goToPlaceDescriptions(View v, long id) { 
     Intent intent = new Intent(this, PlaceDescriptions.class); 
     intent.putExtra("id", id); 
     startActivity(intent); 
    } 
} 

좀 도와 줄 수 있습니까? 다음,

가 전역 변수로 placesList을 설정 올바른 Place 얻을이 줄을 쓰기 :

+1

당신은 String 타입의 ArrayAdapter를 가지고 있습니다. Place 타입의 ArrayAdapter를 직접 만들고 싶을 것입니다. 또는 할 수있는 해킹은 다음과 같습니다. Place mPlace = placesList.get (position); – mlaHackingIsMagic

답변

1

문제는 당신이 ArrayAdapter와를 사용하는 것입니다. BaseAdapter에서 확장 될 사용자 지정 어댑터가 더 나은 솔루션이라고 생각합니다.

사용자 정의 어댑터 클래스 :

아래의 코드를보고하십시오

 public class PlaceListAdapter extends BaseAdapter { 

     private List<Place> mPlaceList; 
     private Context mContext; 

     PlaceListAdapter(List<Place> placeList, Context c){ 
      mPlaceList = new LinkedList<>(placeList); 
      mContext = c; 
     } 
     @Override 
     public int getCount() { 
      return mPlaceList.size(); 
     } 

     @Override 
     public Place getItem(int i) { 
      return mPlaceList.get(i); 
     } 

     @Override 
     public long getItemId(int i) { 
      return i; 
     } 

     @Override 
     public View getView(int i, View view, ViewGroup viewGroup) { 
      //here inflate and return some view it can be text view 
     } 
    } 

이제 코드는 내가 코드에서 몇 가지 실수를 할 수

 public class VisitedPlaces extends ListActivity { 

     private List<Place> results = new ArrayList<Place>(); 

     protected void onCreate(Bundle savedInstanceState) { 
      . 
      . 
      . 
      fillTheList(); 
      displayResultList(); 
     } 

     public void fillTheList(){ 
      DataBaseHelper dbHelper = new DataBaseHelper(this.getApplicationContext()); 
      String sql = "SELECT _id, Name, Description, Latidute, Longtidute FROM Places WHERE Visited=1"; 
      List<Place> placesList = dbHelper.getAllPlaces(sql); 

      for (Place place : placesList){ 
       results.add(place); 
      } 
     } 

     public void displayResultList() { 

      ListView lv = getListView(); 
      lv.addHeaderView(tvNew); 
      lv.setTextFilterEnabled(true); 
      setListAdapter(new PlaceListAdapter(results, this)); 

      lv.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
       @Override 
       public void onItemClick(AdapterView<?> parent, View view, int position, 
             long id) { 
        Place mPlace = (((PlaceListAdapter)parent.getAdapter()).getItem(position)); //HERE IS A PROBLEM 
        int mID = mPlace.getID(); 

        Toast.makeText(getApplicationContext(),"Click ListItem: " + mID + ", " + id + ", " , Toast.LENGTH_LONG).show(); 

        goToPlaceDescriptions(view, id); 

       } 
      }); 
     } 

     public void goToPlaceDescriptions(View v, long id) { 
      Intent intent = new Intent(this, PlaceDescriptions.class); 
      intent.putExtra("id", id); 
      startActivity(intent); 
     } 

    } 

아래처럼되지만 아이디어가 가장 중요합니다. 사용자 지정 목록 어댑터에 대해 읽어보십시오.

+0

감사합니다. 사실 yout 솔루션은 내가 필요한 것입니다. –

+0

당신을 환영합니다, 내가 당신을 도울 수있어서 기쁩니다. –

1

캐스팅없이, 이렇게

Place mPlace=placesList.get(position);