2015-07-13 3 views
0

У меня есть Android фрагмент, содержащий ListView, и я приложил ArrayAdapter к ListView, но когда я вставить элементы в ArrayAdapter, то ListView показывает только первый элемент.ArrayAdapter дополнения, не отображается в ListView

onCreateView итерацию по моим технологиям, если они разблокированы, он добавляет их к ArrayList shownTechs, но только первый элемент всегда появляется

public class TabTechnologyList extends Fragment { 
    private static final String TAB_NAME = "tab_name"; 

    private ListView techList; 
    private ArrayList<Technology> shownTechs = new ArrayList<>(); 
    ArrayAdapter<Technology> techListAdapter; 

    public TabTechnologyList() { } 

    public static TabTechnologyList newInstance() { 
    TabTechnologyList fragment = new TabTechnologyList(); 
    return fragment; 
    } 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    tabData = Globals.getTabData(); 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 

    View view = inflater.inflate(R.layout.fragment_technology_list, container, false); 
    techList = (ListView) view.findViewById(R.id.tabTechListList); 

    techListAdapter = new ArrayAdapter<>(getActivity().getApplicationContext(), R.layout.layout_techlist_element, shownTechs); 
    techList.setAdapter(techListAdapter); 
    for(Technology tech: tabData.getTechnologies()) { 
     shownTechs.add(tech); 
    } 
    //Only the first one is shown on the screen 
    return view; 
    } 
} 

}

Когда я Google для подобных проблем, люди похоже, воссоздают ArrayAdapter вместо редактирования существующего, но я этого не делаю и не могу понять, какая проблема остается. Какие-либо предложения?

fragment_technology_list.xml:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
      xmlns:tools="http://schemas.android.com/tools" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      tools:context="com.tbohne.kittens.front.TabTechnologyList" 
    > 

    <ListView 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:id="@+id/tabTechListList" /> 

</RelativeLayout> 

layout_techlist_element.xml

<?xml version="1.0" encoding="utf-8"?> 
<TextView xmlns:android="http://schemas.android.com/apk/res/android" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content"> 

</TextView> 

Добавление Я просто понял, что этот фрагмент не заполнения родительскую высоту, и достаточно только высокий чтобы показать одну запись, как если бы высота фрагмента была wrap_content. (Я не могу прокрутить его, так что кажется, что есть только один). Это заставляет меня думать, что вложенность фрагментов может быть связано, так что вот код, который создает фрагмент:

public class TabTechnology extends Fragment { 
    private TabTechnologyList table; 
    private OnFragmentInteractionListener mListener; 

    public TabTechnology() {} 
    public static TabTechnology newInstance(String tabName) {[SNIP]} 
    @Override public static onAttach(Activity activity) {[SNIP]} 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    // Inflate the layout for this fragment 
    View view = inflater.inflate(R.layout.fragment_technology, container, false); 

    table = TabTechnologyList.newInstance(tabName); 
    FragmentTransaction transaction = getChildFragmentManager().beginTransaction(); 
    transaction.add(R.id.view_table, table); 
    transaction.commit(); 

    return view; 
    } 
} 

fragment_technology.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
      xmlns:tools="http://schemas.android.com/tools" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      tools:context="com.tbohne.kittens.front.TabTechnology" 
      android:orientation="vertical"> 

    <ScrollView 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:layout_weight="1" 
     android:id="@+id/view_table" 
     android:layout_above="@+id/view_details" /> 

    <View android:layout_width="match_parent" 
      android:layout_height="1px" 
      android:background="?android:attr/listDivider" /> 

    <ScrollView 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:layout_weight="1" 
     android:id="@+id/view_details" 
     android:layout_alignParentBottom="true" 
     android:layout_alignParentLeft="true" 
     android:layout_alignParentStart="true" 
     android:layout_alignParentRight="true" /> 

</LinearLayout> 
+0

Убедитесь, что вы вызываете notifyDataSetChanged из потока пользовательского интерфейса. Является ли ваш метод OnItemUnlocked запущенным в потоке пользовательского интерфейса? –

+0

Да, все в одной теме. –

+0

Что вы подразумеваете под * Добавил * – Blackbelt

ответ

0

Ввод фрагмента внутри ScrollView был источником проблемы , Просто заменил их на FrameLayout, и внезапно все волшебство срабатывает. Очень странно. Я подозреваю, что проблема связана с вложением прокручиваемых объектов.

+0

Да, действительно! Этот вопрос является прекрасным примером проблемы XY. Фактической причиной этого является то, что одна из ViewGroups перехватывает события касания: ScrollView обрабатывает их, прежде чем ListView получит шанс. Можно было бы объединить эти два, но вам нужно будет расширить свой ScrollView и прекратить перехватывать события в определенных условиях. Маловероятно, что пользовательский интерфейс, подобный этому, будет иметь большой смысл, и я бы посоветовал вам пересмотреть ваш подход. –

+0

@PaulLammertsma: Уже сделано, заменил ScrollView на FrameLayout. –

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