Android 单击后隐藏ListView
我有一个listview,当它被点击时,它必须是不可见的。它工作得非常好,但是当屏幕上下滚动时,那些看不见的东西又会重新出现。有人知道怎么修理这些吗 下面是我的ListItemClick的代码片段Android 单击后隐藏ListView,android,scroll,visibility,Android,Scroll,Visibility,我有一个listview,当它被点击时,它必须是不可见的。它工作得非常好,但是当屏幕上下滚动时,那些看不见的东西又会重新出现。有人知道怎么修理这些吗 下面是我的ListItemClick的代码片段 protected void onListItemClick(ListView l, View v, int position, long id) { super.onListItemClick(l, v, position, id); v.setV
protected void onListItemClick(ListView l, View v, int position, long id) {
super.onListItemClick(l, v, position, id);
v.setVisibility(View.GONE);
Object o = this.getListAdapter().getItem(position);
Contact1 c = (Contact1) o;
Toast.makeText(this, c.getDisplayName(),
Toast.LENGTH_SHORT).show();
Toast.makeText(this, c.getId(), Toast.LENGTH_SHORT).show();
ids.add(c.getDisplayName());
}
这是因为每次滚动列表时,listview的适配器的
getView()
方法都会在再次生成listitems的位置被调用。因此,为了满足您的需要,您需要有一个自定义适配器,并覆盖它的getView
方法,并且在其中
@override
public View getView(View view) //Just a mock method, do not copy paste
{
if(!isVisible[position]){ // isVisible is an array which holds whether a view at position is visible or not
//make it invicsible here
}
return view;
}
如果您使用自定义适配器并希望在滚动时隐藏,则需要在单击列表视图时保留一个标志,然后在
getView()中根据位置设置listview或listview项,或者您可以将所有项隐藏为不可见 我假设该项目是一个Contact1
对象,它仍然在数组中(或者您用来存放项目的任何容器)
您需要从两件事中选择一件:
1) 从数组中删除该项,然后重新生成列表视图
2) 保留一个不可见项的列表(如sandy建议的),然后不要为它们创建视图 您可以使用该BaseAdpter,并根据视图位置使其可见和不可见
public class ContactsAdapter extends BaseAdapter {
ArrayList<ContactInfo> mlist;
Context mcontext;
// this arraylist used to contains click item
List<String> checkednamelist;
public ContactsAdapter (Context context,ArrayList<ChatInfo> mchtlist) {
checkednamelist = new ArrayList<String>();
mlist = mchtlist;
mcontext = context;
}
@Override
public int getCount() {
return mlist.size();
}
@Override
public Object getItem(int postion) {
return mlist.get(postion);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertview, ViewGroup viewgroup){
View view = null;
if(convertview == null){
LayoutInflater inflater = context.getLayoutInflater();
view = inflater.inflate(R.layout.contactrow, null);
ContactHolder holder = new ContactHolder();
holder.txtviewfirstname = (TextView)view.findViewById(R.id.firstname);
holder.txtviewphone = (TextView)view.findViewById(R.id.phone);
holder.chkselected = (CheckBox)view.findViewById(R.id.check);
chkselected .setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// here you can add selected item name for make it invisible from list
checkednamelist.add("Stringvalures");
});
// this code is helps to achieve that
try{
if (checkednamelist.contains("yourstringname")) {
// here make visible your cotrol
chkleft.setChecked(true);
chkleft.setVisibility(View.VISIBLE);
} else {
// here make Invisible your cotrol
chkleft.setChecked(false);
chkleft.setVisibility(View.INVISIBLE);
}
}catch(Exception e){
Log.i(TAG, "Exception while checkbox make unchecked when scrolling"+e);
}
view.setTag(holder);
}
else{
view = convertview;
}
ContactHolder holder2 = (ContactHolder) view.getTag();
holder2.txtviewfirstname.setText(list.get(position).firstname);
holder2.txtviewphone.setText(list.get(position).phonenumber);
holder2.chkselected.setChecked(list.get(position).selected);
return view;
}
公共类ContactsAdapter扩展BaseAdapter{
阵列列表;
语境;
//此arraylist用于包含单击项
列表检查名称列表;
公共联系人适配器(上下文,ArrayList mchtlist){
checkednamelist=新建ArrayList();
mlist=mchtlist;
mcontext=上下文;
}
@凌驾
public int getCount(){
返回mlist.size();
}
@凌驾
公共对象getItem(int position){
返回mlist.get(position);
}
@凌驾
公共长getItemId(int位置){
返回位置;
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组视图组){
视图=空;
if(convertview==null){
LayoutInflater充气器=上下文。getLayoutInflater();
视图=充气机。充气(R.layout.contactrow,空);
ContactHolder=新的ContactHolder();
holder.txtviewfirstname=(TextView)view.findViewById(R.id.firstname);
holder.txtviewphone=(TextView)view.findViewById(R.id.phone);
holder.chkselected=(复选框)view.findViewById(R.id.check);
setOnClickListener(新的OnClickListener(){
@凌驾
公共void onClick(视图v){
//在这里,您可以添加选定的项目名称,使其从列表中不可见
选中名称列表。添加(“StringValuers”);
});
//这段代码有助于实现这一点
试一试{
if(checkednamelist.contains(“yourstringname”)){
//在这里可以看到你的控制
chkleft.setChecked(真);
chkleft.setVisibility(View.VISIBLE);
}否则{
//这是你的隐形控制
chkleft.setChecked(假);
chkleft.setVisibility(视图不可见);
}
}捕获(例外e){
Log.i(标记“异常,当滚动“+e”时复选框未选中);
}
视图.设置标签(支架);
}
否则{
视图=转换视图;
}
ContactHolder-holder2=(ContactHolder)view.getTag();
holder2.txtviewfirstname.setText(list.get(position.firstname));
holder2.txtviewphone.setText(list.get(position.phonenumber));
holder2.chkselected.setChecked(list.get(position).selected);
返回视图;
}
}非常感谢您的建议完全符合我的要求:-)