ListView使用setTag与getTag控件之间关联

来源:互联网 发布:搜狗 数据挖掘 面试 编辑:程序博客网 时间:2024/05/06 01:43

ListView中点击一行,修改该行内部的ImageView的图片显示,不管点击哪一行修改的是最后一行的图片显示。可以使用setTag将该行布局与ImageView进行关联,通过getTag获取该行关联的ImageView实现更改点击行对应的ImageView。

public class MainActivity extends AppCompatActivity {    private List<String> titleNames = new ArrayList<>();    private ListView lv_content;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        initTitleNames();        lv_content = (ListView)findViewById(R.id.lv_content);        MyAdapter adapter = new MyAdapter();        lv_content.setAdapter(adapter);    }    private void initTitleNames() {        titleNames.add("a");        titleNames.add("b");        titleNames.add("c");        titleNames.add("d");        titleNames.add("e");        titleNames.add("f");    }    class MyAdapter extends BaseAdapter {        private ViewHolder viewHolder;        @Override        public int getCount() {            return titleNames.size();        }        @Override        public Object getItem(int position) {            return titleNames.get(position);        }        @Override        public long getItemId(int position) {            return position;        }        @Override        public View getView(final int position, View convertView, ViewGroup parent) {            if(convertView == null){                convertView = View.inflate(MainActivity.this,R.layout.layout_item,null);                viewHolder = new ViewHolder();                viewHolder.rl_content = (RelativeLayout)convertView.findViewById(R.id.rl_content);                viewHolder.tv_name =  (TextView)convertView.findViewById(R.id.tv_name);                viewHolder.iv_setting = (ImageView)convertView.findViewById(R.id.iv_setting);               <span style="color:#ff0000;"> <strong>viewHolder.rl_content.setTag(viewHolder.iv_setting);</strong></span>                convertView.setTag(viewHolder);            }else{                viewHolder = (ViewHolder)convertView.getTag();            }            viewHolder.rl_content.setOnClickListener(new View.OnClickListener() {                @Override                public void onClick(View v) {                    //更改选择条目id为iv_setting对应控件的图标                    <strong><span style="color:#ff0000;">((ImageView)v.getTag()).setImageResource(R.mipmap.setting);</span></strong>                }            });            viewHolder.tv_name.setText(titleNames.get(position));            //默认当前身份处于选中状态            return convertView;        }        class ViewHolder{            public RelativeLayout rl_content;            public TextView tv_name;            public ImageView iv_setting;        }    }}
布局文件layout_item.xml,如果这样写,还是会出现如下图所示的问题。

<pre style="font-family: 宋体; font-size: 9.8pt; background-color: rgb(255, 255, 255);"><pre name="code" class="html"><?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:id="@+id/rl_content"    android:layout_width="match_parent"    android:layout_height="wrap_content"    android:padding="5dp"    android:background="#eeeeee">    <TextView        android:id="@+id/tv_name"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_centerVertical="true"        android:text="Hello World!" />    <ImageView        android:id="@+id/iv_setting"        android:layout_width="40dp"        android:layout_height="40dp"        android:src="@mipmap/ic_launcher"        android:layout_alignParentRight="true"/></RelativeLayout>

错误提示


<pre name="code" class="html" style="font-size: 13.0667px;">id是rl_content的布局不能是父布局,需要添加一个父布局。因为<span style="font-size: 13.0667px; font-family: Arial, Helvetica, sans-serif;">convertView就是rl_content,convertView既设置了Tag为</span><span style="font-family: Arial, Helvetica, sans-serif; font-size: 13.0667px;">viewHolder,又设置了Tag为ImageView,所以转化出错。</span>
<span style="font-family: Arial, Helvetica, sans-serif; font-size: 13.0667px;"></span><pre name="code" class="java"><?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="wrap_content"    android:padding="5dp"    android:background="#eeeeee">    <RelativeLayout        android:id="@+id/rl_content"        android:layout_width="match_parent"        android:layout_height="wrap_content">        <TextView            android:id="@+id/tv_name"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:layout_centerVertical="true"            android:text="Hello World!" />        <ImageView            android:id="@+id/iv_setting"            android:layout_width="40dp"            android:layout_height="40dp"            android:src="@mipmap/ic_launcher"            android:layout_alignParentRight="true"/>    </RelativeLayout></RelativeLayout>

0 0