2012-10-03 4 views
3

PopupWindowListView이 있습니다. PopupWindow는 그런 다음이PopupWindow 내 ListView 문제

window.setContentView(root); 
    window.setTouchable(true); 
    window.setFocusable(true); 
    window.setOutsideTouchable(true); 
    window.setWidth(WindowManager.LayoutParams.WRAP_CONTENT); 
    window.setHeight(WindowManager.LayoutParams.WRAP_CONTENT); 

ListView처럼 초기화 : 이것처럼

fileList = (ListView) root.findViewById(R.id.explorer_list); 
    fileList.setChoiceMode(ListView.CHOICE_MODE_SINGLE); 
    fileList.setSelector(android.R.drawable.screen_background_light_transparent); 
    fileList.setOnItemClickListener(this); 

    [...] 

    @Override 
    public void onItemClick(AdapterView<?> adapter, View v, int pos, long id) { 
     selected = (File) fileList.getItemAtPosition(pos);  
    } 

은, 모든 ListView까지 선택에 표시되지 않습니다 선택기 스크롤되는 것을 제외하고는 제대로 작동 (아무것도 시각적으로 보여줍니다 선택으로 항목이 올바르게 선택 되었더라도 목록이 스크롤 될 때까지).

PopupWindow을 포커스 할 수 없게 설정하면 시각적 선택이 올바르게 작동하지만 (클릭하면 항목이 시각적으로 올바르게 선택됨) onItemClick()이 호출되지 않으므로 선택한 항목을 가져올 수 없습니다.

ListView.getSelectedItem()은 선택한 항목이 있어도 항상 두 경우 모두 null을 반환합니다.

이 상황을 해결하는 방법에 대한 아이디어가 있습니까? 미리 감사드립니다.

답변

2

내가 마지막으로 선택한 값을 저장하고 표시하기 위해 거기에서 그것을 사용하는 사용자 정의 어댑터를 사용 :

public class FileExplorerAdapter extends ArrayAdapter<File> { 

    /** File names */ 
    private List<File> values = new ArrayList<File>(); 

    /** Currently selected position */ 
    private int selected = -1; 

    public FileExplorerAdapter(Context context, List<File> values) { 
     super(context, R.layout.explorer_row, values); 
     this.values = values; 
    } 

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

     // I know that my layout is always a TextView 
     TextView row = (TextView) convertView; 
     if (row == null) { 
      row = (TextView) ViewHelper.inflateViewById(getContext(), 
        R.layout.explorer_row); 
     } 

     // More code... 

     // Set up the background for selected element 
     if (selected == position) { 
      row.setBackgroundColor(Color.LTGRAY); 

     // Override background selector 
     } else { 
      row.setBackgroundColor(Color.TRANSPARENT); 
     } 

     // More code... 

     return row; 
    } 

    /** This sets the selected position */ 
    public void setSelected(int position) { 
     selected = position; 
    } 
} 

을 그리고 대한 OnItemClickListener를 구현하는 클래스에 연결된 ListView, 나는 어댑터에서 현재 선택된 항목을 설정합니다.

@Override 
public void onItemClick(AdapterView<?> adapter, View v, int pos, long id) { 
    FileExplorerAdapter fileadapter = (FileExplorerAdapter) fileList 
      .getAdapter(); 
    fileadapter.setSelected(pos); 
} 
0

사용이

fileList.setOnItemSelectedListener(new OnItemSelectedListener() { 

     public void onItemSelected(AdapterView<?> arg0, View arg1, 
       int pos, long arg3) { 
      selected = (File) fileList.getItemAtPosition(pos);  

     } 

     public void onNothingSelected(AdapterView<?> arg0) { 
      // TODO Auto-generated method stub 

     } 

    }); 
+0

는하지만 감사 이미 이것을 시도했습니다. 'OnItemSelectedListener'는'OnItemClickedListener'와 같은 문제가 있습니다 :'PopupWindow'가 포커스를받을 수 없을 때 절대로 호출되지 않습니다. – m0skit0

+0

실제로'OnItemSelectedListener'는 무엇이든지 호출되지 않습니다. – m0skit0

1

// 거짓

안드로이드에 대한 목록보기 포커스 속성 설정 : 포커스 나는 비슷한 문제가 있지만, 내 경우에는 PopupWindow.setFocusble(false)이 필요 (그리고 ListPopupWindow을 사용하고있었습니다했다

+0

대답 10 월 4 일 12시 9시 33 분 ... ListView 포커스를 설정할 수없는 경우, 내 사랑하는 항목을 선택할 수 없습니다. – m0skit0

1

= "false"를하지 않은 솔루션을 내 경우에는 이미 프로젝트에서 많은 것들이 기지를 포함하여 PopupWindow의 기능을 확장했다.

같은 상황에있는 사람은 해결 방법의 종류 버그 discusson에 근거가있는 경우 here (포스트 # 9)

주요 아이디어는 ListView의 계층 구조가 터치 이벤트 그래서 우리는 수동으로 onItemClick()을 실행할 수있는 수신 여전히 있다는 것입니다 .

그러나이 접근법은 실제 ListView의 터치 처리와 100 % 동일하지 않습니다 (행을 탭하는 동안 아무런 선택의 여지가없는 것처럼) 이것은 나에게 꽤 좋았습니다.

누군가이 문제에 대한보다 정확한 해결책을 가지고 있다면 공유하십시오.

그래서, 여기에 setFocusable(false)입니다 PopupWindow 내부 ListView 함께 사용할 수있는 완전한 Adapter의 코드입니다 :

개인 클래스 CustomAdapter는 ArrayAdapter와 확장은 {

private LayoutInflater mInflater; 
private ListView mOwningListView; 

public CustomAdapter(Context context, List<String> objects, ListView listView) { 
    super(context, android.R.layout.simple_list_item_1, objects); 
    mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    mOwningListView = listView; 
} 


@Override 
public View getView(final int position, View convertView, ViewGroup parent) { 
    if (convertView == null) { 
     convertView = mInflater.inflate(R.layout.font_pick_row, null); 
    } 
    // this is the key point of workaround 
    convertView.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      /* 
      * as every row is still receiving their touches 
      * we can use this to manually trigger onItemClick 
      * since it doesn't firing in popupWindow.setFocusable(false) 
      */ 
      mOwningListView.getOnItemClickListener().onItemClick(mOwningListView, v, position, getItemId(position)); 

     } 
    }); 
    //... other stuff 
    return convertView; 
} 

}