Каждый седьмой блок отмечен флажками в ListView - PullRequest
1 голос
/ 08 мая 2011

У меня есть ListView, который имеет 649 записей.Каждое представление в списке имеет два LinearLayouts, ImageView, несколько TextViews и CheckBox.В настоящее время у меня есть код, чтобы пройти все флажки и подсчитать их, и еще код, чтобы выяснить, какие из них проверены, чтобы я мог их использовать.Однако всякий раз, когда я проверяю один из CheckBox, каждый седьмой CheckBox выше и ниже волшебным образом также проверяется.Метод подсчета отмеченных флажков возвращает число, которое я на самом деле проверял, но метод для получения индексов всех отмеченных флажков просто возвращает первый проверенный x, независимо от того, проверял ли я их или те, которые удалены от них.Например, если я проверяю число 21, метод возвращает индекс 3. Я включил некоторые соответствующие сегменты кода: Код макета для каждого представления в списке:

<?xml version="1.0" encoding="utf-8"?>

<TextView
    android:id="@+id/id"
    android:layout_width="50dp"
    android:layout_height="50dp"
    android:textSize="20sp"/>

<LinearLayout
    android:layout_width="180dp"
    android:layout_height="50dp"
    android:orientation="vertical">

    <TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:id="@+id/name"/>

    <TextView
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:textColor="#777777"
        android:id="@+id/type"/>

</LinearLayout>
<CheckBox
    android:layout_gravity="right|center_horizontal"
    android:id="@+id/check"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:focusable="false"
    android:focusableInTouchMode="false"/>

Проверьте метод подсчета:

    public int[] whichAreChecked()  //TODO: this should work.
{
    int listItemCount = ChooserList.getChildCount();
    ArrayList<Integer> ints=new ArrayList<Integer>();
    for(int i=0; i<listItemCount; i++)
    {
        CheckBox cbox = (CheckBox) ((View)ChooserList.getChildAt(i)).findViewById(R.id.check);
        if(cbox.isChecked())
            ints.add(i);
    }
    Log.e("durr", ""+ints.size());
    int[] result=new int[ints.size()];
    for(int i=0; i<result.length; i++)
        result[i]=ints.get(i);
    return result;
}

Проверьте метод подсчета:

    public int countChecks()
{
    int checked=0;
    int listItemCount = ChooserList.getChildCount();
    for(int i=0; i<listItemCount; i++)
    {
        CheckBox cbox = (CheckBox) ((View)ChooserList.getChildAt(i)).findViewById(R.id.check);
        if(cbox.isChecked())
            checked++;
    }
    Log.e("countChecks()", ""+checked);
    return checked;
}

Если я могу добавить дополнительную информацию, пожалуйста, спросите!

Ответы [ 2 ]

1 голос
/ 01 февраля 2012

Я также столкнулся с подобным королем проблемы, поэтому после долгих чтений я решил эту проблему следующим образом:

@Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder = null;
        if (convertView == null) {
            convertView = mInflater.inflate(R.layout.listview, null);
            holder = new ViewHolder();
            holder.nameView = (TextView)convertView.findViewById(R.id.textView1);
            holder.numberView = (TextView)convertView.findViewById(R.id.textView2);
            holder.cb = (CheckBox)convertView.findViewById(R.id.checkBox1);
            convertView.setTag(holder);                
        } else {
            holder = (ViewHolder)convertView.getTag();
        }
        holder.nameView.setText(mData.get(position).toString());
        holder.numberView.setText(mNumber.get(position).toString());
        holder.cb.setChecked(false);
        holder.cb.setTag(position);



        if(selected.indexOf(mNumber.get(position).toString()) >= 0)
        {

        holder.cb.setChecked(true);
        }

        return convertView;
    }

}

Вот что я делаю, что в getView () я снимаю все флажкии проверяя снова вручную те, которые мне нужно проверить в соответствии с просмотром текста, который он соответствует.Таким образом, если пользователь прокрутит вниз после установки первого флажка, все флажки в представлении будут сняты, и если он снова прокрутится вверх, то также все флажки будут сняты, но затем тот, который он щелкнул ранее, будет снова проверен.

1 голос
/ 08 мая 2011

Хммммм, я думаю, вы неправильно поняли, что делают методы getChildCount() и getChildAt().Они на самом деле получат только визуализированных представления.Если я не читаю что-то здесь, если у вас есть 650 строк, вы не можете выполнить то, что вы хотите, с помощью представлений, которые отображаются.Вместо этого вы должны реализовать onItemClickListener (или, альтернативно, что-то, что срабатывает при нажатии флажков), и после того, как флажок установлен, сохраните это состояние в вашей модели.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...