2011-01-07 116 views
3

我用一個ListView關注。列表中的每個項目都包含一個編輯文本。當我點擊一個編輯文本時,軟鍵彈出,我點擊的編輯文本在短時間內獲得焦點,然後失去它。我必須單擊第二次真正的焦點(爲什麼?)EDITTEXT保持在鍵盤的上和滾動列表視圖

重點的editext鍵盤了我滾動列表視圖 ...

因爲列表視圖元素被回收,焦點再次出現上的EditText在列表中的其他位置,我想這是正常的,但爲什麼安卓不能刪除這個該死的焦點!?我怎麼能說,Android的確定如果我的用戶開始滾動,我不希望重點放在edittext上?

下面是活動的代碼:

public class SimpleList extends Activity { 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.user_picker); 

    ListView listview = (ListView)this.findViewById(R.id.user_picker_list); 
    new UserPickerAdapter(this, listview); 

} 

和適配器的代碼:

public class UserPickerAdapter extends BaseAdapter { 

private final LayoutInflater mInflater; 

private String[] mUsers = {"Guib", "Jonas", "Fred", "Denis", "Arnold", "Francois", "David", "Alex", "Saskia", "Verner", "Anatole"}; 

public UserPickerAdapter(Context context, ListView listview) { 

    mInflater = LayoutInflater.from(context); 
    listview.setAdapter(this); 

} 

@Override 
public int getCount() { 
    return mUsers.length; 
} 

@Override 
public Object getItem(int position) { 
    return mUsers[position]; 
} 

@Override 
public long getItemId(int position) { 
    return position; 
} 

static private class Holder { 
    TextView username; 
} 

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

    Holder holder; 

    if (convertView != null) { 

     holder = (Holder) convertView.getTag(); 

    } else {  

     holder = new Holder(); 
     convertView = mInflater.inflate(R.layout.user_picker_list_item,null); 
     holder.username = (TextView) convertView.findViewById(R.id.user_picker_list_item_name); 
     convertView.setTag(holder); 

    } 

    String str = (String)getItem(position); 
    holder.username.setText(str); 
    return convertView; 

} 

以防萬一,這裏是 'user_picker.xml'

代碼
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_height="fill_parent" android:layout_width="fill_parent" android:orientation="vertical" android:padding="0dp"><ListView android:background="@color/color_grey1" android:cacheColorHint="@color/color_grey1" android:id="@+id/user_picker_list" android:divider="@color/color_blueGrey1" android:layout_height="match_parent" android:layout_width="match_parent"/> 

,一個在「user_picker_list_item.xml」

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:orientation="vertical" android:layout_height="fill_parent"><EditText android:layout_height="wrap_content"android:id="@+id/user_picker_list_item_name" android:layout_width="wrap_content" android:minWidth="200dp" android:layout_gravity="center"></EditText></LinearLayout> 
+0

[ListView中可Focusable EditText]可能的重複(http://stackoverflow.com/questions/2679948/focusable-edittext-inside-listview) – blahdiblah 2013-11-01 01:09:39

回答

0

我認爲找到了解決辦法...

我取代了我適配器的getView()方法的代碼的一部分,通過以下:

if (convertView != null) { 
    holder = (Holder) convertView.getTag(); 
    if (((ListView)arg2).getSelectedItemPosition() == ListView.INVALID_POSITION) { 
     arg2.requestFocus(); 
    } 
} 
1

我試過Gilbou解決方案,但它不適合我,因爲我在所有行都有EditTexts。但也有一些變化,我可以讓它工作:

EditText currentEdit; 

public View getView(int q, View convertView, ViewGroup parent) { 

    ViewHolder holder; 

    if (convertView==null) { 

     convertView = (LinearLayout)inflater.inflate(R.layout.grade_row, null); 

     holder = new ViewHolder(); 
     //Inflate holder 
     convertView.setTag(holder);  
    } else { 
     holder = (ViewHolder)convertView.getTag(); 
    } 

    if (listView.getSelectedItemPosition() == ListView.INVALID_POSITION) { 
     if (currentEdit!=null) 
      currentEdit.requestFocus(); 
    } 

    //update row items 

    return convertView; 
} 

而且,對於每一個EditText上添加列表視圖中的焦點變化監聽器:

myEditText.setOnFocusChangeListener(new OnFocusChangeListener() { 

    public void onFocusChange(View v, boolean hasFocus) { 
     if(!hasFocus) 
      currentEdit = myEditText; 
    } 
} 
+0

請問您可以添加您的適配器getView代碼如何處理它? – 2014-09-29 06:43:41

0

你需要添加

在XML

機器人:descendantFocusability = 「afterDescendants」

在Java

listView.setDescendantFocusability(ViewGroup.FOCUS_AFTER_DESCENDANTS);

,我認爲它的工作原理。

相關問題