当项目中包含链接时,ListView setOnItemClickListener不会触发

时间:2013-04-17 09:45:36

标签: android twitter android-listview

我正在努力将Twitter集成到一个应用程序中,而且当setOnItemClickListener() ListView中有一个链接时,item无法触发我的所有工作。当item中没有链接(URL)时,它可以正常工作。

点击URL本身可在浏览器中打开网页。

请参阅帖子末尾添加的参考截图。

这是一个使用ListView的自定义BaseAdapter。我不确定要放入哪一段代码,但是当指向这里的人可能需要的代码块时,我会立即添加它。

需要忽略项目中的链接(URL)背后的想法是提供一种功能,当用户点击其中时,显示推文详细信息。类似于Twitter Android应用程序的东西。

那么如何让setOnItemClickListener()忽略项目中的链接?

更新:

好。所以我不确定它是否与这个问题相关,但是,从SO的一些解决方案的组合导致我进入TweetLanes开源项目,我已经成功地完成了一些工作。但不幸的是,它并没有解决我的主要问题。

如何让setOnItemClickListener()忽略项目中的链接,以便我可以单击它并在另一个活动中显示详细信息,但是,当我点击链接时,不会触发setOnItemClickListener()?我每次尝试都会不断获得部分解决方案。但有时,当我点击link时,setOnItemClickListener()也会触发。

这就是目前的流程:

enter image description here

在前两个屏幕截图中,它可以正常工作。毕竟不是点击链接。

但在最后两位,当我点击 @ibnlive 链接时,它会显示用户的个人资料( @ibnlive )。这部分源自TweetLanes来源。问题是,还会触发点击侦听器。这是我正在尝试的解决方案之一。在这种情况下,我已注释掉了setOnItemClickListener()并在OnClickListener()上使用了TextView。到目前为止,这是一种部分成功的方法。

5 个答案:

答案 0 :(得分:2)

为了支持listItem的点击事件和支持记录内的链接,你应该在列表记录的xml的顶层布局中设置android:descendantFocusability="blocksDescendants"

答案 1 :(得分:1)

这是因为链接是可点击的,listItem也是可点击的,所以这里链接获取焦点,因此无法单击listItem。

你只需要设置:

设置所有项目android:focusable="false"

listItem的

android:focusableInTouchMode="false"

答案 2 :(得分:1)

您是否尝试过下一段代码(基于this link):

textView.setMovementMethod(null);


编辑:这是一个有效的解决方案:

textView.setOnTouchListener(new OnTouchListener() 
    {
    @Override
    public boolean onTouch(final View v, final MotionEvent event) 
        {
        if (event.getAction() == MotionEvent.ACTION_UP)
          {
          // <=handle clicking here
          }
        return true;
        }
   });

答案 3 :(得分:1)

您可能想看看babay's answer on ListView: TextView with LinkMovementMethod makes list item unclickable?

他提出了一个TextView,它基本上通过引入不同的LinkMovementMethod

来解决这个问题
public static class LocalLinkMovementMethod extends LinkMovementMethod{
    static LocalLinkMovementMethod sInstance;


    public static LocalLinkMovementMethod getInstance() {
        if (sInstance == null)
            sInstance = new LocalLinkMovementMethod();

        return sInstance;
    }

    @Override
    public boolean onTouchEvent(TextView widget, Spannable buffer, MotionEvent event) {
        int action = event.getAction();

        if (action == MotionEvent.ACTION_UP ||
                action == MotionEvent.ACTION_DOWN) {
            int x = (int) event.getX();
            int y = (int) event.getY();

            x -= widget.getTotalPaddingLeft();
            y -= widget.getTotalPaddingTop();

            x += widget.getScrollX();
            y += widget.getScrollY();

            Layout layout = widget.getLayout();
            int line = layout.getLineForVertical(y);
            int off = layout.getOffsetForHorizontal(line, x);

            ClickableSpan[] link = buffer.getSpans(off, off, ClickableSpan.class);

            if (link.length != 0) {
                if (action == MotionEvent.ACTION_UP) {
                    link[0].onClick(widget);
                } else if (action == MotionEvent.ACTION_DOWN) {
                    Selection.setSelection(buffer,
                            buffer.getSpanStart(link[0]),
                            buffer.getSpanEnd(link[0]));
                }

                if (widget instanceof TextViewFixTouchConsume){
                    ((TextViewFixTouchConsume) widget).linkHit = true;
                }
                return true;
            } else {
                Selection.removeSelection(buffer);
                Touch.onTouchEvent(widget, buffer, event);
                return false;
            }
        }
        return Touch.onTouchEvent(widget, buffer, event);
    }
}

解决方案 NOT TESTED

基于它,我建议你修复文件TwitterLinkify.java(设置链接移动的功能),如下所示:

private static final void addLinkMovementMethod(TextView t) {
    MovementMethod m = t.getMovementMethod();

    if ((m == null) || !(m instanceof LocalLinkMovementMethod)) {
        if (t.getLinksClickable()) {
            t.setMovementMethod(LocalLinkMovementMethod.getInstance());
        }
    }
}

由于

答案 4 :(得分:0)

请看一下。

text_url.setText(Html.fromHtml(url.toString().trim()));
        Linkify.addLinks(text_url, Linkify.ALL);

这是我用来在列表视图中显示网址的行。如果你在你的getview中执行上面的行,链接将变为蓝色,并自动显示下划线。如果你点击它,它将自动打开浏览器。

希望这会对你有所帮助。

修改

您好看看这个编辑过的答案。我已经验证了。它会打开正确的网址。希望这会帮助你。

 String url="www.google.com";
        String name="@sampleuser";  
     textview1.setText(Html.fromHtml("<a href='http://"+url+"'>http://"+name+"</a>")); 
     textview1.setMovementMethod(LinkMovementMethod.getInstance());

编辑2 嗨,看看这个样本。希望这会帮助你 。

package com.example.listwithclick;
import java.util.ArrayList;
import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.text.Html;
import android.text.method.LinkMovementMethod;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.TextView;

public class MainActivity extends Activity {


    ListView listView1;
    Activity activity;
    ArrayList<String>urls=new ArrayList<String>();
    ArrayList<String>name=new ArrayList<String>();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        activity=this;

        urls.add("www.google.com");
        name.add("@googleuser");

        urls.add("www.yahoo.com");
        name.add("@yahoouser");
        urls.add("www.facebook.com");
        name.add("@facebookuser");
        urls.add("www.linkedin.com");
        name.add("@linkedinuser");

        listView1=(ListView)findViewById(R.id.listView1);
        listView1.setAdapter(new MyAddapter(MainActivity.this));

    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }
     class MyAddapter extends BaseAdapter {
            Context rContext;
            private LayoutInflater rInflater;

            public MyAddapter(Context c) {

                rInflater = LayoutInflater.from(c);

                rContext = c;

            }      

            public MyAddapter(Activity imagebinding) {
                // TODO Auto-generated constructor stub

                activity = imagebinding;        

                rContext = imagebinding;
                rInflater = LayoutInflater.from(imagebinding);
                rContext = imagebinding;
                rInflater = (LayoutInflater) activity
                        .getSystemService(Context.LAYOUT_INFLATER_SERVICE);



            }

            @Override
            public int getCount() {
                // TODO Auto-generated method stub  


                return urls.size();
            }

            @Override
            public Object getItem(int arg0) {
                // TODO Auto-generated method stub
                return null;
            }

            @Override
            public long getItemId(int position) {
                // TODO Auto-generated method stub
                return 0;
            }

            @Override
            public View getView(final int position, View convertView,
                    ViewGroup parent) {
                // TODO Auto-generated method stub
                convertView = rInflater.inflate(R.layout.child, null);
                final MyDat mydat = new MyDat();                

                mydat.textview = (TextView) convertView.findViewById(R.id.textview_name);
                mydat.textview.setText(Html.fromHtml("<a href='http://"+urls.get(position).toString()+"'>"+name.get(position).toString()+"</a>")); 
                mydat.textview.setMovementMethod(LinkMovementMethod.getInstance());

                return convertView;
            }

            class MyDat {


                TextView  textview;


            }

        }

}