2017-03-22 16 views
0

多くのフラグメントでアプリケーションを作成していますが、フラグメント内のListViewにアクセスしようとするとエラーが発生します。このコードをMainActivityでテストしたところ、正常に動作しました。ここでAndroid Studio:フラグメント内のListViewへのアクセス(2番目のレイアウトのパスエラー)

は、フラグメントのコードです:

public class Theme extends Fragment { 

CustomAdapter adapter; 
ListView lv; 
FirebaseDatabase database; 
DatabaseReference myRef; 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    View v = inflater.inflate(R.layout.theme_layout, container, false); 
    database = FirebaseDatabase.getInstance(); 
    myRef = database.getReference(); 

    lv = (ListView) v.findViewById(R.id.list); 
    adapter = new CustomAdapter(getActivity(), getData()); 
    lv.setAdapter(adapter); 


    return v; 
} 




private ArrayList getData() { 
    final ArrayList<Teemad> teemadelist = new ArrayList<>(); 

    myRef.child("teemad").addValueEventListener(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 
      Iterable<DataSnapshot> children = dataSnapshot.getChildren(); 

      for(DataSnapshot child: children){ 
       Teemad teemad = child.getValue(Teemad.class); 
       teemadelist.add(teemad); 
      } 
     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) { 

     } 
    }); 

    return teemadelist; 

} 
} 

これは私のレイアウトファイルです:

<FrameLayout 
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=".MainActivity" 
android:id="@+id/container"> 
<ListView 
android:id="@+id/list" 
android:layout_width="fill_parent" 
android:layout_height="wrap_content" 
android:divider="@color/material_blue_grey_800" 
android:dividerHeight="1dp" 
android:footerDividersEnabled="false" 
    /> 
</FrameLayout> 

、これらは、メインのエラー(少なくとも私はそうと仮定)の2つです、それはスロー:

03-23 01:14:50.296 9127-9127/com.example.richard.kodutoo_messenger W/View: requestLayout() improperly called by android.support.v7.widget.AppCompatTextView{2ffc0764 V.ED.... ......ID 16,123-227,180 #7f0d0087 app:id/bb_bottom_bar_title} during layout: running second layout pass 
03-23 01:14:50.455 9127-9127/com.example.richard.kodutoo_messenger W/art: Before Android 4.1, method int android.support.v7.widget.ListViewCompat.lookForSelectablePosition(int, boolean) would have incorrectly overridden the package-private method in android.widget.ListView 

私は非常に長いこの場所で立ち往生しているので、何らかの助けやフィードバックが便利になるでしょう時間。答えに追加情報が必要な場合は、喜んで提供します。

EDIT !!

私はフラグメントの代わりにListFragmentを使用しようとしましたが、onCreateViewの後に私はonActivityCreatedを使用しましたが、それはさらに悪化しました..少なくともアプリケーションを起動する前に、アプリケーションは起動するとすぐにクラッシュします。

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    return inflater.inflate(R.layout.theme_layout, container, false); 
} 

@Override 
public void onActivityCreated(@Nullable Bundle savedInstanceState) { 
    super.onActivityCreated(savedInstanceState); 

    database = FirebaseDatabase.getInstance(); 
    myRef = database.getReference(); 

    lv = (ListView) getListView().findViewById(R.id.list); 
    adapter = new CustomAdapter(getActivity(), getData()); 
    lv.setAdapter(adapter); 

} 
+0

あなたがandroid.support.v7.widget.ListViewを使用してください。 import android.widget.ListViewを使用すると便利です。 – Elsunhoty

+0

あなたはあなたが現在持っている問題以上に、そのメソッドにコールバックを持ち、空の 'ArrayList'を返すので、' getData() 'に問題があることを知っておくべきでしょう。 1。 – BlackHatSamurai

+0

@Elsunhoty Im import android.widget.ListViewを使用しているので問題にはならない – Syord

答えて

0

問題は、firebaseイベントと組み合わせてアダプタを使用する方法です。右の順序はこのようなものになるだろう

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    View v = inflater.inflate(R.layout.theme_layout, container, false); 
    database = FirebaseDatabase.getInstance(); 
    myRef = database.getReference(); 

    lv = (ListView) v.findViewById(R.id.list); 
    adapter = new CustomAdapter(getActivity()); // Note : Here no passing of data 
    lv.setAdapter(adapter); 

    startListener(); 

    return v; 
} 

public void startListener() { 
    myRef.child("teemad").addValueEventListener(new ValueEventListener() { 
    @Override 
    public void onDataChange(DataSnapshot dataSnapshot) { 
     ArrayList<Teemad> teemadelist = new ArrayList<>(); 
     Iterable<DataSnapshot> children = dataSnapshot.getChildren(); 

     for(DataSnapshot child: children){ 
      Teemad teemad = child.getValue(Teemad.class); 
      teemadelist.add(teemad); 
     } 

     adapter.items = teemadelist; // Here items is a public field in adapter holding list of items 
     adapter.notifyDataSetChanged(); 
    } 

    @Override 
    public void onCancelled(DatabaseError databaseError) { 

    } 
}); 
} 
+0

私はこの解決策を試しましたが、アダプタクラスの中にgetCountメソッドとgetItemメソッドがありますが、配列は空です。その場合、どうしたらいいですか? – Syord

+0

この配列をデフォルトで空の配列に初期化します。私はArrayListを使用する傾向があります - > public List items = new ArrayList();アダプタのプロパティとして – ramden

関連する問題