【问题标题】:OnItemClickListener in Fragment with CustomAdapter doesn't work带有 CustomAdapter 的片段中的 OnItemClickListener 不起作用
【发布时间】:2016-12-20 17:35:22
【问题描述】:

如标题中所述,我尝试在片段中使用 OnItemClickListener(它不扩展 ListFragment,它只是一个片段)但侦听器似乎没有响应。

它是如何工作的: 我创建了一个片段,其中包含一个带有自定义 ListViewItem 的 ListView,内容是从一个 mysql 表下载的,其中一个名为 Downloader 的类连接到 PHP 文件,一个名为 Parser 的类将给定的 JSON 结果转换为字符串。有一个 CustomAdapter 获取结果并使用 Parser 的结果更改自定义 ListViewItem 的 TextViews。

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、Downloader 或 Parser 类,请告诉我,我将在此处发布,我只是不确定这些是否是解决问题所必需的。

感谢您的关注!

【问题讨论】:

    标签: java android xml listview android-fragments


    【解决方案1】:

    不应该将您的根目录转换为 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-->
    

    【讨论】:

    • 这似乎不起作用“需要 android.support.v4.widget.SwipeRefreshLayout 找到 android.view.View”
    • 您的代码确实可以正常工作,尽管我无法再刷新,但当我尝试时,圆圈会继续存在而不做任何事情。它也不能解决我的 onItemClickListener 问题:/
    • @JustinN 您应该为 swipeRefreshLayout 设置 setOnRefreshListener 并在侦听器中处理此问题。它也适用于 onClickListener 它只是一个简单的代码,让您了解您的代码应该如何它可能需要一些修改。
    • 我发现实际上我只需要在设置适配器时设置一个 OnItemClickListener 所以我将一个 OnItemClickListener 放入 Parser 并且效果很好 ^^
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-30
    • 2021-12-25
    • 1970-01-01
    • 2019-10-06
    相关资源
    最近更新 更多