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、android:focusableInTouchMode、android:clickable 和 android:longClickable。要将这些标志中的任何一个恢复到您之前设置的状态,请调用以下一个或多个方法:setFocusable()、setFocusableInTouchMode()、setClickable() 或 setLongClickable()。
我尝试在 setTextIsSelectable(true)
之后将这些标志设置为 false,但我没能成功。
那么,有什么想法可以同时使用textIsSelectable
和onItemClick
?
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 中不起作用