2017-12-22 7 views
0

ListPopupWindowを使用して検索フィールドを構築しています。 特定のデバイスでは、ListPopupWindowはスクロールするとその位置を変更します。 (これは、先頭にジャンプ):スクロール前ListPopupWindowがスクロールすると特定のデバイス上にジャンプする

enter image description here

スクロールした後:

Jumped to top after scrolling

を私はネクサス6Pでこれをテストしました。 他のデバイスでは正常に動作しますが、スクロールすると初期位置は変更されません。これはSamsung Galaxy A5で撮影されました。

Dropdown normal

ここでは、コードです:

Activiyt:

public class MainActivity extends AppCompatActivity implements AdapterView.OnItemClickListener { 
    EditText itemName; 
    ListPopupWindow listPopupWindow; 
    String[] items = {"Item1", "Item2", "Item3", "Item4", 
      "Item5", "Item6", "Item7", "Item8", "Item9", "Item10"}; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     itemName = (EditText) findViewById(
       R.id.item_name); 
     listPopupWindow = new ListPopupWindow(
       MainActivity.this); 
     listPopupWindow.setAdapter(new ArrayAdapter<>(
       MainActivity.this, 
       R.layout.list_item, items)); 
     listPopupWindow.setAnchorView(itemName); 
     listPopupWindow.setWidth(ListPopupWindow.MATCH_PARENT); 
     listPopupWindow.setHeight(ListPopupWindow.WRAP_CONTENT); 

     listPopupWindow.setModal(true); 
     listPopupWindow.setOnItemClickListener(MainActivity.this); 
     itemName.setOnClickListener(new View.OnClickListener() { 
      public void onClick(View v) { 
       listPopupWindow.show(); 
      } 
     }); 
    } 

    @Override 
    public void onItemClick(AdapterView<?> parent, View view, 
          int position, long id) { 
     itemName.setText(items[position]); 
     listPopupWindow.dismiss(); 
    } 
} 

活動のレイアウトファイル:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical"> 

    <EditText 

     android:id="@+id/item_name" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:hint="Enter item name" 
     android:textSize="26sp"/> 
</LinearLayout> 

とリスト項目のレイアウト:

<?xml version="1.0" encoding="utf-8"?> 
<TextView xmlns:android="http://schemas.android.com/apk/res/android" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:padding="6dp" 
      android:textSize="50sp" 
      android:textStyle="bold"/> 

これを解決する方法はありますか?代わりにこれを行うの

+0

:あなたは、単にビューにRunnableを投稿することができます。 –

+0

あなたは何を意味するのか分かるようにいくつかのコードを提供できますか? :) – buellas

+0

検索は1つのデバイスにのみ表示され、他のデバイスには表示されません。 –

答えて

0

は:

listPopupWindow.setHeight(ListPopupWindow.WRAP_CONTENT); 

あなたは明示的にあなたのlistPopupWindowの高さを設定する必要があります。これを行うには、利用可能な高さを計算し、その値を設定する適切な瞬間を見つけ出す必要があります。

  1. 上記の行を削除してください。

  2. あなたのxml LinearLayoutにこれを追加します。

    android:id="@+id/root" 
    
  3. は、あなたのMainActivityにこれを追加します。

    @Override 
    public void onWindowFocusChanged(boolean hasFocus) { 
        super.onWindowFocusChanged(hasFocus); 
        if (hasFocus) { 
         int popupHeight = findViewById(R.id.root).getHeight() - itemName.getHeight(); 
         listPopupWindow.setHeight(popupHeight); 
        } 
    } 
    

をフラグメントの中に、あなたはonWindowFocusChangedは必要ありません。画面サイズに応じてレイアウトを設定する必要がありますし

Activity activity; 
EditText itemName; 
ListPopupWindow listPopupWindow; 
LinearLayout linearLayout; 
String[] items = {"Item1", "Item2", "Item3", "Item4", "Item5", "Item6", "Item7", "Item8", "Item9", "Item10"}; 

@Override 
public void onAttach(Context context) { 
    super.onAttach(context); 
    if (context instanceof Activity) { 
     activity = (Activity) context; 
    } 
} 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    super.onCreateView(inflater, container, savedInstanceState); 
    final View view = inflater.inflate(R.layout.fragment_main, container, false); 
    linearLayout = view.findViewById(R.id.root); 
    itemName = view.findViewById(R.id.item_name); 
    listPopupWindow = new ListPopupWindow(activity); 
    listPopupWindow.setAdapter(new ArrayAdapter<>(activity, R.layout.list_item, items)); 
    listPopupWindow.setAnchorView(itemName); 
    listPopupWindow.setWidth(ListPopupWindow.MATCH_PARENT); 
    listPopupWindow.setModal(true); 
    listPopupWindow.setOnItemClickListener(this); 
    itemName.setOnClickListener(new View.OnClickListener() { 
     public void onClick(View v) { 
      listPopupWindow.show(); 
     } 
    }); 
    view.post(new Runnable() { 
     @Override 
     public void run() { 
      int popupHeight = linearLayout.getHeight() - itemName.getHeight(); 
      listPopupWindow.setHeight(popupHeight); 
     } 
    }); 
    return view; 
} 
+0

ありがとう、これは問題を解決しました:)リストがフラグメントに含まれる場合、これをどのように解決しますか? – buellas

+0

ちょうどリスト?または、 'EditText'ですか? – kalabalik

+0

EditTextも – buellas

関連する問題