在 LinearLayout 中获取 onItemClick 实现的位置

Posted

技术标签:

【中文标题】在 LinearLayout 中获取 onItemClick 实现的位置【英文标题】:getting the position onItemClick implementation in LinearLayout 【发布时间】:2019-03-12 22:46:22 【问题描述】:

我正在尝试显示一个 ListView 和我的 Java 类扩展ListFragment。在 ListItem 上设置 setOnItemClickListener 时,单击侦听器似乎不起作用。这是我的代码:

ListView_rssfeeds_tab.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_
    android:layout_
    android:orientation="vertical"
    android:id="@+id/relativeLayout"
    tools:context=".interestingReads.RSSFeedsTab">
    <ListView
        android:id="@+id/rssFeedsFragment"
        android:layout_
        android:layout_
        android:background="@color/diffBackgroundWhite"
        />

</RelativeLayout>

rss_item_list_row.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/rssFeeds_LL_list_view"
    android:layout_
    android:layout_
    android:layout_marginTop="12dp"
    android:layout_marginBottom="12dp"
    android:orientation="vertical"
    android:clickable="true"
    >
<LinearLayout

    android:layout_
    android:layout_
    android:orientation="horizontal"
    android:padding="6dp"
    >

    <ImageView
        android:id="@+id/rssFeeds_Image_list_view"
        android:layout_
        android:layout_
        android:contentDescription="@string/app_name"
        android:padding="0dp" />

    <LinearLayout
        android:layout_
        android:layout_
        android:orientation="vertical"
        android:padding="7dp">

        <TextView
            android:id="@+id/rssFeeds_Title_list_view"
            android:layout_
            android:layout_
            android:textSize="13sp"
            android:textStyle="bold" />

        <TextView
            android:id="@+id/rssFeeds_Description_list_view"
            android:layout_
            android:layout_
            android:paddingTop="5dp"
            android:textSize="12sp" />
    </LinearLayout>
</LinearLayout>
</LinearLayout>

RSSFeedsTab.java(请注意:RSSFeedsTab 是片段而不是活动)

public class RSSFeedsTab extends ListFragment implements  OnItemClickListener 
.
.
.
@Override
    public void onCreate(Bundle savedInstanceState) 

        super.onCreate(savedInstanceState);
.
.
.


@Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
.
.
.
        SimpleAdapter simpleAdapter = new SimpleAdapter(getActivity().getBaseContext(), aList, R.layout.rss_item_list_row, from, to);
        setListAdapter(simpleAdapter);

        View RootView =  getActivity().getLayoutInflater().inflate(R.layout.fragment_rssfeeds_tab, container, false);
        ListView RSSFeedsItemLL = (ListView) RootView.findViewById(R.id.rssFeedsFragment);




        RSSFeedsItemLL.setOnItemClickListener(new OnItemClickListener() 

            public void onItemClick(AdapterView<?> adapter, View v, int position, long id) 
                System.out.println("********Reached onClick*********");
                Toast.makeText(getActivity(), "Item: " + position, Toast.LENGTH_SHORT).show();
            
        );
        return super.onCreateView(inflater, container, savedInstanceState);


    

通过这么多的实现,我可以得到 ListView rssFeeds_LL_list_view。我不确定,如何在那些 ListView 上使用点击事件,以便在 ListView 中获得position

【问题讨论】:

适配器邮政编码 @ParikshitChalke:更新了代码。 如果您已经尝试过“所有选项”——这是否意味着无能为力?也许你应该说出你实际尝试过的东西。 【参考方案1】:

您必须使用监听器 OnItemClickListener 来获取被点击的项目: OnItemClickListener on Android developer

****更新****

在您的代码中,您使用的 ListFragment 已经包含一个 Listview。

SimpleAdapter simpleAdapter = new SimpleAdapter(getActivity().getBaseContext(), aList, R.layout.rss_item_list_row, from, to);
setListAdapter(simpleAdapter);

通过这一行,您创建了一个适配器并将此适配器提供给 Fragment 的 ListView。然后从布局中恢复 RSSFeedsItemLL ListView 并在其上设置 OnItemClickListener:

ListView RSSFeedsItemLL = (ListView) RootView.findViewById(R.id.rssFeedsFragment);
RSSFeedsItemLL.setOnItemClickListener(new AdapterView.OnItemClickListener()...

但是这个 ListView 从未链接到适配器。

你有两个解决方案:

在类定义中将 ListFragment 替换为 Fragment,并在布局文件中使用 ListView

在您的片段中使用 RSSFeedsItemLL ListView

对于第二种情况,您只需覆盖 RSSFeedsTab 类中的 onListItemClick 方法:

@Override
public void onListItemClick(ListView l, View v, int position, long id) 
    System.out.println("********Reached onClick*********");
    Toast.makeText(getActivity(), "Item: " + position, Toast.LENGTH_SHORT).show();
    super.onListItemClick(l, v, position, id);

您还必须删除 rss_item_list_row.xml 中 LinearLayout 定义中的 android:clickable="true" 行:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/rssFeeds_LL_list_view"
android:layout_
android:layout_
android:layout_marginTop="12dp"
android:layout_marginBottom="12dp"
android:orientation="vertical"
>
<LinearLayout

    android:layout_
    android:layout_
    android:orientation="horizontal"
    android:padding="6dp"
    >
    ...

【讨论】:

如果您会在问题中看到片段代码,我实际上正在尝试做同样的事情,但没有成功。请注意,我的 Java 类扩展到 ListFragment 而不是 ListActivity,由于其他功能依赖性,我无法更改它。 @OmSao 我用更详细的解释更新了答案 感谢您的建议和详细解释! @Stephane Rothen:【参考方案2】:

在 ListView 视图上使用onItemClickListenerRSSFeedsItemLL

RSSFeedsItemLL.setOnItemClickListener(new OnItemClickListener() 
   public void onItemClick(AdapterView<?> adapter, View v, int position, long id) 
      System.out.println("********Reached onClick*********");
      Toast.makeText(getActivity(), "Item: " + position, Toast.LENGTH_SHORT).show();
);

参考:OnItemClickListener

【讨论】:

我用ListView RSSFeedsItemLL = (ListView) RootView.findViewById(R.id.rssFeedsFragment);尝试了上述方法,但还是看不到Toasts。 出现大错误。侦听器应设置在 listView 上,而不是项 LinearLayouts 我也尝试过并更新了我的问题代码。还是没有成功。【参考方案3】:

我终于通过overriding方法getView()解决了这个问题

所以,我只改变了这一行: SimpleAdapter simpleAdapter = new SimpleAdapter(getActivity().getBaseContext(), aList, R.layout.rss_item_list_row, from, to);

SimpleAdapter simpleAdapter = new SimpleAdapter(getActivity().getBaseContext(), aList, R.layout.rss_item_list_row, from, to)
    @Override
    public View getView (int position, View convertView, ViewGroup parent)
    
        View v = super.getView(position, convertView, parent);
        final int finalposition = position;
        LinearLayout RSSFeed_singleItem=(LinearLayout) v.findViewById(R.id.rssFeeds_LL_list_view);
        RSSFeed_singleItem.setOnClickListener(new View.OnClickListener() 

            @Override
            public void onClick(View arg0) 
                // TODO Auto-generated method stub
                Toast.makeText(getActivity(),"Link:==>"+localLinkArray[finalposition],Toast.LENGTH_SHORT).show();
            
        );
        return v;
    
;

【讨论】:

以上是关于在 LinearLayout 中获取 onItemClick 实现的位置的主要内容,如果未能解决你的问题,请参考以下文章

在 LinearLayout 中获取所有子项

在 LinearLayout 中获取视图的索引

在 LinearLayout 中获取 onItemClick 实现的位置

如何获取动态添加到LinearLayout的点击子视图的ID?

在自定义视图中获取 LinearLayout 参考

在带有阴影的 LinearLayout 上获取角半径