2013-02-13 4 views
1

Я внедрил пользовательский просмотр списка с флажком и текстовыми полями. Он отлично работает, когда просмотр списка не прокручивается, но если строки увеличены, то listviews находится в режиме прокрутки, когда я нажимаю на флажок, отмеченная метка не остается. Вот мой код, пожалуйста, предложите мне, если что-то неправильно в этом кодеандроид флажок не проверен для пользовательского списка, когда listview находится в scrollview

public class ArchivedAdapter extends ArrayAdapter<MessageBean> { 
final ArrayList<MessageBean> updatedList = new ArrayList<MessageBean>(); 
private List<MessageBean> list; 
private TextView officenameView, sentOnView, messageView; 
public final static String MY_ACTION = "com.android.threeptalk.broadcast"; 
private boolean isDeleted = false; 
int count = 0; 
HashMap<Integer, CheckBox> checkList = new HashMap<Integer, CheckBox>(); 

public ArchivedAdapter(Context context, int resourseID, 
     List<MessageBean> list) { 
    super(context, resourseID, list); 
    this.list = list; 

} 

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

@Override 
public MessageBean getItem(int arg0) { 
    return list.get(arg0); 
} 

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

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

    View row = convertView; 
    LayoutInflater inflater = (LayoutInflater) this.getContext() 
      .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    row = inflater.inflate(R.layout.archievedmsgrow, parent, false); 
    row.setId(position); 
    Object obj = getItem(position); 
    if (obj instanceof MessageBean) { 
     final MessageBean message = (MessageBean) obj; 
     CheckBox checkBox = (CheckBox) row.findViewById(R.id.checkBox); 
     officenameView = (TextView) row.findViewById(R.id.officename); 
     sentOnView = (TextView) row.findViewById(R.id.time); 
     messageView = (TextView) row.findViewById(R.id.message); 
     officenameView.setText(message.getOfficeName()); 
     checkList.put(position, checkBox); 
     checkBox.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       CheckBox c = (CheckBox) v; 
       if (c.isChecked()) { 
        c.setChecked(true); 
        count++; 
        updatedList.add(message); 


       } else { 
        c.setChecked(false); 
        count--; 
        updatedList.remove(message); 
        updatedList.size()); 
       } 
       checkedCount(count, updatedList); 
      } 
     }); 

     row.setOnClickListener(new OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       rowclicked(message, position); 

      } 
     }); 
     sentOnView.setText(Common.getAppropriateTimeUsingTimeZone(message 
       .getmDate())); 
     if (message.getMessage() != null) { 

      messageView.setText((message.getMessage())); 

     } else { 
      if (message.getMessageType().equals("OPTION")) { 
       if (message.getOptions() != null 
         && message.getOptions().size() > 0) { 
        String data = message.getOptions().get(0); 
        if (data != null && !data.equals("")) { 

         messageView.setText(data); 
        } 
       } 
      } 
     } 

    } 
    return row; 
} 

protected void messageSelected() { 

} 


protected void rowclicked(MessageBean message, int position) { 
    // TODO Auto-generated method stub 

} 

protected void checkedCount(int count2, ArrayList<MessageBean> updatedList) { 

} 
} 

`

+0

Смотрите на сайте: Http: //lalit3686.blogspot.in/2012/06/today-i-am-going-to-show-how-to-deal.html – Harshid

ответ

1

Попробуйте это, предполагая, что вы используете пользовательский адаптер для ListView, вы будете иметь возможность установить метку для каждого Пункт внутри GetView вашего адаптера(),

public View getView(int position, View convertView, ViewGroup parent) { 
    EvenViewHolder holdereven; 
     if (convertView == null) { 
      convertView = mInfaltor.inflate(R.layout.schedule_adapter_view, 
        null); 
      holdereven = new EvenViewHolder(); 
      holdereven.time = (TextView) convertView 
        .findViewById(R.id.time); 
      holdereven.title = (TextView) convertView 
        .findViewById(R.id.title); 
      holdereven.des = (TextView) convertView.findViewById(R.id.des); 
      convertView.setTag(holdereven); 

     } else { 
      holdereven = (EvenViewHolder) convertView.getTag(); 
     } 

static class EvenViewHolder { 
    TextView time, title, des; 

} 
    } 
+0

Спасибо за предложение, но что такое EvenViewHolder – Roster

+0

Evenholder - класс, вы можете объявить свой собственный вид макета. И используйте этот объект в вашем getvoew – MuraliGanesan

3

Похоже, вы проверяете статус проверки в флажке в его onClickListener().

Сначала определите Hashmap или SparseBooleanArray, чтобы сохранить свой выбор.

private HashMap<Integer, Boolean> mSelection = new HashMap<Integer, Boolean>(); 

Затем добавьте следующий код в GetView() метод.

CheckBox checkBox = (CheckBox) row.findViewById(R.id.checkBox); 
    checkBox.setOnCheckedChangeListener(new OnCheckedChangeListener() { 

     @Override 
     public void onCheckedChanged(CompoundButton buttonView, 
       boolean isChecked) { 
      mSelection.put(position, isChecked); 
     } 
    }); 

    if (mSelection.get(position) != null) { 
     if (mSelection.get(position)) 
      checkBox.setChecked(true); 
     else 
      checkBox.setChecked(false); 
    } 
+0

Thanku puru .. моя проблема была решена. Но теперь, как я могу вызвать метод проверенных счетчиков. этот метод я переопределяю в своем классе активности для отображения количества флажков. – Roster

+0

Поскольку метод checkedCount определен внутри вашего adaper, вы можете вызывать его из своей активности, используя экземпляр вашего адаптера. например. mAdapter.checkedCount(). Но если вы хотите вернуть количество проверенных значений, вам нужно изменить тип возврата этого mathod на int и фактически вернуть размер вашей хэш-карты, которую вы используете для хранения выбранных. –

+0

, когда я нажимаю флажок, если это проверяется, тогда я увеличиваю значение int else, я уменьшаюсь, я получаю этот счет в действии и отображаю счет выше списка, так как выбрано 2 элемента. когда я не выбран, выбирается 1 элемент. – Roster