2015-06-19 3 views
2

Я пытался создать макет для своего приложения, где я установил android:layout_height="wrap_content".Высота списка

Это мой код ::

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:card_view="http://schemas.android.com/apk/res-auto" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    tools:context="com.example.hp.money.DashBoard"> 

    <LinearLayout 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:orientation="vertical"> 

     <android.support.v7.widget.CardView 
      android:id="@+id/cv_amount_display" 
      android:layout_width="match_parent" 
      android:layout_height="200dp"> 
      ..... 
     </android.support.v7.widget.CardView> 

     <android.support.v7.widget.CardView 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:layout_gravity="center" 
      card_view:cardCornerRadius="10dp"> 

      <LinearLayout 
       android:layout_width="match_parent" 
       android:layout_height="match_parent" 
       android:orientation="vertical"> 

       <TextView 
        android:layout_width="match_parent" 
        android:layout_height="wrap_content" 
        android:text="@string/last_10_transaction" /> 

       <ListView 
        android:id="@+id/last_transactions_lv" 
        android:layout_width="match_parent" 
        android:layout_height="wrap_content" 
        android:orientation="vertical" /> 
      </LinearLayout> 
     </android.support.v7.widget.CardView> 
    </LinearLayout> 
</ScrollView> 

Я использую ListView внутри ScrollView, что это плохая идея, я знаю! Полагаю, это приводит к некоторым проблемам прокрутки. Но мне нужно динамически обновлять данные на моем экране во время выполнения, и я думаю, что только просмотр может справиться с этим. Если для этого есть другие View, пожалуйста, предложите.

Проблема в том, что даже если источник данных ListView имеет 10 элементов, высота ListView всегда будет равна размеру одного элемента listView, но высота списка будет равна wrap_content, поэтому вероятно, он должен соответствующим образом изменить размер. Но это не так! Как это исправить?

Так выглядит, хотя в Listview есть 10 предметов! элемент управления ListView является тот, который имеет заголовок, как последние 10 операций

The ListView is the one which has a heading as LAST 10 TRANSACTIONS

Почему я использовал Scrollview ??

Я поместил scrollview, потому что количество enteries в списке может быть много, поэтому я хочу, чтобы при прокрутке пользователя, чтобы увидеть записи, которые в настоящее время не видны int listview, вся страница прокручивается, и не только список.

ответ

1

Что вы подразумеваете под «динамической вставкой данных в Listview во время выполнения». Если вы динамически изменяете данные списка, то ListView может обрабатывать его внутренне. В этом случае вам не нужно ничего делать. Таким образом, вы можете удалить ScrollView, чтобы он работал нормально.

+0

Hi. То, что я подразумевал под «динамической вставкой данных», состояло в том, что, как уже упоминалось другими, у меня не может быть listView внутри ScrollView, и даже я прочитал об этом до публикации вопроса, что я имел в виду, так как listview управляет динамически обновляемым data, есть ли другой способ, которым я могу это сделать, не используя listview, например динамически обрабатывать данные в LinearLayout – coderzz027

1

Вы не можете добавить ListView внутри ScrollView. Для учитывая ваши потребности, которые можно установить высоту ListView динамически для удовлетворения ваших потребностей ... После настройки списка адаптер просто вызовите этот метод ...

public static void setListViewHeightBasedOnChildren(ListView listView) { 
     ListAdapter listAdapter = listView.getAdapter(); 
     if (listAdapter == null) { 
      // pre-condition 
      return; 
     } 

     int totalHeight = 0; 
     for (int i = 0; i < listAdapter.getCount(); i++) { 
      View listItem = listAdapter.getView(i, null, listView); 
      listItem.measure(0, 0); 
      totalHeight += listItem.getMeasuredHeight(); 
     } 

     ViewGroup.LayoutParams params = listView.getLayoutParams(); 
     params.height = totalHeight + (listView.getDividerHeight() * (listAdapter.getCount() - 1)); 
     listView.setLayoutParams(params); 
    } 
+0

после каждого 'notifyDataSetChanged', мне снова нужно будет вызвать эту функцию правильно? – coderzz027

+0

Да абсолютно ... – NilayDani

+0

любая идея, почему 'wrap_content' не работает? – coderzz027

1

Как и другие отметили, вы не можете поместить ListView внутри ScrollView (в любом случае это не имеет смысла, ListView имеет свой собственный свиток)

Но я должен динамически вставлять данные в Listview во время выполнения, если есть какой-либо другой способ сделать это, пожалуйста, предложите.

Я не понимаю, почему вы думаете, что не можете, и хотите знать, почему вы думаете, что ScrollView это сделает.

Если вы создали свой собственный адаптер, чтобы заполнить эту ListView вы должны иметь что-то вроде этого:

class listViewAdapter extends BaseAdapter 
{ 
    public View getView(int position, View convertView, ViewGroup parent) 
    { 
    } 
    public int getCount() 
    { 
    } 
    public Object getItem(int position) { 
    } 
    public long getItemId(int position){ 
    } 
} 

Затем вы должны создать поле данных и сеттера

private Arraylist<DataType> data; 

public void setData(Arraylist<DataType> data) 
{ 
    data = data; 
} 

Затем вы можете использовать это так:

ListView lv = findViewById... 
ListViewAdapter adapter = new ListViewAdapter(); 
adapter.setData(data); 
lv.setAdapter(new ListViewAdapter()); 

Когда вы добавили или удалили данные, их можно перезагрузить по вызову ing

adapter.notifySetDataChanged(); 
+0

Привет. Я знаю, что могу добавить данные в ListView. Я не мог прояснить этот вопрос. Я имел в виду, что, как вы сказали, я не могу иметь Listview в ScrollView, мой мотив состоит в том, чтобы добавить представление, которое может динамически обрабатывать данные, обновляемые пользователем, и я вижу, что listView обрабатывает это для меня. Кроме того, я помещаю scrollview, потому что количество enteries в списке может быть много, поэтому я хочу, чтобы при прокрутке пользователя, чтобы видеть записи, которые в настоящее время не видны int listview, вся страница получает прокрутку, а не только список , – coderzz027

+0

Если я понимаю, вы хотите установить явный размер высоты в listView на основе содержимого? если вы это сделаете, у вас все еще будут проблемы с прокруткой. Возможно, ваш лучший выбор - просто использовать scrollView и управлять добавлением/удалением данных из него динамически. – Nanoc

Смежные вопросы