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 (内容)所以我设置android:textIsSelectable="true"(也尝试以编程方式设置)。

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

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

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

之后我尝试将这些标志设置为 false,setTextIsSelectable(true)但我没有设法使其工作。

那么,任何想法如何同时使用textIsSelectableonItemClick

PS:仅支持Android > 4.0。

4

2 回答 2

0

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

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

这启用了单击 TextView 以及选择其文本内容。

于 2022-03-02T14:29:20.127 回答
-4

使用下面的代码它将工作 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);
于 2014-03-01T09:22:22.033 回答