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>