Listview возвращает меньше дочерних элементов, чем фактический поток данных

#android #listview #android-listview

#Android #listview #android-listview

Вопрос:

Существует ли ограничение на количество строк в listview? Я использую фрагмент для отображения listview и загружаю в него 32 записи, но когда я выполняю щелчок, он возвращает, что в нем всего 12 строк; Вот функция on click:

 public void onListItemClick(ListView listView, View view, int position,
        long id) {
    super.onListItemClick(listView, view, position, id);
    SELECTED_POSITION = position;
    if (listView.getChildCount() > 0) {
        listView.getChildAt(position).setBackgroundColor(
                Color.parseColor("#036287"));
    }
}
  

Что происходит, так это то, что при выполнении ListView.getChildAt(position) и position является числом выше 11, оно выдает ошибку. В то же время на планшете я вижу все строки, но они не отображаются в том же listview, что и первые 12 записей.

Есть идеи, в чем может быть проблема?


Другая проблема заключается в том, что когда я меняю цвет таким образом, я вижу несколько выбранных элементов, а не 1. Например, в меньшем масштабе, чтобы объяснить это

Пункт 1

Пункт 2

Пункт 3

Пункт 4

Если максимальная позиция равна 2, и я выбираю пункт 1, загораются пункты 1 и 3. Если я выбираю пункт 2 — загорается пункт 2 и пункт 4. Если я выбираю пункт 3 — загораются пункт 1 и пункт 3 и так далее.

Это действительно расстраивает, потому что я не могу получить нужное мне представление, потому что кажется, что в этой позиции или в переменном представлении содержится несколько представлений, которые возвращаются при щелчке элемента списка.

Комментарии:

1. Вы использовали customlistview? Если это Customlistview, то проблема будет в классе BaseAdapter.

2. Да, я использовал пользовательский адаптер, но как я могу обойти эту проблему? Если я выберу элемент выше позиции 11, моя программа выйдет из строя.

Ответ №1:

Тот факт, что данные (я полагаю, список<>), которые вы используете для подачи представления, имеют размер 32, это не означает, что ListView имеет 32 дочерних представления.

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

Если вы хотите изменить цвет представлений, вы можете либо манипулировать параметром «view», который вы получаете в прослушивателе:

 public void onListItemClick(ListView listView, View view, int position, long id)
{
    super.onListItemClick(listView, view, position, id);
    view.setBackgroundColor([your color here]);
}
  

Или добавьте соответствующие данные в модель данных, которую вы используете для передачи адаптеру, а затем вызовите notifyDataSetChanged в списке

 public void onListItemClick(ListView listView, View view, int position, long id)
{
    super.onListItemClick(listView, view, position, id);
    YourObject yourObject = yourObjectList.get(position);
    yourObject.clicked = true;
}
  

затем в getView

 @Override
public View getView(int position, View convertView, ViewGroup parent)
{
 [...]
 YourObject yourObject = yourObjectList.get(position);
 if(yourObject.clicked)
 {
     convertView.setBackgroundColor([your color here])
 }
 else
 {
     convertView.setBackgroundColor([your other color here])
 }
}
  

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

Ответ №2:

Данные, вероятно, передаются вам ListView через an Adapter . В целях оптимизации a Listview содержит только элементы, отображаемые в данный момент на экране. Было бы пустой тратой ресурсов для отображения всех представлений. Поэтому элемент в указанной позиции может отличаться от элемента, на который вы нажали.

onListItemCLick Содержит ссылку на объект представления, который использовался в качестве аргумента, поэтому я советую установить цвет фона View для данного параметра as.

     public void onListItemClick(ListView listView, View view, int position,
            long id) {
        super.onListItemClick(listView, view, position, id);
        view.setBackgroundColor(Color.parseColor("#036287"));
  }
  

Ответ №3:

В вашем методе getView() просто следуйте этому пути и попробуйте

 @Override
public View getView(int position, View convertView, ViewGroup parent) {
    // TODO Auto-generated method stub

    ViewHolder holder;

    if (convertView == null) {
        LayoutInflater inflater = (LayoutInflater) ctx
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        convertView = inflater.inflate(layoutResourceId, parent, false);
        holder = new ViewHolder();
        holder.text = (TextView) convertView.findViewById(R.id.friendName);

        convertView.setTag(holder);

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

    }

        holder.text.setBackgroundColor(Color.parseColor("#D9D9D9"));
        holder.text.setTextColor(Color.parseColor("#353535"));


    return convertView;
}
  

и

  class ViewHolder {

    TextView text;

    }
  

Комментарии:

1. Если это полезно для вас, просто дайте мне голос и примите его.