Подтвердить что ты не робот

Не удалось проверить/снять флажок CheckedTextView внутри getView

Я загружаю телефонные контакты в пользовательский ListView. Каждая строка представляет собой проверочный LinearLayout, содержащий CheckedTextView и другой TextView.

Я подаю представление списка с помощью настраиваемого ArrayAdapter. Моя проблема в том, что я не могу контролировать CheckedTextViews внутри getView(). Например, когда я пытаюсь выполнить следующие

public View getView(int position, View convertView, ViewGroup parent) {
        View row = convertView;
        if(row == null){            
            row = inflater.inflate(layout, parent, false);
        }

        CheckedTextView checkedTextView =  (CheckedTextView) row.findViewById(R.id.checkedTextView);
        checkedTextView.setText("A");
        checkedTextView.setChecked(true);
        return row;
    }

Это должно проверять каждое текстовое представление всякий раз, когда я просматриваю список, но этого не происходит. Может ли кто-нибудь сказать мне, как это сделать?

EDIT: важно проверить его внутри getView(), я не могу просто проверить все после setListAdapter()

EDIT2: это xml файл, отображающий представление каждой строки

<?xml version="1.0" encoding="utf-8"?>
<com.example.multiplecontacts.CheckableLinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <CheckedTextView
        android:id="@+id/checkedTextView"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:checkMark="?android:attr/listChoiceIndicatorMultiple"
        android:paddingBottom="0dp"
        android:text="CheckedTextView"
        android:textAppearance="?android:attr/textAppearanceLarge" />

    <TextView
        android:id="@+id/subTextView"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="Small Text"
        android:paddingTop="0dp"
        android:textAppearance="?android:attr/textAppearanceSmall" />

</com.example.multiplecontacts.CheckableLinearLayout>

CheckableLinearLayout - это настраиваемый макет, который расширяет LinearLayout и реализует Checkable, как я уже говорил. И я взял его из здесь

4b9b3361

Ответ 1

Установил ли свойство checkMark для вашего CheckedTextView в вашем макете xml?

Например: android:checkMark="?android:attr/listChoiceIndicatorMultiple

CheckedTextView - это не только флажок с текстом. Вы также должны отметить, что CheckedTextView не может быть сфокусирован или доступен без использования каких-либо манипуляций (поскольку он был разработан для ListView, и поэтому его состояние должно контролироваться ListView setOnItemClickListener)

setChoiceMode должен быть установлен для ListView. И проверка строки внутри адаптера getView должна выполняться с помощью: listView.setItemChecked(position, value)

Ответ 2

Когда вы просматриваете список, каждый раз, когда он вызывает метод getview(). Итак, если у вас есть флажок или какой-либо блок редактирования в listcell, он будет повторно инициализировать его.

Моя идея - сохранить статус (отмечен или не отмечен) флажком. Поэтому здесь я сначала использовал ArrayList, я заполнил его ложным значением, а затем в своем событии click, которое я использовал для сохранения фактического состояния.

 class MyAdapter extends BaseAdapter  implements OnClickListener   {

    private ArrayList<Boolean> checks=new ArrayList<Boolean>();//Boolean type array to   manage check box

  private static LayoutInflater inflater=null;

    public MyAdapter(Context context, ArrayList<HashMap<String, String>> d)
    {
              inflater =     (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

      //fill with false values
    for (int i = 0; i < d.size(); i++) 
    {
            checks.add(i, false);
    }
    }

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

    public Object getItem(int position)
    {
        return position;
    }

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




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

        View vi=convertView;

        if(convertView==null)

          vi = inflater.inflate(R.layout.<your layout>, null);

          //Checkbox is of button type----android:button="@drawable/btn_check"
          //make a selector xml for checkbox       

          checkBox=(CheckBox)vi.findViewById(R.id.check_box);


          checkBox.setTag(Integer.valueOf(position));
          checkBox.setOnClickListener(this);
          checkBox.setChecked(checks.get(position));


        return vi;
    }

        @Override
        public void onClick(View v) 
        {
          int viewId=v.getId();
          if(viewId== R.id.check_box)
          {
            Integer index = (Integer)v.getTag();
            boolean state = checks.get(index.intValue());
            checks.set(index.intValue(), !state);

          }
        }
     }

Обновление: решение 2nd: вы можете поместить логическую переменную в класс ViewHolder. Эта логическая переменная будет использоваться для определения выбранного элемента или нет.

Надеюсь, это поможет вам.

Ответ 3

@Pier-Luc Gendreau и @fox упомянули решение в комментариях, но не ответили, поэтому отправляли ответ от их имени.

Как уже упоминалось @AlexOrlov, CheckedTextView не может быть сфокусирован или доступен без каких-либо манипуляций. Итак, что вам нужно сделать, это установить проверку элемента с помощью ListView, вы можете либо сделать это из самого адаптера, либо из активности/фрагмента, где у вас есть ListView.

Чтобы сделать это от адаптера,

public View getView(int position, View convertView, ViewGroup parent) 
{ 
if (//logic) {
((ListView) parent).setItemChecked(position, true);
}
}

Из активности/фрагмента

if (//logic) {
listView.setItemChecked(position, true);
}