`

当listview的item多于一个屏幕的时候,出现重复选择问题

阅读更多
在Android应用开发中,很多时候都会遇到这样的需求,一个listView,含有N项,当点击某项时,该项展开,显示该项中隐藏的某些控件,再点击,该项收回,重新隐藏部分控件,当一项打开状态,点击另一项,另一项展开,该项关闭。


当listview的item多于一个屏幕的时候,会出现重复选择问题,就是当你选中一项滑动的时候,可能会发现滑动后出现的某项也是在选中状态,这个问题令人十分抓狂。见网上有个方法是:在adapter的getView里面不使用convertview。每一个view都是重新创建一个。能够解决问题,但是还是有点浪费资源。

main.xml:
<?xml version="1.0" encoding="utf-8"?>  
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
    android:layout_width="fill_parent"  
    android:layout_height="fill_parent"  
    android:orientation="vertical" >  
  
    <TextView  
        android:layout_width="fill_parent"  
        android:layout_height="wrap_content"  
        android:text="ListView Test" />  
    <ListView   
        android:id="@+id/list"  
        android:layout_width="wrap_content"  
        android:layout_height="fill_parent"  
        ></ListView>  
  
</LinearLayout>  


list_item.xml:
<?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="wrap_content"  
    android:orientation="vertical"  
    >  
    <TextView   
        android:id="@+id/textView"  
        android:layout_width="wrap_content"  
        android:layout_height="wrap_content"  
        android:text="Test"  
        android:textSize="20sp"  
        />  
    <LinearLayout  
        android:id="@+id/hint_image"  
        android:layout_width="match_parent"  
        android:layout_height="wrap_content"  
        android:orientation="horizontal"  
        android:visibility="gone">  
        <ImageView   
            android:id="@+id/image_uefa"  
            android:layout_width="0dp"  
            android:layout_height="60dp"  
            android:layout_weight="1"  
            android:src="@drawable/uefa"  
            />  
        <ImageView   
            android:id="@+id/image_mascot"  
            android:layout_width="0dp"  
            android:layout_height="60dp"  
            android:layout_weight="1"  
            android:src="@drawable/mascot"  
            />  
          
    </LinearLayout>  
      
</LinearLayout>  


ListAdapter:
package cn.demo;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;

public class ListAdapter extends BaseAdapter {
	private Context mContext;
	private int mLastPosition = -1;
	
	public ListAdapter(Context context) {
		this.mContext = context;
	}

	@Override
	public int getCount() {
		return 100;
	}

	@Override
	public Object getItem(int position) {
		return null;
	}

	@Override
	public long getItemId(int position) {
		return 0;
	}

	@Override
	public View getView(int position, View convertView, ViewGroup parent) {
		Holder holder = new Holder();;
		if(convertView == null ) {
			LayoutInflater inflater = LayoutInflater.from(mContext);
			convertView = inflater.inflate(R.layout.list_item, null);
			
			holder.textView = (TextView)convertView.findViewById(R.id.textView);
			holder.UEFAView = (ImageView)convertView.findViewById(R.id.image_uefa);
			holder.mascotView = (ImageView)convertView.findViewById(R.id.image_mascot);
			holder.hint = convertView.findViewById(R.id.hint_image);
			convertView.setTag(holder);
		} else {
			holder = (Holder) convertView.getTag();
		}
		holder.textView.setText("Hello,It is " + position);
		if (position == mLastPosition) {
		    holder.hint.setVisibility(View.VISIBLE);
		} else {
		    holder.hint.setVisibility(View.GONE);
		}
		return convertView;
	}
	
	class Holder {
		TextView textView;
		ImageView UEFAView;
		ImageView mascotView;
		View hint;
	}
	
	public void changeImageVisable(int position) {
	    if(position != mLastPosition) {
	        mLastPosition = position;
	    } else {
	        mLastPosition = -1;
	    }
	    notifyDataSetChanged();
	}
}



ListViewTestActivity:
package cn.demo;


import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ListView;

public class ListViewTestActivity extends Activity implements OnItemClickListener{
	private ListView mListView;
	private ListAdapter mAdapter;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        mListView = (ListView)findViewById(R.id.list);
        mAdapter = new  ListAdapter(this);
        mListView.setAdapter(mAdapter);
        mListView.setOnItemClickListener(this);
    }
    
	@Override
	public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
		mAdapter.changeImageVisable(position);
	}
}
分享到:
评论

相关推荐

    listview item 选择问题

    ListView的item选择问题是一个常见的编程挑战,涉及到用户交互、数据绑定和状态管理等多个方面。以下将详细阐述ListView的item选择机制及其相关知识点。 1. **ListView的Item点击事件处理** - 在ListView中,我们...

    关于listview item重用导致图片重复加载 图片重新请求

    然而,在实现ListView时,由于其内部机制,可能会出现一个问题,即ListView中的item(列表项)重用导致图片重复加载,这不仅会消耗不必要的网络资源,还可能影响用户体验。本文将深入探讨这个问题,并提供解决方案。...

    listview item上面包含多个edittext和一个CheckBox的方案

    然而,当ListView的Item包含多个EditText和一个CheckBox时,会面临一些特定的挑战。这个“listview item上面包含多个edittext和一个CheckBox的方案”正是为了解决这些问题而设计的。以下是关于这个主题的详细知识点...

    ListView默认Item选中状态

    ListView的默认行为是不设置任何项为选中状态,但有时我们希望在应用启动时,第一个Item能自动呈现出选中效果,以引导用户或者突出初始焦点。本教程将深入讲解如何实现ListView的第一个Item的默认选中状态。 首先,...

    ListView选中item颜色改变

    在这个布局文件中,可以设置一个背景颜色,例如使用`android:background="@drawable/list_item_selector"`,这里`list_item_selector`是一个颜色选择器资源。 2. **创建颜色选择器资源** 在res/drawable目录下创建...

    android ListView Item展开效果

    ExpandableListView是ListView的一个扩展,它不仅支持普通的单行显示,还能处理分组(Group)和子项(Child)的概念,允许用户展开或折叠特定的分组来显示或隐藏其子项。 要实现这个功能,首先我们需要创建两个数据...

    ListView动态添加、移除item

    本篇主要探讨如何动态地添加和移除ListView中的item,以实现一个流畅的用户体验。 一、ListView的基本使用 1. XML布局:在布局文件中创建ListView,并为其指定id,例如`android:id="@+id/list_view"`。 2. 数据源:...

    ListView像左滑动Item显示删除按钮

    首先,我们需要一个自定义的ListView,这通常通过继承ListView类并重写其onTouchEvent()方法来实现。在这个方法中,我们可以监听用户的滑动操作。使用MotionEvent的ACTION_DOWN、ACTION_MOVE和ACTION_UP事件来判断...

    listview中改变item背景颜色

    首先,需要在布局文件中为ListView的Item定义一个XML布局,然后在Adapter中获取并修改这个视图的背景。以下是一个简单的示例: ```xml &lt;!-- item_background.xml --&gt; android:layout_width="match_parent" ...

    android listview item 拖动排序

    `DragSortListView`是一个开源的Android库,它扩展了原生的ListView,增加了拖放排序的能力。这个库允许用户通过手势拖动ListView中的item,以改变它们的顺序,从而提供了一种直观且用户友好的交互体验。 首先,...

    Android 为ListView每个Item上面的按钮添加事件

    在这个例子中,`item_layout.xml`是每个Item的布局文件,包含一个TextView(id为`text_view`)和一个Button(id为`button`)。在getView()方法中,我们首先检查convertView是否为空,如果为空则创建新的视图,然后...

    Android中ListView包含多个Item

    本篇将深入讲解如何在Android中创建一个ListView,并实现它包含多个不同类型的Item。 1. **ListView基本结构** ListView由一系列的View(Item)组成,每个View代表数据集中的一个条目。这些Item通过Adapter进行...

    android listview item背景色点击效果实例

    在Android中,ListView的每个项(item)都是一个View或ViewGroup,通常我们通过自定义布局文件来设计每个item的显示样式。为了实现点击效果,我们可以使用两种主要方法: 1. **自定义Adapter**: 在自定义的...

    listView item和其中的Button强焦点问题

    1. **自定义Adapter**:创建一个自定义的Adapter,重写`getView()`方法,在这里设置每个item的焦点行为。确保当item获取焦点时,其内部的Button也能正确获取焦点。 2. **设置Button的焦点属性**:在Button的XML布局...

    ListView多选择和item扩展

    博客http://blog.csdn.net/u012925323/article/details/49444153实现了ListView item滑出和扩展效果。ListView item点击时候动态地扩展相应的View视图,有利于美观和节约屏幕空间。

    ListView中添加CheckBox

    2、选择其中的checkbox,当滚动ListView的时候,会出现一些Checkbox选择错位的现象, 原因:为记住Checkbox的选择状态 解决方案:当选择Checkbox的时候,记下其状态,然后在getView方法中进行设置

    ListView实现不同的item

    当需要在一个ListView中显示不同风格的item时,这通常涉及到自定义Adapter和ViewHolder模式的应用。本篇将详细讲解如何实现这一功能。 首先,我们需要了解ListView的工作原理。ListView通过Adapter来与数据源进行...

    Android listview自动换行

    然而,当ListView的子项(item)宽度超过屏幕宽度时,如何实现自动换行就成了一个需要解决的问题。在本篇中,我们将深入探讨如何在Android中为ListView实现自动换行的功能。 首先,我们需要理解ListView的工作原理...

    listview 滑动删除Item

    1. **自定义ViewGroup**: 为ListView的每个Item创建一个自定义的ViewGroup,例如叫做SwipeableRow。这个ViewGroup将包含实际显示内容的子View以及用来做滑动手势的额外View。我们可以使用FrameLayout或LinearLayout...

Global site tag (gtag.js) - Google Analytics