ListView: textIsSelectable and onItemClick

7

背景

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

第二个TextView可以有一个很长的文本,所以我设置了maxLines =“6”。当用户单击时,我会取消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,但我没有成功使其工作。

那么,有什么办法同时使用textIsSelectableonItemClick吗?

PS:仅支持 Android > 4.0。

2个回答

0

我遇到了同样的问题,但没有找到这个已经存在8年的问题的答案。我的解决方案如下:

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

这使得可以点击TextView并选择其文本内容。


-4

使用以下代码,它将百分之百地工作

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);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接