2012-02-16 21 views
9

Tôi biết rằng câu hỏi này đã được hỏi nhiều lần nhưng tôi vẫn chưa thể tìm thấy đề xuất thực sự giúp tôi. Hộp kiểm được bỏ chọn bất cứ khi nào danh sách được cuộn xuống. Có, tôi đang sử dụng một mảng boolean để lưu trữ các giá trị nhưng điều này vẫn không khắc phục được sự cố. Đây là mã của tôi. Xin đề nghị một giải pháp cho việc này. Cảm ơn bạn.CheckBox được bỏ chọn khi cuộn trong danh sách tùy chỉnh

public View getView(final int position, View convertView, ViewGroup parent) { 
    // TODO Auto-generated method stub 
     final ViewHolder holder; 
final boolean[] itemChecked=new boolean[30]; 

    LayoutInflater inflater = context.getLayoutInflater(); 
    if(convertView==null) 
    { 
     convertView = inflater.inflate(R.layout.custom_list, null); 
     holder = new ViewHolder(); 
     holder.txtViewTitle = (TextView) convertView.findViewById(R.id.title_text); 
     holder.txtViewDescription = (TextView) convertView.findViewById(R.id.description_text); 
     holder.cb=(CheckBox) convertView.findViewById(R.id.cb); 
     convertView.setTag(holder); 

    } 

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

    } 

    holder.cb.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 

      @Override 
      public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
       // TODO Auto-generated method stub 
       itemChecked[position] = isChecked; 
       if(itemChecked[position]) 
       { 
        holder.cb.setChecked(true); 
       } 
       else 
       { 
        holder.cb.setChecked(false); 
       } 
     holder.txtViewTitle.setText(title[position]); 
    holder.txtViewDescription.setText(description[position]); 
    holder.cb.setChecked(itemChecked[position]); 
    holder.txtViewDescription.setFocusable(false); 
    holder.txtViewTitle.setFocusable(false); 

return convertView; 

} 

} 

Trả lời

11

getView() được gọi khi bất kỳ mục danh sách vô hình nào trước đây cần được vẽ. Vì bạn tạo lại itemChecked[] mỗi lần phương thức này được gọi là bạn sẽ không chọn hộp kiểm mới và một Mảng khác nhau cho mỗi Chế độ xem kết quả. (cuối cùng trong Java không làm cho trường đó duy nhất như trong C) Cách đơn giản nhất để giải quyết đó là làm cho trạng thái hộp kiểm itemChecked một lớp học và thiết lập/khôi phục hộp kiểm dựa trên trường đó.

public class MyListAdapter extends ArrayAdapter<Object> { 
    private final boolean[] mCheckedState; 
    private final Context mContext; 

    public MyListAdapter(Context context, int resource, int textViewResourceId, List<Object> objects) { 
     super(context, resource, textViewResourceId, objects); 
     mCheckedState = new boolean[objects.size()]; 
     mContext = context; 
    } 


    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     // simplified to just a Checkbox 
     // ViewHolder and OnCheckedChangeListener stuff left out 
     CheckBox result = (CheckBox)convertView; 
     if (result == null) { 
      result = new CheckBox(mContext); 
     } 
     result.setChecked(mCheckedState[position]); 
     return result; 
    } 
} 
+0

@Zapi rằng cố định vấn đề. Tôi đã câm. Cảm ơn bạn. – Dinesh

+0

Tôi đã cập nhật mã một chút. Nó có thể không thực sự làm việc mặc dù :) – zapl

+0

mCheckedState = new boolean [objects.size()]; Trong dòng này đối tượng là gì ?? –

3

Dưới đây là ví dụ. Đọc các nhận xét trong getView (...) của bộ điều hợp được cung cấp bên dưới.


class TaskObject { 
     private int pid; 
     private String processName; 
     private boolean toKill; 
///getters/setters 
     public boolean isToKill() { 
      return toKill; 
     }  
     public void setToKill(boolean toKill) { 
      this.toKill = toKill; 
     } 
     ................................ 
    } 

class TaskListAdapter extends BaseAdapter { 

    private static final String TAG = "adapter"; 

    ArrayList<TaskObject> list; 
    Context context; 

    public TaskListAdapter(Context context) { 
     Log.d(TAG, "created new task list adapter"); 
     this.context = context; 
     if (list == null) { 
      list = new ArrayList<TaskObject>(); 
     } 
    } 

    public void addTask(TaskObject taskObject) { 
     list.add(taskObject); 
    } 

    public void clearTasks() { 
     list.clear(); 
     Log.d(TAG, "list size:" + list.size()); 
     this.notifyDataSetChanged(); 
    } 

    public int getCount() { 
     return list.size(); 
    } 

    public TaskObject getItem(int position) { 
     return list.get(position); 
    } 

    public long getItemId(int position) { 
     return position; 
    } 

    public View getView(final int position, View convertView, ViewGroup parent) {   
     RelativeLayout rl = new RelativeLayout(context); 
     TextView textPid = new TextView(context); 
     textPid.setText(Integer.toString(getItem(position).getPid())); 
     TextView textName = new TextView(context); 
     textName.setText(getItem(position).getProcessName()); 

     /////Here is your and it will set back your checked item after scroll 
     CheckBox chckKill = new CheckBox(context); 
      if(getItem(position).isToKill()) 
      { 
        chckKill.setChecked(true); 
      } 
     ////////////////////////////////////////////////////////////////////   

      chckKill.setOnClickListener(new View.OnClickListener() { 
       public void onClick(View v) { 
       //is chkIos checked? 
      if (((CheckBox) v).isChecked()) { 
       getItem(position).setToKill(true); 
       } 
       } 
      }); 
      chckKill.setTag(getItem(position).getPid()); 
     /////////NOT LAYOUTED USE LAYOUT 
      rl.addView(chckKill); 
      rl.addView(textName); 
      rl.addView(textPid); 
      return rl; 
     }  

hy vọng nó sẽ giúp ABIT.

+0

cảm ơn bạn nhưng câu trả lời của Zapi đã giúp tôi khắc phục sự cố của tôi. – Dinesh

+0

aye. không sao chỉ được cung cấp một ví dụ. –

+0

@SergeyBenner gặp vấn đề tương tự http://stackoverflow.com/questions/35552911/onscroll-selected-checkbox-getting-unchecked-using-listiview –

2

Trong mycase, tôi giải quyết vấn đề này như sau:

@Override 
public View getView(final int position, View convertView, ViewGroup parent) { 

    ViewHolder holder = null; 

    TextView title = null; 
    ImageView thumbnail = null; 
    CheckBox checkBox = null; 

    Content rowData = GridViewActivity.contents.get(position); 

    if (null == convertView) { 
     convertView = mInflater.inflate(R.layout.grid_item, null); 
     holder = new ViewHolder(convertView); 
     convertView.setTag(holder); 
    } 
    holder = (ViewHolder) convertView.getTag(); 

    title = holder.getContentTitle(); 
    title.setText(rowData.getTitle()); 

    thumbnail = holder.getThumbnail(); 
    thumbnail.setImageResource(rowData.getIcon()); 

    checkBox = holder.getCheckBox(); 
    checkBox.setTag(position); 

    checkBox.setChecked(rowData.isCheckBox()); 

    checkBox.setOnCheckedChangeListener(new OnCheckedChangeListener() { 

     @Override 
     public void onCheckedChanged(CompoundButton buttonView, 
       boolean isChecked) { 
      int getPosition = (Integer) buttonView.getTag(); 
      GridViewActivity.notifyCheckChanges(getPosition, 
        buttonView.isChecked()); 
     } 
    }); 

    return convertView; 
} 
+0

Trong ví dụ này, GridViewActivity là gì ?? –

Các vấn đề liên quan