Моя конечная цель - изменить источник информации в этого урока с массива на курсор. Вот ссылка на полный код . Суть в том, что вы щелкаете строку в списке, и тело открывается под указанным заголовком, и вы снова нажимаете на него, и тело исчезает. Я не хочу вспоминать, открыта ли заметка, и при этом я не стремлюсь держать ее открытой посредством повторного использования представления, и не закрываю все остальные, когда вы открываете одну или любую другую причудливую перестановку, о которой я могу думать с макушки головы.
В основном все работает, но когда срабатывает обработчик события onListItemClick, изменяется видимость и notifyDataSetChanged()
s, список делает странные вещи, включая два щелчка, чтобы изменить видимость, и не переоценивает себя, приводя к строке списка только создавая место для себя каждый третий щелчок или около того.
Предыдущая попытка привела к совершенно рабочему списку, за исключением того, что при щелчке фрагмент в каждой строке, которую я хотел скрыть и показать, будет скрывать и показывать, а список в учебнике работает отлично, но, конечно, используются статические размеры. во всем, так что это немного больше, чем шаблон.
Я убежден, что проблема в том, чтобы либо получить информацию о видимости, прикрепленную к строке списка, либо изменить ее после того, как она была установлена.
Вот это onListItemClick
:
@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
super.onListItemClick(l, v, position, id);
((NotesCursorAdapter) getListAdapter()).toggle(position, v);
}
с методом переключения внутри NotesCursorAdapter
:
public void toggle(int position, View view) {
ViewHolder holder = (ViewHolder) view.getTag();
holder.mExpanded[position] = !holder.mExpanded[position];
notifyDataSetChanged();
}
ViewHolder
вне NotesCursorAdapter
:
static class ViewHolder {
public TextView title;
public TextView body;
public boolean mExpanded[];
}
и сам NotesCursorAdapter
:
class NotesCursorAdapter extends CursorAdapter {
private static final int VISIBLE = 0;
private static final int GONE = 8;
public NotesCursorAdapter(Context context, Cursor c) {
super(context, c);
}
@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {
LayoutInflater inflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View rowView = inflater.inflate(R.layout.row, null, true);
ViewHolder holder = new ViewHolder();
holder.title = (TextView) rowView
.findViewById(R.id.title);
holder.body = (TextView) rowView
.findViewById(R.id.body);
holder.mExpanded = new boolean[cursor.getCount()];
rowView.setTag(holder);
return rowView;
}
@Override
public void bindView(View view, Context context, Cursor cursor) {
ViewHolder holder = (ViewHolder) view.getTag();
holder.title.setText(cursor.getString(cursor
.getColumnIndexOrThrow(DbAdapter.KEY_TITLE))
+ holder.mExpanded[cursor.getPosition()]);
holder.body.setText(cursor
.getString(cursor
.getColumnIndexOrThrow(DbAdapter.KEY_BODY)));
holder.body
.setVisibility(holder.mExpanded[cursor.getPosition()] ? VISIBLE : GONE);
}
public void toggle(int position, View view) {
ViewHolder holder = (ViewHolder) view.getTag();
holder.mExpanded[position] = !holder.mExpanded[position];
notifyDataSetChanged();
}
}
Я не знаю, где искать дальше. Мне нужно сделать свой собственный метод getView()
? Получу ли я что-нибудь полезное из getItem()
? Я полностью схожу с ума от попытки использовать listview
как это?
Я провел больше исследований, и код работает, но события при нажатии, похоже, влияют на противоположные представления. Под этим я подразумеваю, что при нажатии на верхний элемент списка он влияет на нижний элемент списка. Когда вы нажимаете второе сверху, оно воздействует на второе снизу. Если есть нечетное количество элементов списка, средний элемент списка работает отлично. Каким-то образом любой способ, которым я использую, чтобы определить идентификатор представления, которое я выполняю, переворачивается. Есть ли в списке вид вещей снизу вверх?