【问题标题】:editable EditText in clickable listView可点击列表视图中的可编辑 EditText
【发布时间】:2014-08-06 11:54:52
【问题描述】:

我想用可编辑的editText制作一个可点击的listView。
我有一个自定义列表 adapter.java、自定义列表 item.xml、mainActivity.java。

我试过了
1. android:descendantFocusability="blocksDescendants"
=> 失败。无法编辑editText。
2.editText android:focusable/enable/clickable = true
=> 失败。无法点击列表查看项目
3.getView{editText.onClickListener}
=>失败了。

我想EDITABLE editText,而不仅仅是可点击的editText 和可点击的listView(listItem)。 请帮忙。

customitem.XML

...

   <RelativeLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal"
    android:gravity="center_vertical"
    android:descendantFocusability="blocksDescendants"
    >

    //android:descendantFocusability="blocksDescendants" doesn't work

    <EditText 
        android:id="@+id/tvItem"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:gravity="center_vertical"
        android:textSize="20sp"
        android:textColor="#ffffff"
        android:layout_marginLeft="25dp"
        android:textStyle="bold"
        android:background="@null"
        android:shadowColor="@color/shadow"
        android:shadowDx="3"
        android:shadowDy="3"
        android:shadowRadius="1"
        android:imeOptions="actionDone"
        android:inputType="text"
        android:focusable="true"
        />
    <TextView
        android:id="@+id/tvItemCount"
        android:layout_width="@dimen/list_height"
        android:layout_height="70dp"
        android:layout_alignParentRight="true"
        android:textColor="#ffffff"
        android:textSize="22dp"
        android:text="6"
        android:background="#3300b7ff"
        android:gravity="center_vertical|center_horizontal"
        android:shadowColor="@color/shadow"
        android:shadowDx="3"
        android:shadowDy="3"
        android:shadowRadius="1"
        android:textStyle="bold"/>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="2dp"
        android:layout_alignParentBottom="true"
        android:layout_alignParentLeft="true"
        android:background="@color/dark_shadow" >

    </LinearLayout>
</RelativeLayout>

...

【问题讨论】:

  • android:descendantFocusability="beforeDescendants" 怎么样?
  • 检查适配器上的方法“isEnabled(position)”。它应该返回 true。
  • 这可能会让您了解如何实现您想要的目标。这里实现了类似的事情,但方式有所不同。 EditText 在项目点击时显示:stackoverflow.com/questions/18841650/…

标签: java android listview android-listview android-edittext


【解决方案1】:

经过我自己的几次尝试,我已经向 Google 叔叔询问了您的问题。你知道他说了什么吗?

ListView 无法很好地处理 EditText 视图。如果很多人以前无法解决这个问题,也许你会考虑一些像HERE 这样描述的“解决方法”。这是其他问题的答案,但可能即使您解决上述问题,您也会遇到这个问题。

简而言之,@Andrew 建议使用带有简单 LinearLayout 的 ScrollLayout 而不是 ListView。在 onCreate 方法中,他膨胀了用于列表项的 View 并将其添加到 LinearLayout 中,并将其存储在 ArrayList 中,以便以后将数据保存到每个视图中。

我知道这不能解决你的问题,但也许它让你有很多时间,你会花时间寻找任何合理的解决方案。

编辑

这很有趣。受@Rishabh Srivastava 链接的启发,我试图找到一些解决方案(我知道,我有点固执)。

我创建了适配器布局——RelativeLayout,它被 Button 完全填充并且在它上面(我的意思是在它上面——在 Z 轴上)我已经放置了 EditText 视图。我认为edittext将处理点击它,而按钮将处理edittext视图之外的点击。不幸的是,'click' 事件在所有视图中传播 - 因此通过单击 edittext,我们也将单击按钮。

我认为我比所有人都聪明,所以我使用了 OnTouchListener - 我们可以处理单个“触摸”事件并返回真值,作为我们处理它的操作系统的信息。

你知道吗?我遇到了与上面链接中描述的完全相同的问题:

当我单击 EditText 时,虚拟键盘会显示出来,但 EditText 失去焦点,我必须再次单击 EditText。

我希望你不想再浪费你的时间了;)

【讨论】:

    【解决方案2】:

    首先谢谢大家!

    我尝试了所有的答案,但没有奏效...:(
    Focusable EditText in the ListView and onItemClick
    对我有用

    我的代码▼

    public class subMyListAdapter extends BaseAdapter{
    Context context;
    LayoutInflater Inflater;
    ArrayList<subMyItem> arraySrc;
    int layout;
    static int currentTheme = 0;
    EditText tvItem;
    RelativeLayout rl_inflate;
    UserHolder holder;
    public subMyListAdapter(Context context, int layout, ArrayList<subMyItem> arraySrc)
    {
        this.context = context;
        this.layout = layout;
        this.arraySrc = arraySrc;
        Inflater = (LayoutInflater)context.getSystemService(context.LAYOUT_INFLATER_SERVICE);
    }
    public int getCount()
    {
        return arraySrc.size();
    }
    public String getItem(int position)
    {
        return arraySrc.get(position).list;
    }
    public long getItemId(int position)
    {
        return position;
    }
    public View getView(final int position, View conv, ViewGroup parent)
    {
        holder = null;
         if (conv == null) 
         {
           LayoutInflater inflater = ((Activity) context).getLayoutInflater();
           conv = inflater.inflate(layout, parent, false);
           holder = new UserHolder();
           holder.tvItem = (EditText)conv.findViewById(R.id.tvItem);
           conv.setTag(holder);
         }
         else 
         {
           holder = (UserHolder) conv.getTag();
         }
         if(holder == null)
         {
           holder = new UserHolder();
           holder.tvItem = (EditText)conv.findViewById(R.id.tvItem);
           conv.setTag(holder);
         }
         subMyItem user = arraySrc.get(position);
         holder.tvItem.setOnTouchListener(test);
         conv.setOnTouchListener(test);
        if(conv == null)
        {
            conv = conv;
        }
        tvItem = (EditText) conv.findViewById(R.id.tvItem);
        user = arraySrc.get(position);
        tvItem.setText(user.list);
        tvItem.setOnClickListener(new View.OnClickListener() 
         {
           @Override
           public void onClick(View v) 
           {
               Toast.makeText(context, "tvItem button Clicked",
               Toast.LENGTH_LONG).show();
           }
        });
        return conv;
    }
    View.OnTouchListener test=  new View.OnTouchListener() 
    {
        @Override
        public boolean onTouch(View view, MotionEvent event) 
        {
            if (view instanceof EditText) 
            {
                EditText editText = (EditText) view;
                editText.setFocusable(true);
                editText.setFocusableInTouchMode(true);
            } else 
            {
                UserHolder holder = (UserHolder) view.getTag();
                holder.tvItem.setFocusable(false);
                holder.tvItem.setFocusableInTouchMode(false);
            }
        return false;
        }
    };
     static class UserHolder 
     {
          EditText tvItem;
         }
     }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-10-22
      • 1970-01-01
      • 2011-08-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多