如果列表项有链接,setOnItemClickListener 不起作用

Posted

技术标签:

【中文标题】如果列表项有链接,setOnItemClickListener 不起作用【英文标题】:setOnItemClickListener not working if the list item has a link 【发布时间】:2015-10-04 11:15:21 【问题描述】:

我有一个列表视图,此列表视图包含带有链接的列表项(自定义布局),如果我单击链接,则文本视图不可点击,我希望 textview 和链接都可点击我已添加所有内容,例如

android:descendantFocusability="blocksDescendants"
 android:focusable="false"
   android:focusableInTouchMode="false"

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_
    android:layout_
    android:descendantFocusability="blocksDescendants" >

    <TextView
        android:id="@+id/item"
        android:layout_
        android:layout_
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:focusable="false"
        android:focusableInTouchMode="false"
        android:textSize="28sp" />

这是我的 xml 文件 没有任何工作 提前致谢

【问题讨论】:

更新了我的问题并添加了xml 如果你使用 recyclerview 会有所帮助,它不会窃取你的注意力:o 【参考方案1】:

我已经为你写了一些例子。


MainActivity2Activity.java

public class MainActivity2Activity extends AppCompatActivity 

    Spanned[] data = new Spanned[]
            html.fromHtml("Some text and link: www.google.com Google"),
            Html.fromHtml("Some text and link: www.google.com Google"),
            Html.fromHtml("Some text and link: www.google.com Google");

    ListView mListView;
    ArrayAdapter mAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main_activity2);

        mListView = (ListView) findViewById(R.id.list_view);
        mAdapter = new MyAdapter(this, data);
        mListView.setAdapter(mAdapter);
        mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() 
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int position, long id) 
                Toast.makeText(view.getContext(),"Item at position: " + position, Toast.LENGTH_SHORT).show();
            
        );
    

    public static class MyAdapter extends ArrayAdapter<Spanned>

        private Context mContext;
        private Spanned[] mData;

        public MyAdapter(Context context, Spanned[] data) 
            super(context, -1, data);
            mContext = context;
            mData = data;
        

        @Override
        public View getView(int position, View convertView, ViewGroup parent) 
            LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(LAYOUT_INFLATER_SERVICE);
            View view = inflater.inflate(R.layout.link_listview_item, parent, false);

            ((TextView)view.findViewById(R.id.item)).setText(mData[position]);
            ((TextView)view.findViewById(R.id.item)).setTag(position);
            ((TextView)view.findViewById(R.id.item)).setOnClickListener(new View.OnClickListener() 
                @Override
                public void onClick(View view) 
                    Toast.makeText(view.getContext(), "TextView click at position: " + (Integer) view.getTag(), Toast.LENGTH_SHORT).show();
                
            );

            return view;
        
    

activity_main_activity2.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
                xmlns:tools="http://schemas.android.com/tools"
                android:layout_
                android:layout_
                tools:context="com.dinamicgridview.app.MainActivity2Activity">

    <ListView
            android:layout_
            android:layout_
            android:id="@+id/list_view" />

</RelativeLayout>

link_listview_item.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
                xmlns:http="http://schemas.android.com/apk/res-auto"
                android:layout_
                android:layout_
                android:focusable="false"
                android:descendantFocusability="blocksDescendants">

    <TextView
            android:id="@+id/item"
            android:layout_
            android:layout_
            android:layout_alignParentTop="true"
            android:linksClickable="true"
            android:clickable="true"
            android:textSize="28sp"
            android:autoLink="web"
            android:focusable="false"
            android:focusableInTouchMode="false"
            android:text="Some text"/>

    <Space
            android:layout_
            android:layout_
            android:layout_below="@+id/item"
            android:focusable="false"
            android:focusableInTouchMode="false"
            android:clickable="false"
            android:id="@+id/space"/>

</RelativeLayout>

演示

点击文字: 点击链接: 点击项目:

【讨论】:

感谢@Alexander 链接是可点击的,但我需要文本与列表视图中的链接一起可点击 @Alexander 在字符串上获取 PositionData 然后转到新活动或转到 url @amitsharma,我的回答有什么问题?如您所见,一切正常。请更详细地描述您的问题 Alexander 对不起,我是为@Ghouse Pasha 写的,只是发生错误,你的回答没有问题.. @Alexander 不需要大量代码和堆栈快照您是否有空工作或喜欢详细描述...【参考方案2】:

试试这个代码,它可能会帮助你这是一个小代码来做它

final ListView lv = (ListView) findViewById(R.id.ListView01);
lv.setOnItemClickListener(new OnItemClickListener() 
public void onItemClick(AdapterView<?> myAdapter, View myView, int pos, long
   mylng) 

    String selectedFromList =(lv.getItemAtPosition(pos).toString());
  URL url;
  Uri uri;
 try 
     url = new URL(selectedFromList );
      uri = Uri.parse( url.toURI().toString() );
       catch (MalformedURLException e1) 
   e1.printStackTrace();
    catch (URISyntaxException e) 
     e.printStackTrace();
  
                 
);

【讨论】:

以上是关于如果列表项有链接,setOnItemClickListener 不起作用的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Cloud Formation 模板中使列表项有条件?

item的Ontouch和listview的setOnItemClick冲突求解。

WPF 中一个列表里每一项有一个checkbox,checkbox根据后台的值设定选中或不选中?

可变列表项的长度

从列表(表)末尾获取第 n 个元素

条件 jQuery 切换函数