关于adapter里getview的按钮点击,使控件隐藏显示的问题
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于adapter里getview的按钮点击,使控件隐藏显示的问题相关的知识,希望对你有一定的参考价值。
我点击某个item上的按钮,结果改变的是其他item的控件,怎么改变当前item里的控件隐藏和显示呢
参考技术A 给Listview里面Item里的每一个控件怎么设定点击事件adpter用的是继承的baseadapter,给整个listview上的Item设置点击事件就用listview.setOnItemClickListener(listener)就可以,下面介绍如果给Item里面某一控件设置点击事件。方法是重写 Adapter。
ListView工作原理(针对下面代码):
1. 给ListView设置数据适配器,此chǔ程序是自己重写的Adapter,创建Adapter 的时候主要做下面的工作:
(1)把ListView需要显示的数据传给Adapter
(2)把ListView显示Item的界面传给Adapter
(3)把上下文对象传给Adapter,主要用来得到LayoutInflater对象来得到Item界面
2. 给ListView设置当点击Item对象的时候执行的操作,此chǔ要实现给Item中的各项也就是该程序的三个TextView设置监听器,也就是调用Adapter中的getView函数。
3. getView函数实现的操作是:第一要将Item要显示的数据显示,然后设置监听器,为监听器设置操作。
代码如下:
ListView中Item的布局文件
activity_my_goods_listview.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal" >
<TextView
android:id = "@+id/goodBarcode"
android:layout_width="150dip"
android:layout_height="wrap_content"
android:textColor="#000"
android:textSize="16sp"
android:paddingTop="10dip"
android:clickable="true"//设置可点击
/>
<TextView
android:id="@+id/goodName"
android:layout_width="150dip"
android:layout_height="wrap_content"
android:textColor="#000"
android:textSize="16sp"
android:paddingTop="10dip"
android:clickable="true"
/>
<TextView
android:id="@+id/goodProvider"
android:layout_width="150dip"
android:layout_height="wrap_content"
android:textColor="#000"
android:textSize="16sp"
android:paddingTop="10dip"
android:clickable="true"
/>
</LinearLayout>
ListView控件所在的布局文件
activity_my_goods.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="#ffffffff"
android:gravity="center"
android:orientation="vertical">
<LinearLayout //标题
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:paddingLeft="15px"
android:layout_marginLeft="5dip"
android:layout_marginTop="93dip">
<TextView
android:layout_width="150dip"
android:layout_height="wrap_content"
android:textColor="#000"
android:textSize="16sp"
android:text="商品条码"
android:paddingTop="10dip"
/>
<TextView
android:layout_width="150dip"
android:layout_height="wrap_content"
android:textColor="#000"
android:textSize="16sp"
android:text="商品名称"
android:paddingTop="10dip"
/>
<TextView
android:layout_width="150dip"
android:layout_height="wrap_content"
android:textColor="#000"
android:textSize="16sp"
android:text="供应商"
android:paddingTop="10dip"
/>
</LinearLayout>
<ScrollView
android:id="@+id/feedbacklayout01"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_marginTop="103dip"
android:paddingTop="20.0dip" >
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:paddingLeft="20px">
<ListView
android:id="@+id/goodsinfoListView"
android:layout_width="wrap_content"
android:layout_height="354dp"
android:layout_marginBottom="5.0dip"
android:layout_marginRight="5.0dip"
android:textColor="#000"
android:textSize="16.0dip">
</ListView>
</ScrollView>
</RelativeLayout>
Adapter的getView
http://blog.csdn.net/yelbosh/article/details/7831812
BaseAdapter就Android应用程序中经常用到的基础数据适配器,它的主要用途是将一组数据传到像ListView、Spinner、Gallery及GridView等UI显示组件,它是继承自接口类Adapter,我们经常使用的ListView 的adapter,即SimpleAdapter,是继承自BaseAdapter的,BaseAdapter是一个基类,没有实现绑定数据的功能,SimpleAdapter实现了基本控件的绑定,如TextView,Button,ImageView).已经为我们实现好了数据优化工作,这些适配器使用相同组件动态绑定数据的方式进行优化。为什么需要优化呢?因为如果我们有上亿个项目要显示怎么办?为每个项目创建一个新视图?这不可能,因为内存有限制。实际上Android为你缓存了视图。Android中有个叫做Recycler的构件,下图是他的工作原理:
如果你有10亿个项目(item),其中只有可见的项目存在内存中,其他的在Recycler中。其实我的理解Recyler就是一个队列,用来存储不在屏幕范围内的item,如果item滚出屏幕范围,那么就入队,这里的滚出是完全滚出,即边界等也要完全滚出。如果新的item要滚进来,那么android系统的framework就会查看Recyler是否含有可以重复使用的iew,如果有那么就重新设置该iew 的数据源,然后显示,即出队。那么这么多的item其实只需要占用一定空间的内存,这个内存大小是多少呢?我的感觉是手机屏幕所包含的item的个数,再加上1,然后乘以每个item占用的内存。但是最后我发现是加上2.可能是为了使得缓存更大吧。。。。但是为什么加上2,大家应该理解,如果你不理解,那你就把滚动list的过程好好想一想。那个队列无非就是一个缓存罢了,因为我们的目的是通过那个缓存来重复使用那些已经创建的iew。
使用BaseAdapter的话需要重载四个方法,这些方法分别是getCount,getItem,getItemId,最后一个最重要的是getView,getView函数为什么重要呢?因为它是用来刷新它所在的ListView的。它在什么时候调用的呢?就是在每一次item从屏幕外滑进屏幕内的时候,或者程序刚开始的时候创建第一屏item的时候。看getView的api:
public abstract View getView (int position, View convertView, ViewGroup parent)
Get a View that displays the data at the specified position in the data set. You can either create a View manually or inflate it from an XML layout file. When the View is inflated, the parent View (GridView, ListView...) will apply default layout parameters unless you use inflate(int, android.view.ViewGroup, boolean)
to specify a root view and to prevent attachment to the root.
Parameters
position | The position of the item within the adapter‘s data set of the item whose view we want. |
---|---|
convertView | The old view to reuse, if possible. Note: You should check that this view is non-null and of an appropriate type before using. If it is not possible to convert this view to display the correct data, this method can create a new view. Heterogeneous lists can specify their number of view types, so that this View is always of the right type (see getViewTypeCount() and getItemViewType(int) ). |
parent | The parent that this view will eventually be attached to |
position是指当前dataset的位置,通过getCount和getItem来使用。如果list向下滑动的话那么就是最低端的item的位置,如果是向上滑动的话那就是最上端的item的位置。conert是指可以重用的视图,即刚刚出队的视图。parent应该就是list。
为了让大家更好的理解这个函数,写了一个程序,请看:
public class MainActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ListView lv = (ListView)findViewById(R.id.listview);
ArrayList<String> listdata = new ArrayList<String>();
for(int i=0;i<400;i++){
listdata.add("Item" + i);
}
lv.setAdapter(new MyAdapter(this, listdata));
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
public class MyAdapter extends BaseAdapter{
private ArrayList<String> listdata;
private Context context;
public MyAdapter(Context context,ArrayList<String> listdata){
this.context = context;
this.listdata = listdata;
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return listdata.size();
}
@Override
public Object getItem(int arg0) {
// TODO Auto-generated method stub
return listdata.get(arg0);
}
@Override
public long getItemId(int arg0) {
// TODO Auto-generated method stub
return arg0;
}
@Override
public View getView(int arg0, View arg1, ViewGroup arg2) {
// TODO Auto-generated method stub
Log.i("position",arg0+"");
TextView tmView;
String temstr;
if(arg1 == null){
TextView tm = new TextView(context);
tmView = tm;
tmView.setTag("old" + arg0);
tmView.setText(listdata.get(arg0));
}else {
tmView = (TextView)arg1;
tmView.setText(listdata.get(arg0) + "\t" + arg1.getTag());
}
return tmView;
}
}
}
从log中大家好好观察相关的输出结果,便可以将其理解
以上是关于关于adapter里getview的按钮点击,使控件隐藏显示的问题的主要内容,如果未能解决你的问题,请参考以下文章
通过在 Adapter 的 getView() 中单击 imageView 更改图像
android 如何在listview中点击当前Item中的按钮删除该item
自定义 Adapter 的 getView() 中的空指针异常