7

環境

行が基本的に 2 つの TextView (タイトルコンテンツ) で構成されるリスト ビューがあります。

2 番目の 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);
        }
    }

問題

上記のコードはうまく機能します。2番目の TextView ( content ) も選択できるようにしたいので、設定しましたandroid:textIsSelectable="true"(プログラムで設定も試みました)。

onItemClickしかし、呼び出されなくなったため、TextView を展開/折りたたむことはできません

これは、textIsSelectableすべてのクリック イベントをキャッチするためです... Android doc から:

このメソッドを呼び出して textIsSelectable の値を設定すると、フラグ focusable、focusableInTouchMode、clickable、および longClickable が同じ値に設定されます。これらのフラグは、属性 android:focusable、a​​ndroid:focusableInTouchMode、android:clickable、および android:longClickable に対応しています。これらのフラグのいずれかを以前に設定した状態に復元するには、setFocusable()、setFocusableInTouchMode()、setClickable()、または setLongClickable() の 1 つ以上のメソッドを呼び出します。

後でこれらのフラグを false に設定しようとしましたsetTextIsSelectable(true)が、機能させることができませんでした。

では、 との両方を使用する方法はtextIsSelectableありonItemClickますか?

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 に答える