5

我正在努力将 Twitter 集成到一个应用程序中,虽然一切正常,setOnItemClickListener()但当我遇到ListView item中有一个链接时,我被难住了。当其中item没有链接(URL)时,它工作得很好。

单击 URL 本身会在浏览器中打开网页。

请参阅在帖子末尾添加的屏幕截图作为参考。

这是一种习惯ListView,采用BaseAdapter. 我不确定要放入哪段代码,但在被指向这里的人们可能需要的代码块时,我会立即添加它。

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

那么我该怎么做才能setOnItemClickListener()忽略项目中的链接?

更新:

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

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

这是目前流程的样子:

在此处输入图像描述

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

然而,在底部两个中,当我单击@ibnlive链接时,它会显示用户的个人资料 ( @ibnlive )。这部分来自 TweetLanes 源。问题是,点击监听器也被触发了。这是我正在尝试的解决方案之一。在这种情况下,我已将 注释掉setOnItemClickListener()OnClickListener()TextView. 这是迄今为止取得部分成功的一种方法。

4

5 回答 5

2

In order to support listItem's click events and supporting links inside records, you should set android:descendantFocusability="blocksDescendants" at the top-level layout of your list-record's xml.

于 2013-04-17T10:00:11.670 回答
1

那是因为链接是可点击的,而listItem也是可点击的,所以在这里,链接成为焦点,因此listItem不能被点击。

你只需要设置:

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

android:focusableInTouchMode="false"列表项。

于 2013-04-17T09:50:18.620 回答
1

您可能想看看babay 在 ListView 上的回答:TextView with LinkMovementMethod 使列表项不可点击?

他提出了一个 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);
    }
}

解决方案未测试

基于此,我建议您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());
        }
    }
}

谢谢

于 2013-04-24T12:33:17.970 回答
1

您是否尝试过下一个代码(基于此链接):

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;
        }
   });
于 2013-04-22T05:40:48.057 回答
0

请看看这个。

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

这是我用来在列表视图中显示 url 的行。如果您在 getview 中执行上述操作,链接将自动变为蓝色并带有下划线。如果您单击该链接,它将自动打开浏览器。

希望这会帮助你。

编辑

嗨,看看这个编辑过的答案。我已经验证过了。它将打开正确的 url。希望这会帮助你。

 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;


            }

        }

}
于 2013-04-22T05:22:09.953 回答