Android ListView, который не прокручивается?
Я пытаюсь сделать макет, что-то похожее на то, как рынок Android... где говорят по комментариям, есть то, что кажется ListView
, но оно не прокручивается (прокрутка всей страницы, но не комментарии). Я не уверен, что его даже ListView, но я хочу что-то похожее на представление списка (т.е. Есть те разделительные панели, а что нет, но НЕ ПРОСМОТРЕТЬ). Есть люди, предлагающие использовать LinearLayout
вместо ListView
, но я также хочу, чтобы элементы были интерактивными и открывали новое действие. Пожалуйста, помогите?
Мое текущее дерево компоновки похоже на
<LinearLayout>
<ScrollView>
<RelativeLayout>
Я хочу разместить содержимое внутри RelativeLayout
.
Ответы
Ответ 1
Как объяснили программисты, которые сделали listView в этом видео из GoogleIo, никогда не кладут ListView внутри прокрутки. Если ваш список не должен прокручиваться, используйте ViewGroup, как линейный макет, и добавьте все элементы в эту ViewGroup в цикле вашего кода. Если вы хотите, чтобы целая строка была кликабельной, вы должны использовать другую ViewGroup в качестве корневого node для каждой строки и добавить OnClickListener к этому представлению.
Пример кода:
LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
for (int current = 0; current < itemCount; current++) {
View view = inflater.inflate(R.layout.layout_id, parent, false);
//initialize the view
view.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(getApplicationContext(), CLASS_TO_START)
startActivity(intent);
}
});
viewGroup.addView(view);
if (current < itemCount - 1) {
inflater.inflate(R.layout.line, viewGroup);
}
}
Этот код будет генерировать один вид для каждого элемента, который у вас есть, и поместить его в группу viewGroup. После каждого элемента, кроме последнего, он также добавит разделитель в группу view.
Ответ 2
У меня была такая же проблема. Я просто расширил метод LinearLayout
по умолчанию setAdapter
:
public class LinearListView extends LinearLayout
{
Adapter adapter;
Observer observer = new Observer(this);
public LinearListView(Context context)
{
super(context);
}
public LinearListView(Context context, AttributeSet attrs)
{
super(context, attrs);
}
public LinearListView(Context context, AttributeSet attrs, int defStyle)
{
super(context, attrs, defStyle);
}
public void setAdapter(Adapter adapter)
{
if (this.adapter != null)
this.adapter.unregisterDataSetObserver(observer);
this.adapter = adapter;
adapter.registerDataSetObserver(observer);
observer.onChanged();
}
private class Observer extends DataSetObserver
{
LinearListView context;
public Observer(LinearListView context)
{
this.context = context;
}
@Override
public void onChanged()
{
List<View> oldViews = new ArrayList<View>(context.getChildCount());
for (int i = 0; i < context.getChildCount(); i++)
oldViews.add(context.getChildAt(i));
Iterator<View> iter = oldViews.iterator();
context.removeAllViews();
for (int i = 0; i < context.adapter.getCount(); i++)
{
View convertView = iter.hasNext() ? iter.next() : null;
context.addView(context.adapter.getView(i, convertView, context));
}
super.onChanged();
}
@Override
public void onInvalidated()
{
context.removeAllViews();
super.onInvalidated();
}
}
}
Надеюсь, это поможет!
Ответ 3
У меня нет достаточных точек репутации для комментариев, но для тех, у кого есть только один элемент, входящий в решение Nappy, убедитесь, что в вашем файле макета указано следующее:
android:orientation="vertical"
Иначе появится, что добавляется только один элемент, но на самом деле они просто добавляются горизонтально... надеюсь, что это кому-то поможет.
Ответ 4
Вы можете сделать один ListView
и поместить все в него, так что вся страница будет прокручиваться. Вы можете реализовать свою собственную реализацию адаптера, но я рекомендую использовать CommonsWare отлично MergeAdapter
Вы можете добавить метки или разделительные столбцы с помощью addView()
и списков с помощью addAdapter()
. Ознакомьтесь с этой страницей для получения дополнительной информации об использовании и демонстрационном проекте.