1
我的Android项目正在加载带有Twitter提要项目的ListView。我遇到的问题是嵌入式超链接功能WHILE仍然允许选择ListView项目如果用户单击嵌入式超链接外的ListView项目。带有autoLink的TextView将不允许捕获TextView的非超链接部分上的点击事件
比方说,对于Twitter的饲料项目中的文本是:
This is a sample tweet with an embedded link (https://t.co/eMnVvBEo7W). And this is some random text.
这部分工作。链接是彩色的(显示它是一个超链接),当我点击TextView的链接部分时,它正确地启动浏览器和页面。
问题是TextView上的所有其他点击都没有通过。我需要能够在ListView项目上获得点击事件,以便我可以使用推文执行其他功能(如共享等)。但是,正如我所说,没有点击事件正在通过。我想要的是,当用户选择推文的非超链接部分时,该项目将被选中。
下面是一些代码片段
列表查看项目布局:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:minWidth="1256dp"
android:layout_width="1256dp"
android:layout_height="match_parent"
android:descendantFocusability="blocksDescendants">
<ImageView
android:id="@+id/imageViewTwitterFeed"
android:layout_width="64dp"
android:layout_height="64dp"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:paddingTop="5dp"
android:paddingBottom="5dp"
android:paddingLeft="5dp"
android:paddingRight="5dp" />
<TextView
android:id="@+id/textViewTwitterFeed"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_marginLeft="18dp"
android:layout_marginStart="18dp"
android:layout_toRightOf="@+id/imageViewTwitterFeed"
android:layout_toEndOf="@+id/imageViewTwitterFeed"
android:textAppearance="?android:attr/textAppearanceMedium"
android:ellipsize="end"
android:singleLine="false"
android:autoLink="web"
android:focusable="false"
android:paddingTop="5dp"
android:paddingBottom="5dp"/>
</RelativeLayout>
片段布局
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">
<ListView
android:id="@+id/tweetList"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:choiceMode="singleChoice"
android:listSelector="#d3d3d3"/>
</LinearLayout>
片段代码:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
// Inflate view
pageView = inflater.inflate(R.layout.page_twitter_feed_view_fragment, container, false);
tweetsListView = (ListView) pageView.findViewById(R.id.tweetList);
tweetsListView.setBackgroundColor(Color.WHITE);
if(pageDefinition == null)
{
// Get page definition associated with this fragment
if (getArguments().containsKey(MINPageDefinition.ARG_ITEM_ID))
{
pageDefinition = MINAppConfiguration.getSharedInstance().currentMarket.pageArray.get(Integer.valueOf(getArguments().getString(MINPageDefinition.ARG_ITEM_ID)));
}
// Provide a weak reference to this fragment for optimization purposes
pageDefinition.weakFragment = new WeakReference<Fragment>(this);
}
// Set up specific controls/views
initializePage();
// Set up adapter & click listener
adapter = new TwitterFeedAdapter(this, tweetStatusList);
tweetsListView.setAdapter(adapter);
tweetsListView.setOnItemClickListener(new AdapterView.OnItemClickListener()
{
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id)
{
twitter4j.Status tweetStatus = (twitter4j.Status)tweetStatusList.get(position);
setTwitterShareIntent(tweetStatus);
}
});
// Report to Flurry
WeakHashMap<String, String> map = new WeakHashMap<String, String>();
map.put(MINFlurryDefines.kFlurryKey_PageName, pageDefinition.pageName);
FlurryAgent.logEvent(MINFlurryDefines.kFlurryEvent_PageView + " - " + pageDefinition.pageName, map, true);
return pageView;
}
编辑:
// Set up adapter & click listener
adapter = new TwitterFeedAdapter(this, tweetStatusList);
tweetsListView.setAdapter(adapter);
tweetsListView.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
tweetsListView.setOnItemClickListener(new AdapterView.OnItemClickListener()
{
@Override
public void onItemClick(AdapterView<?> parent, View view, final int position, long id)
{
twitter4j.Status tweetStatus = (twitter4j.Status)tweetStatusList.get(position);
setTwitterShareIntent(tweetStatus);
// Show the item as selected
/*
parent.requestFocusFromTouch();
parent.setSelection(position);
parent.requestFocus();
*/
}
});
final TextView tweetTextView = (TextView)V.findViewById(R.id.textViewTwitterFeed);
tweetTextView.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{
//tweetsListView.setSelection(position);
//tweetsListView.smoothScrollToPosition(position);
tweetsListView.performItemClick(v, position, 0);
}
});
tweetTextView.setMovementMethod(new CustomLinkMovementMethod());
tweetTextView.setFocusable(false);
tweetTextView.setClickable(false);
tweetTextView.setLongClickable(false);
这个工程...差不多。问题是该项目不显示为选定。我试着添加listview.setSelection(position),这显示了选中的项目,但它也滚动列表视图,将选定的项目放置在listview视图的顶部。我不希望列表视图滚动,而只是直观地更改选择状态。我也试过setItemChecked(position,true),这似乎也不起作用。有任何想法吗? – JustLearningAgain
这没有什么区别。我已经用新来源更新了我的问题。我评论了实际上使项目看起来像被选中的代码。你的方法可行。我收到了该事件,并且可以做出适当的响应,但是,ListView项目不会显示为选定/专注。 – JustLearningAgain
你必须立即删除OnClickListener。 – dtx12