listview中的Android edittext失去了对notifydatachanged的调用

时间:2012-03-02 02:12:26

标签: android android-edittext

我在listview中有一些edittext。我在edittext上有一个通用的focuslistener,它通过调用notifydatachanged来更新数据模型的值以及当焦点丢失时edittext的背景。问题是如果其中一个edittext持有焦点,当我触摸下一个edittext时,它会暂时获得焦点然后失去焦点。我怀疑这是由于notifydatachanged方法调用导致重绘所有视图,之后焦点丢失。有没有人有关于这个问题的建议或解决方法?感谢。

5 个答案:

答案 0 :(得分:18)

android:windowSoftInputMode="adjustPan"

表示您在AndroidManifest.xml中的活动

答案 1 :(得分:17)

确实发生了这种情况,因为所有视图都被重新绘制,因此表示用于聚焦的任何行的编辑文本现在是一个完全不同的对象。在适配器中设置变量:int currentFocusedRow;

在适配器的getView中

:为每个编辑文本添加一个onFocusChanged侦听器,当该编辑文本获得焦点时,设置currentFocusedRow =焦点编辑文本恰好在哪一行。还要将currentFocusedRow中的任何编辑文本设置为专注。

答案 2 :(得分:6)

我还遇到了EditText失去焦点的问题,但是调用setDescendantFocusability(ListView.FOCUS_AFTER_DESCENDANTS)解决了它。

@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    final ListView lv = getListView();
    lv.setDescendantFocusability(ListView.FOCUS_AFTER_DESCENDANTS);
}

答案 3 :(得分:1)

对于未来的用户来说,这里的一切都过于复杂。正确的答案是添加

android:descendantFocusability="afterDescendants"

到你的列表视图。

答案 4 :(得分:0)

使用额外的开关实现Sam Judd建议的示例use_last_focus

public class my_friends_adapter extends ArrayAdapter<group_user> {
    boolean use_last_focus=false;
    int currentlyFocusedRow=-1;
    String currentlyFocusedField="";

    public my_friends_adapter(Context context, int resource, ArrayList<group_user> users) {
            super(context, resource, users);
              }
        EditText tvName,tvEmail;

    @Override
   public View getView(int position, View convertView, ViewGroup parent) {

        if (convertView == null) convertView = LayoutInflater.from(getContext()).inflate(R.layout.my_friends_item, parent, false);
        tvName = (EditText) convertView.findViewById(R.id.tvName);
        tvEmail = (EditText) convertView.findViewById(R.id.tvEmail);
        if (use_last_focus && currentlyFocusedRow ==position){
            if (currentlyFocusedField=="tvName")tvName.requestFocus();
            else tvEmail.requestFocus();
            use_last_focus=false;
        }
        tvName.setTag(position);//When focus is lost save the entered value for later use
        tvName.setOnFocusChangeListener(new View.OnFocusChangeListener() {
            @Override
            public void onFocusChange(View v, boolean hasFocus) {save_data2( v,  hasFocus);
            }
        });

        tvEmail.setTag(position);//When focus is lost save the entered value for later use
        tvEmail.setOnFocusChangeListener(new View.OnFocusChangeListener() {
            @Override
            public void onFocusChange(View v, boolean hasFocus) {save_data2( v,  hasFocus);}
        });

        return convertView;
        }


    public  void save_data2(View v, boolean hasFocus){
        int position = (Integer) v.getTag();
        EditText tvName1 = (EditText) v.findViewById(R.id.tvName);
        EditText tvEmail1 = (EditText) v.findViewById(R.id.tvEmail);
        boolean data_changed=false;
        if (hasFocus) currentlyFocusedRow=position;
        if (!(tvName1==null)) {
            if (hasFocus) currentlyFocusedField="tvName";
        }
        if (!(tvEmail1==null)) {
            if (hasFocus) currentlyFocusedField="tvEmail";
        }
        // set when data_changed
        // ..........
        if (!hasFocus && data_changed) {
            //your code to save the changed data
            // ...............
            //
            my_friends.adapter.notifyDataSetChanged();
            use_last_focus=true;
        }

    }



}