可点击的listView中可编辑的EditText

时间:2014-08-06 11:54:52

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

我想用可编辑的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>

...

2 个答案:

答案 0 :(得分:2)

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

ListView无法很好地处理EditText视图。如果很多人以前无法解决这个问题,也许你会考虑像这样的“解决方法”{2004}。这是对其他问题的回答,但即使您将解决上述问题,您也会遇到这个问题。

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

我知道这不是解决您问题的方法,但也许它会让您花费大量时间,而您将花费大量时间寻找合理的解决方案。

修改

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

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

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

你知道吗?我遇到的问题完全一样,如上所述:

  

当我点击EditText时,虚拟键盘显示自己,但EditText失去焦点,我必须再次点击EditText。

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

答案 1 :(得分:0)

首先,谢谢大家!

我尝试了所有的答案,但它不起作用...... :(
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;
     }
 }