Tim*_*ima 23 android listview android-listview
我知道,之前曾问过这个问题,但我没有看到它的工作答案.
有没有办法在ListView不更改源数据的情况下隐藏某些项目?
我试图将项目视图的可见性设置为已消失,它将不再显示,但为此项目保留的位置仍然存在.
我还设置:
android:dividerHeight="0dp"
android:divider="#FFFFFF"
Run Code Online (Sandbox Code Playgroud)
没有成功.
Car*_*ten 22
您可以编写自己的,也可以创建ListAdapter现有的子类.
在你的ListAdapter,你只会过滤掉你不想要返回修改后的值显示的项目getCount(),getItem()并getItemId()在适当.
tao*_*tao 13
如果你想隐藏这样的项目:
convertView.setLayoutParams(new AbsListView.LayoutParams(-1,1));
convertView.setVisibility(View.GONE);
Run Code Online (Sandbox Code Playgroud)
不能是AbsListView.LayoutParams(-1,0);
如果convertview被重用,你应该在下面添加它来设置它的高度:
if(convertView.getVisibility() == View.GONE) {
convertView.setVisibility(View.VISIBLE);
convertView.setLayoutParams(new AbsListView.LayoutParams(-1,-2));
}
Run Code Online (Sandbox Code Playgroud)
Moh*_*hin 11
我尝试了几种解决方案,包括setVisibitlity(View.GONE)和膨胀默认null视图,但所有这些都有一个共同的问题,即隐藏项目之间的分隔线被堆叠起来,并在大型列表中形成一个糟糕的可见灰色空间.
如果你ListView有一个支持,CursorAdapter那么最好的解决方案是用一个包裹它CursorWrapper.
所以我的解决方案(基于@RomanUsachev 在这里回答)是这样的:
FilterCursorWrapper
public class FilterCursorWrapper extends CursorWrapper {
private int[] index;
private int count = 0;
private int pos = 0;
public boolean isHidden(String path) {
// the logic to check where this item should be hidden
// if (some condintion)
// return false;
// else {
// return true;
// }
return false;
}
public FilterCursorWrapper(Cursor cursor, boolean doFilter, int column) {
super(cursor);
if (doFilter) {
this.count = super.getCount();
this.index = new int[this.count];
for (int i = 0; i < this.count; i++) {
super.moveToPosition(i);
if (!isHidden(this.getString(column)))
this.index[this.pos++] = i;
}
this.count = this.pos;
this.pos = 0;
super.moveToFirst();
} else {
this.count = super.getCount();
this.index = new int[this.count];
for (int i = 0; i < this.count; i++) {
this.index[i] = i;
}
}
}
@Override
public boolean move(int offset) {
return this.moveToPosition(this.pos + offset);
}
@Override
public boolean moveToNext() {
return this.moveToPosition(this.pos + 1);
}
@Override
public boolean moveToPrevious() {
return this.moveToPosition(this.pos - 1);
}
@Override
public boolean moveToFirst() {
return this.moveToPosition(0);
}
@Override
public boolean moveToLast() {
return this.moveToPosition(this.count - 1);
}
@Override
public boolean moveToPosition(int position) {
if (position >= this.count || position < 0)
return false;
return super.moveToPosition(this.index[position]);
}
@Override
public int getCount() {
return this.count;
}
@Override
public int getPosition() {
return this.pos;
}
}
Run Code Online (Sandbox Code Playgroud)
当您Cursor准备就绪时,请FilterCursorWrapper使用您想要的列索引
FilterCursorWrapper filterCursorWrapper = new FilterCursorWrapper(cursor, true,DATA_COLUMN_INDEX);
dataAdapter.changeCursor(filterCursorWrapper);
Run Code Online (Sandbox Code Playgroud)
如果你进行过滤和排序,不要忘记在FilterCursorWrapper任何地方使用:
dataAdapter.setFilterQueryProvider(new FilterQueryProvider() {
@Override
public Cursor runQuery(CharSequence constraint) {
String selection = MediaStore.Video.Media.DATA + " LIKE '%" + constraint.toString().toLowerCase() + "%'";
return new FilterCursorWrapper(context.getContentResolver().query(videoMediaUri, columns, selection, null, null), true, DATA_COLUMN_INDEX);
}
});
Run Code Online (Sandbox Code Playgroud)
并且为了刷新列表,这足以使用空过滤器进行查询:
dataAdapter.getFilter().filter("");
Run Code Online (Sandbox Code Playgroud)
而且你完成了,只需改变isHidden方法的逻辑,你就可以控制显示或隐藏隐藏的项目.而且好处是你没有看到不受欢迎的分隔线堆积起来.:-)
在某些情况下,您有一个简单的解决方案:
我必须在列表视图中隐藏视图,因为填充视图的项目无效,所以我不想看到该视图:
在我的列表适配器中:
public class PlanListAdapter extends BaseAdapter{
//some code here : constructor ......
// my code that create the view from the item list (one view by item ...)
@Override
public View getView(int position, View convertView, ViewGroup parent) {
LayoutInflater inflater = (LayoutInflater) this.context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = inflater.inflate(R.layout.my_layout, null);
if(my_data_are_not_valid) {
//just create an empty view
convertView = new Space(context);
}
else {
//populate the view with data here
populate(convertView);
}
return convertView;
}
//some code here to populate the view ...
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
47976 次 |
| 最近记录: |