2017-12-24 13 views
0

조각에 3 개의 ListView가 있으며 이제는 새 페이지를 열고 일부 요소를 표시하기 위해 클릭 한 개체를 가져와야합니다.ListView에서 요소 가져 오기

문제점은 내 탭에서 ListView가 Sqlite db를 쿼리하여 채워지고 목록에 요소를 추가 할 때 모든 페이지가 0에서 시작된다는 것입니다. 그러나 내 DB에는 각 요소마다 다른 ID가 있습니다.

올바른 요소를 얻으려면 어떻게해야합니까?

public View onCreateView(LayoutInflater inflater, ViewGroup container, 
           Bundle savedInstanceState) { 

      Integer pageToShow = getArguments().getInt(ARG_SECTION_NUMBER); 

      View rootView = inflater.inflate(R.layout.fragment_choose_character, container, false); 
      ListView listView = (ListView) rootView.findViewById(R.id.listViewPersonaggi); 

      personaggiDB = new DatabasePersonaggiHandler(getContext()); 
      ArrayList<Personaggio> personaggi = personaggiDB.getAllPersonaggi(pageToShow); 

      // Adatto il personaggio alla grafica della lista 
      this.m_adapter = new PersonaggioAdapter(getContext(), R.layout.riga_personaggio, personaggi); 
      listView.setAdapter(this.m_adapter); 

      // Su ogni elemento della lista aggiungo il click 
      listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
       @Override 
       public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) { 

        Intent singoloPersonaggioIntent = new Intent(getContext(), SingoloPersonaggioActivity.class); 
        singoloPersonaggioIntent.putExtra("idPersonaggio", i); 
        startActivity(singoloPersonaggioIntent); 
       } 
      }); 

      return rootView; 
     } 

당신은 내가이 줄을 사용 볼 수 있듯이 :

ArrayList<Personaggio> personaggi = personaggiDB.getAllPersonaggi(pageToShow); 

각 페이지가 다른 문자가 그래서 내 DB에서 얻을 문자의 유형을 이해합니다.
예를 들어 내 두 번째 탭 pageToShow = 2의 첫 번째 요소에는 위치 0이 있지만 내 DB에는 id = 12 등이 있습니다.

아이디어가 있으십니까?

+1

이 정보는 도움이 될 수 있습니다. https://stackoverflow.com/questions/3041218/assigning-id-to-a-row-in-an-android-listview – lib4

답변

0

목록 항목 클릭시 데이터를 전달하는 세 가지 방법이 있습니다. 먼저

1. 당신은 당신이 다음 화면으로 IdPrimaryKey을 통과해야 다음 페이지의 전체 데이터를로드 할 경우. 그렇게하려면 어댑터에서 목록 항목을 가져와야합니다. 어댑터에서

@Override 
    public Personaggio getItem(int position) { 
     return list.get(position); 
    } 

그런 다음 클릭 된 항목에 대한 인스턴스를 가져옵니다.

2

listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
     @Override 
     public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) { 
      if(listView.getAdapter()!=null){ 
       Personaggio obj=m_adapter.getItem(position); 
       Intent singoloPersonaggioIntent = new Intent(getContext(), SingoloPersonaggioActivity.class); 
       singoloPersonaggioIntent.putExtra("idPersonaggio", obj.getId()); 
       startActivity(singoloPersonaggioIntent); 
      } 
     } 
    }); 

는 두 번째 경우 직접 다음 활동에 개체를 전달할 수 있습니다.

listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
     @Override 
     public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) { 
      if(listView.getAdapter()!=null){ 
       Personaggio obj=m_adapter.getItem(position); 
       Intent singoloPersonaggioIntent = new Intent(getContext(), SingoloPersonaggioActivity.class); 
       singoloPersonaggioIntent.putExtra("data", obj); 
       startActivity(singoloPersonaggioIntent); 
      } 
     } 
    }); 

이 경우 모델 클래스는 Serializable이어야합니다.

class Personaggio implements Serializable{ 

    } 
CursorAdapter (결과적으로 SimpleCursorAdapter) ID가 테이블의 행 번호를 반환 즉, _id 들어

3.

. 따라서 CursorAdapter를 사용한다면 간단히 네 번째 긴 매개 변수를 사용할 수 있습니다. 이름은 _id이어야합니다.

listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
     @Override 
     public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) { 
      if(listView.getAdapter()!=null){ 

       Intent singoloPersonaggioIntent = new Intent(getContext(), SingoloPersonaggioActivity.class); 
       singoloPersonaggioIntent.putExtra("idPersonaggio", l); 
       startActivity(singoloPersonaggioIntent); 
      } 
     } 
    }); 
+0

감사합니다. 저는 2 번째 제안을 사용했으며 매력처럼 작동합니다! –