2014-03-28 4 views
0


나는 확인란이있는 목록의 BaseAdapter를 만들려고합니다. 문제는 각 행 항목의 태그를 가져 오려고하면 null을 반환한다는 것입니다.Android BaseAdapter : getTag()가 null을 반환합니다.

어댑터 :

import java.util.List; 

import android.app.Activity; 
import android.content.Context; 
import android.util.Log; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.view.ViewGroup; 
import android.widget.BaseAdapter; 
import android.widget.CheckBox; 
import android.widget.TextView; 

public class TaskListAdapter extends BaseAdapter { 
    Context context; 
    List<Patient> rowItems; 

    public TaskListAdapter(Context context, List<Patient> items) { 
     super(); 
     this.context = context; 
     this.rowItems = items; 
    } 

    /*private view holder class*/ 
    private class ViewHolder { 
     TextView txtTitle; 
     TextView txtDesc; 
     CheckBox checkbox; 
    } 

    public View getView(final int position, View convertView, ViewGroup parent) { 
     ViewHolder holder = null; 

     LayoutInflater mInflater = (LayoutInflater) 
      context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE); 
     if (convertView == null) { 
      convertView = mInflater.inflate(R.layout.row, parent, false); 
      holder = new ViewHolder(); 
      holder.txtTitle = (TextView) convertView.findViewById(R.id.firstLine); 
      holder.txtDesc = (TextView) convertView.findViewById(R.id.secondLine); 
      holder.checkbox = (CheckBox)convertView.findViewById(R.id.checkbox); 
      convertView.setTag(holder); 

     } else { 
      holder = (ViewHolder) convertView.getTag(); 
     } 

     Patient rowItem = (Patient) getItem(position); 

     holder.txtDesc.setText(rowItem.getName()); 
     holder.txtTitle.setText(rowItem.getAddress()); 
     holder.checkbox.setChecked(rowItem.isSelected()); 

     holder.checkbox.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       CheckBox checkbox = (CheckBox)v.findViewById(R.id.checkbox); 
       Patient rowItem = (Patient) checkbox.getTag(); 
         // rowItem is null now for some reason 
       rowItem.setSelected(checkbox.isChecked()); 
      } 
     }); 

     return convertView; 
    } 

    @Override 
    public int getCount() { 
     return rowItems.size(); 
    } 

    @Override 
    public Object getItem(int position) { 
     return rowItems.get(position); 
    } 

    @Override 
    public long getItemId(int position) { 
     return rowItems.indexOf(getItem(position)); 
    } 
} 

그리고 모델 클래스 : 내가보기를 스크롤 할 때 체크 박스 상태를 저장 할 수 있도록 각 행의 태그를 얻으려고

public class Patient { 
    private String name; 
    private String address; 
    private boolean checked; 

    public Patient(String name, String address, boolean checked) { 
     super(); 
     this.name = name; 
     this.address = address; 
     this.checked = checked; 
    } 

    public String getName() { 
     return name; 
    } 
    public void setName(String name) { 
     this.name = name; 
    } 
    public String getAddress() { 
     return address; 
    } 
    public void setAddress(String address) { 
     this.address = address; 
    } 
    public boolean isSelected() { 
     return checked; 
    } 
    public void setSelected(boolean checked) { 
     this.checked = checked; 
    } 

} 

. 감사합니다. .

+0

당신이 정확한 라인뿐만 아니라 로그 캣 파일을 게시 할 수 logcat에 오류가 발생 했습니까? – Tukajo

답변

1

실제로 CheckBox보기 (R.id.checkbox)에 태그를 설정하지 않았습니다. 적어도 코드에서 공유 한 곳은 없습니다. 따라서 OnClickListener의 rowItem은 null 일 수 있습니다. 수정 :

holder.checkbox.setTag(rowItem); 

대신의 체크 박스 태그와 환자를 설정, 당신은 단지 rowItem은 아래 참조 할 수도있었습니다

final Patient rowItem = (Patient) getItem(position); 

holder.txtDesc.setText(rowItem.getName()); 
holder.txtTitle.setText(rowItem.getAddress()); 
holder.checkbox.setChecked(rowItem.isSelected()); 

holder.checkbox.setOnClickListener(new OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     CheckBox checkbox = (CheckBox)v.findViewById(R.id.checkbox); 
     rowItem.setSelected(checkbox.isChecked()); 
    } 
}); 
+0

첫 번째 방법은 매력처럼 작동합니다, 감사합니다! 두 번째 방법 (onCheckedChangeListener)을 시도했지만 목록이 스크롤되었을 때 확인란 상태를 저장하지 않은 것 같습니다. onClick() 메서드를 사용하고 있기 때문에 실제로 중요하지 않습니다. – user3261344

+0

실제로 귀하의 경우 OnCheckedChangeListener가 좋지 않습니다. 뷰가 프로그래밍 방식 으로든 사용자 작업에 의해 설정되어 있는지 여부에 관계없이 onCheckChanged가 호출됩니다. 따라서 여러분은 자신의 상황에 맞는 OnClickListener를 사용하고 싶을 것입니다. (그 부분을 대답에서 삭제했습니다) – kgmaize

관련 문제