在 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 视图上使用onItemClickListener
:RSSFeedsItemLL
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 中获取 onItemClick 实现的位置