2016-08-14 10 views
1

タイトルに記載されているようです。OnItemClickListenerをフラグメントで使用しようとしましたが、ListFragmentは拡張されませんが、リスナーは応答しないようです。CustomAdapterを使用したFragmentのOnItemClickListenerが機能しません

それは動作しませんどのように

: 私は、カスタムのListViewItemとリストビューを含むフラグメントを作成し、コンテンツがPHPファイルに接続ダウンローダーと呼ばれるクラスと与えられたJSONの結果を翻訳パーサと呼ばれるクラスでMySQLのテーブルからダウンロードされます文字列に変換する。結果を受け取り、カスタムListViewItemのTextViewsをParserの結果で変更するCustomAdapterがあります。

ListViewは問題なく作成され、コンテンツが表示されます。 フラグメントコード:フラグメントの

public class BiologyFragment extends Fragment implements SwipeRefreshLayout.OnRefreshListener { 


String url = "URL FOR PHP - just cut that out :D"; 
private SwipeRefreshLayout ll; 
private ListView lv; 
private boolean isRefreshing; 
private Handler refreshhandler = new Handler(); 

public BiologyFragment() { 
    // Required empty public constructor 
} 

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

    //set up listener for pull to refresh 
    ll.setOnRefreshListener(this); 

    //Listview for the to be populated 
    lv = (ListView) ll.findViewById(R.id.lv); 

    //download on opening 
    new Downloader(getContext(), url, lv).execute(); 

    //PROBLEM HERE ! 
    lv.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
     @Override 
     public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 

      Toast.makeText(getContext(), "CLICKED " + position, Toast.LENGTH_SHORT).show(); 
     } 
    }); 

    lv.setOnScrollListener(new AbsListView.OnScrollListener() { 
     @Override 
     public void onScrollStateChanged(AbsListView view, int scrollState) { 
     } 

     @Override 
     public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { 
      boolean enable = false; 

      if (lv != null && lv.getChildCount() > 0) { 
       // check if the first item of the list is visible 
       boolean firstItemVisible = lv.getFirstVisiblePosition() == 0; 
       // check if the top of the first item is visible 
       boolean topOfFirstItemVisible = lv.getChildAt(0).getTop() == 0; 
       // enabling or disabling the refresh layout 
       enable = firstItemVisible && topOfFirstItemVisible; 
      } 
      ll.setEnabled(enable); 
     } 

    }); 

    return ll; 
} 

@Override 
public void onRefresh() { 
    new Downloader(getContext(), url, lv).execute(); 
    refreshhandler.post(refreshing); 
} 

Runnable refreshing = new Runnable() { 
    @Override 
    public void run() { 
     if(isRefreshing){ 
      // re run the verification after 1 second 
     }else{ 
      // stop the animation after the data is fully loaded 
      ll.setRefreshing(false); 
     } 
    } 
}; 


} 

XML:

<FrameLayout 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:descendantFocusability="blocksDescendants"> 

    <ListView 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:id="@+id/lv" 
     android:layout_alignParentLeft="true" 
     android:layout_alignParentStart="true" 
     android:layout_alignParentEnd="true" 
     android:layout_alignParentTop="false" 
     /> 



    <android.support.design.widget.FloatingActionButton 
     android:id="@+id/fab" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_gravity="bottom|end" 
     android:layout_margin="@dimen/fab_margin" 
     android:src="@drawable/ic_menu_slideshow" /> 

</FrameLayout> 

あなただけのListViewItemのXMLまたはCustomAdapter、ダウンローダーやパーサクラスが必要な場合私に知らせて、私はここにそれを掲示します、これらが問題を解決するために必要であるかどうか私は確信していません。

ご協力いただきありがとうございます。

答えて

0

あなたははそうする代わりに使用するのではSwipeRefreshLayoutにあなたのルートを変換しないでください。

ll = (SwipeRefreshLayout)inflater.inflate(R.layout.fragment_biology, container, false); 

使用:

View rootView = inflater.inflate(R.layout.fragment_biology, container, false); 
lv = (ListView) rootView.findViewById(R.id.lv); 
lv.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
     @Override 
     public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 

      Toast.makeText(getContext(), "CLICKED " + position, Toast.LENGTH_SHORT).show(); 
     } 
    }); 

また、あなたはそれがこれを行うにはお勧めです適切SweapRefreshLayoutを使用しないでください。

<!-- rest of layout --> 

<android.support.v4.widget.SwipeRefreshLayout 
    android:id="@+id/swipe_refresh_layout" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content"> 

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

    </ListView> 

</android.support.v4.widget.SwipeRefreshLayout> 

<!-- rest of layout--> 
+0

これは動作していないようです。 "必要なandroid.support.v4.widget.SwipeRefreshLayout が見つかりました。android.view.View" – ProgFroz

+0

@JustinN私のコードを更新しましょう。 – Amir

+0

あなたのコードはエラーなしで動作しますが、私はサークルを試しても何もせずにそこにいることを続けても、もうリフレッシュできません。また、それは私の問題をonItemClickListenerで解決しません:/ – ProgFroz

関連する問題