ListView:textIsSelectable 和 onItemClick

Posted

技术标签:

【中文标题】ListView:textIsSelectable 和 onItemClick【英文标题】:ListView: textIsSelectable and onItemClick 【发布时间】:2013-09-09 01:06:41 【问题描述】:

上下文

我有一个列表视图,其中行基本上由两个 TextView(一个标题一个内容)组成。

第二个 TextView 可以有很长的文本,所以我设置了maxLines="6"。当用户点击 row 时,我删除了 maxLines 以显示全文。

public void onItemClick(AdapterView<?> adapterView, View view, int position, long id) 

        TextView content = (TextView ) view.findViewById(R.id.content);

        int limit = getResources().getInteger(R.integer.default_max_lines);

        if (content.getMaxLines() > limit) 
            content.setMaxLines(limit);
        
        else 
            content.setMaxLines(Integer.MAX_VALUE);
        
    

问题

上面的代码效果很好。我也希望能够选择我的第二个 TextView (content),所以我设置了 android:textIsSelectable="true"(也尝试以编程方式设置)。

但我无法展开/折叠我的 TextView,因为不再调用 onItemClick

那是因为textIsSelectable 捕获所有点击事件... 来自 Android 文档:

当您调用此方法设置 textIsSelectable 的值时,它会将标记 focusable、focusableInTouchMode、clickable 和 longClickable 设置为相同的值。这些标志对应于属性 android:focusable、a​​ndroid:focusableInTouchMode、android:clickable 和 android:longClickable。要将这些标志中的任何一个恢复到您之前设置的状态,请调用以下一个或多个方法:setFocusable()、setFocusableInTouchMode()、setClickable() 或 setLongClickable()。

我尝试在 setTextIsSelectable(true) 之后将这些标志设置为 false,但我没能成功。

那么,有什么想法可以同时使用textIsSelectableonItemClick

PS:仅支持 Android > 4.0。

【问题讨论】:

【参考方案1】:

我偶然发现了同样的问题,但对这个已有 8 年历史的问题没有给出任何答案。我的解决方案如下:

    在 TextView 中设置 android:textIsSelectable="true" 不要将 onItemClickListener 设置为 ListView 在适配器的getView中设置OnClickListener到TextView:
    override fun getView(position: Int, view: View?, parent: ViewGroup): View 
        ...
        val listener = View.OnClickListener 
            ...
        
        viewHolder.textView.setOnClickListener(listener)
    

这使得点击 TextView 以及选择其文本内容成为可能。

【讨论】:

【参考方案2】:

使用下面的代码它将 100% 工作

public class CustomAdapter extends ArrayAdapter<Sample> 

public ArrayList<Sample> mlist;
public Context context;
public LayoutInflater inflater;

public CustomAdapter(Context context, int resource, ArrayList<Sample> mlist) 
    super(context, resource);
    this.mlist = mlist;
    this.context = context;
    inflater = (LayoutInflater) context
            .getSystemService(Context.LAYOUT_INFLATER_SERVICE);


@Override
public int getPosition(Sample item) 
    return super.getPosition(item);


@Override
public Sample getItem(int position) 
    return mlist.get(position);


@Override
public int getCount() 
    return mlist.size();


@Override
public long getItemId(int position) 
    return super.getItemId(position);


@Override
public View getView(int position, View convertView, ViewGroup parent) 
    convertView = inflater.inflate(R.layout.listitem, null);
    TextView text1 = (TextView) convertView.findViewById(R.id.item1);
    TextView text2 = (TextView) convertView.findViewById(R.id.item2);
    text1.setText(mlist.get(position).getListitem1());
    text2.setText(mlist.get(position).getListitem2());
    text2.setOnClickListener(new OnClickListener() 
        @Override
        public void onClick(View v) 
            // you just put your Logic here And use this custom adapter to
            // load your Data By using this particular custom adapter to
            // your listview

        
    );
    return convertView;


  

您只需在 Mainactivity 中使用此代码

mAdapter = new CustomAdapter(this, R.layout.listitem, mListItems);
  mPullRefreshListView = (PullToRefreshListView) findViewById(R.id.pull_refresh_list);
mPullRefreshListView.setAdapter(mAdapter);

【讨论】:

以上是关于ListView:textIsSelectable 和 onItemClick的主要内容,如果未能解决你的问题,请参考以下文章

textview textIsSelectable="true" 在 Listview 中不起作用

TextView 实现复制文本功能

TextView实现选中复制到系统粘贴板

CardView 中突出显示的文本没有颜色

Android Interface(UI) 界面控件简单介绍01

从多个 TextView 中选择文本