Problems With Listview Inside A Popupwindow
Solution 1:
I finally used a custom adapter to store the selected value and use it from there to mark it:
publicclassFileExplorerAdapterextendsArrayAdapter<File> {
/** File names */private List<File> values = new ArrayList<File>();
/** Currently selected position */privateint selected = -1;
publicFileExplorerAdapter(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 elementif (selected == position) {
row.setBackgroundColor(Color.LTGRAY);
// Override background selector
} else {
row.setBackgroundColor(Color.TRANSPARENT);
}
// More code...return row;
}
/** This sets the selected position */publicvoidsetSelected(int position) {
selected = position;
}
}
And on the class that implements the OnItemClickListener
for the associated ListView
, I set up the currently selected item in the adapter.
@OverridepublicvoidonItemClick(AdapterView<?> adapter, View v, int pos, long id) {
FileExplorerAdapterfileadapter= (FileExplorerAdapter) fileList
.getAdapter();
fileadapter.setSelected(pos);
}
Solution 2:
Solution 3:
I had similar problem, but in my case PopupWindow.setFocusble(false)
was required (and using ListPopupWindow
was not a solution in my case as a lot of stuff in the project already used base PopupWindow
's functionality including extending).
If someone in the same situation there is a kind of workaround based on bug discusson here (post #9)
The main idea is that ListView
's hierarchy is still receives touch events so we can manually trigger onItemClick()
.
However this approach is not 100% identical to real ListView
's touch handling (like there is no glow of selection while tapping a row) this done pretty well for me for the moment.
If someone has more precise solution of this problem, please share.
So, here is complete Adapter
's code which can be used with ListView
inside PopupWindow
which is setFocusable(false)
:
private class CustomAdapter extends ArrayAdapter {
private LayoutInflater mInflater;
private ListView mOwningListView;
publicCustomAdapter(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;
}
@Overridepublic View getView(finalint 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(newOnClickListener() {
@OverridepublicvoidonClick(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 stuffreturn convertView;
}
}
Solution 4:
use this
fileList.setOnItemSelectedListener(new OnItemSelectedListener() {
publicvoidonItemSelected(AdapterView<?> arg0, View arg1,
int pos, long arg3) {
selected = (File) fileList.getItemAtPosition(pos);
}
publicvoidonNothingSelected(AdapterView<?> arg0) {
// TODO Auto-generated method stub
}
} );
Post a Comment for "Problems With Listview Inside A Popupwindow"