【问题标题】:ListView: textIsSelectable and onItemClickListView:textIsSelectable 和 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。

【问题讨论】:

    标签: android listview textview


    【解决方案1】:

    我偶然发现了同样的问题,但对这个已有 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 以及选择其文本内容成为可能。

    【讨论】:

      【解决方案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);
      

      【讨论】:

        猜你喜欢
        • 2012-08-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-04-02
        • 2014-02-02
        相关资源
        最近更新 更多