2014-06-06 3 views
0

2 개의 텍스트 상자와 확인란이 들어있는 조각 목록을 부 풀리는 활동이 있습니다. 내 목록에 잘 채 웁니다. 그러나 확인란을 선택하면 관련 조각 (IE의 상자 2를 선택했을 때 IE가 getView에 의해 호출 된 마지막 상자 인 경우 상자 8이 확장 될 것입니다.) 대신 getView()가 호출 한 마지막 조각을 참조합니다.) 어떻게 해결할 수 있습니까? 코드는 다음과 같습니다GetView ListFragment checkboox 문제

package com.bango.chdebug; 

import java.util.ArrayList; 
import java.util.UUID; 

import android.os.Bundle; 
import android.support.v4.app.ListFragment; 
import android.util.Log; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.ArrayAdapter; 
import android.widget.CheckBox; 
import android.widget.CompoundButton; 
import android.widget.CompoundButton.OnCheckedChangeListener; 
import android.widget.ListView; 
import android.widget.TextView; 

public class VoteListFragment extends ListFragment { 
    private ArrayList<MediaItem> myML; 
    public static boolean myCheckBoxState = false; 
    private ArrayList<UUID> voteList; 
    private MediaItem temp; 
    private int maxVote = 0; 
    private CheckBox voteBox; 
    public static String VOTE_KEY = "vote"; 
    public String TAG = "NewMediaList"; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     // TODO Auto-generated method stub 
     super.onCreate(savedInstanceState); 
     temp = new MediaItem(); 
     if(savedInstanceState != null){ 
     myCheckBoxState = savedInstanceState.getBoolean(VOTE_KEY, false); 
     } 
     getActivity().setTitle("New Movie List"); 
     voteList = new ArrayList<UUID>(); 
     myML = MediaDB.get(getActivity()).getVoteMediaItems(); 
     MediaAdapter medAdapt = new MediaAdapter(myML); 
     setListAdapter(medAdapt); 
    } 

    private class MediaAdapter extends ArrayAdapter<MediaItem> { 
     public MediaAdapter(ArrayList<MediaItem> mediaItems) { 
      super(getActivity(), 0, mediaItems); 
      // mediaItems = parseOfficialList(mediaItems); 
     } 

     @Override 
     public View getView(int position, View convertView, ViewGroup parent) { 
      // TODO Auto-generated method stub 
      if (convertView == null) { 
       convertView = getActivity().getLayoutInflater().inflate(
         R.layout.new_media_list_item, null); 
      } 
      temp = getItem(position); 
      TextView medTitle = (TextView) convertView 
        .findViewById(R.id.vote_media_title); 
      TextView medDate = (TextView) convertView 
        .findViewById(R.id.vote_media_date); 
      voteBox = (CheckBox) convertView 
        .findViewById(R.id.vote_media_cb); 
      medTitle.setText(temp.getMyTitle()); 
      voteBox.setEnabled(true); 
      voteBox.setOnCheckedChangeListener(new OnCheckedChangeListener(){ 
       @Override 
       public void onCheckedChanged(CompoundButton buttonView, 
         boolean isChecked) { 
        // TODO Auto-generated method stub 
        Log.d("onresume", "On Check called for " + temp.getMyTitle()); 
       } 
      }); 
      return convertView; 
     } 
    } 
    } 

답변

0

이 질문은 listview-checkbox-trouble, listview-with-checkbox-and-all-clickable 또는 get-selected-item-using-checkbox-in-listview를 참조 이미 회수를 요구하고있다.

CheckBox를 클릭하면 getView()으로 마지막으로 전화해야한다는 보장은 없습니다. 어떤 문서/예제에서도 언급되지 않았기 때문에 이에 의존해서는 안됩니다. 귀하의 목록은 단지 입니다.보기는입니다. 데이터 자체는 다른 엔티티에 저장되어야합니다. 귀하의 코드에서 엔티티는 사용되지 않습니다. 체크 된 상태/체크되지 않은 상태를 저장하고 뷰에 다시 참조 (예 : 저장소의 데이터 위치)를 저장해야합니다.

다음은 약간 재 작업 한 조각입니다. 확인란 상태를 저장하려면 필드를 MediaItem에 새로 추가했습니다. 필요한 경우 별도의 배열을 사용하여 해당 상태를 저장할 수 있습니다.

public class VoteListFragment extends ListFragment { 
    private ArrayList<MediaItem> myML; 
    public static boolean myCheckBoxState = false; 
    private ArrayList<UUID> voteList; 
    private MediaItem temp; 
    private int maxVote = 0; 
    private CheckBox voteBox; 
    public static String VOTE_KEY = "vote"; 
    public String TAG = "NewMediaList"; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     // TODO Auto-generated method stub 
     super.onCreate(savedInstanceState); 
     temp = new MediaItem("item"); 
     if(savedInstanceState != null){ 
      myCheckBoxState = savedInstanceState.getBoolean(VOTE_KEY, false); 
     } 
     getActivity().setTitle("New Movie List"); 
     voteList = new ArrayList<UUID>(); 
     myML = getVoteMediaItems(getActivity()); 
     MediaAdapter medAdapt = new MediaAdapter(myML); 
     setListAdapter(medAdapt); 
    } 

    private ArrayList<MediaItem> getVoteMediaItems(final Activity activity) { 
     final ArrayList<MediaItem> items = new ArrayList<MediaItem>(); 

     for (int i = 0; i < 100; i++) { 
      items.add(new MediaItem(String.valueOf(i) + " item")); 
     } 

     return items; 
    } 

    private class MediaAdapter extends ArrayAdapter<MediaItem> { 

     private CompoundButton.OnCheckedChangeListener mCheckedListener = new CompoundButton.OnCheckedChangeListener(){ 
      @Override 
      public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
       Integer position = (Integer) buttonView.getTag(); 

       if (position != null) { 
        Toast.makeText(getActivity(), "On Check called for " + getItem(position).getMyTitle(), Toast.LENGTH_LONG).show(); 
        getItem(position).checked = isChecked; 
       } 
      } 
     }; 

     public MediaAdapter(ArrayList<MediaItem> mediaItems) { 
      super(getActivity(), 0, mediaItems); 
      // mediaItems = parseOfficialList(mediaItems); 
     } 

     @Override 
     public View getView(int position, View convertView, ViewGroup parent) { 
      // TODO Auto-generated method stub 
      if (convertView == null) { 
       convertView = getActivity().getLayoutInflater().inflate(
         R.layout.new_media_list_item, null); 
      } 

      temp = getItem(position); 

      // Consider using of ViewHolder pattern instead of call findViewById() to improve performance 
      TextView medTitle = (TextView) convertView 
        .findViewById(R.id.vote_media_title); 
      TextView medDate = (TextView) convertView 
        .findViewById(R.id.vote_media_date); 
      voteBox = (CheckBox) convertView 
        .findViewById(R.id.vote_media_cb); 
      medTitle.setText(temp.getMyTitle()); 
      voteBox.setEnabled(true); 
      voteBox.setOnCheckedChangeListener(null); 
      voteBox.setChecked(temp.checked); 
      voteBox.setTag(position); 

      voteBox.setOnCheckedChangeListener(mCheckedListener); 
      return convertView; 
     } 
    } 

    public class MediaItem { 
     private String myTitle; 
     // Newly added field 
     private boolean checked = false; 

     MediaItem(String title) { 
      myTitle = title; 
     } 

     public String getMyTitle() { 
      return myTitle; 
     } 
    } 
}