listview 修改当前item的子控件的属性
功能需求实现:当点击listview的某个item时,弹出一个弹框,点击确定按钮,改变当前item里的子控件属性(本篇就这个需求写了个小demo,实现隐藏当前item里的图片,其它item图片正常显示)
首先先给出item的布局文件,很简单,就一个imageView和两个TextView。布局文件名为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="match_parent"
android:descendantFocusability="blocksDescendants"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<ImageView
android:id="@+id/icon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingLeft="5dp"
android:focusable="false"
android:clickable="true"
android:src="@drawable/ic_launcher"
/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical" >
<TextView
android:id="@+id/tv_1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="test1"
android:textSize="20dp" />
<TextView
android:id="@+id/tv_2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="test2"
android:textSize="20dp"/>
</LinearLayout>
</LinearLayout>
</LinearLayout>
接着给出主界面的布局文件,activity_main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.wjb.uiutil.listview.MainActivity" >
<ListView
android:id="@+id/mylist"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
</ListView>
</RelativeLayout>
主界面的xml就一个listview也就是我们今天的重点,先来试下适配器Adapter。直接给出代码
package com.wjb.uiutil.listview;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import com.example.uiutil.R;
import android.R.integer;
import android.content.Context;
import android.graphics.drawable.Drawable;
import android.media.Image;
import android.telephony.IccOpenLogicalChannelResponse;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
public class ListAdapter extends BaseAdapter {
private LayoutInflater mInflater;
private ArrayList<Student> mlist;
private Context mcontext;
private ImageView mIcon ;
private static int[] flag= new int[1024];
private static HashMap<String, ImageView> imaMap;
public ListAdapter(Context context,ArrayList<Student> list){
super();
mInflater = LayoutInflater.from(context);
mcontext = context;
mlist = list;
imaMap = new HashMap<String, ImageView>();
}
@Override
public int getCount(){
// TODO Auto-generated method stub
return mlist.size();
}
@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return mlist.get(position);
}
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
convertView = mInflater.inflate(R.layout.list_item, null);
}
mIcon = Tools.ViewHolder.get(convertView, R.id.icon);
mIcon.setImageResource(mlist.get(position).getmId());
TextView name = Tools.ViewHolder.get(convertView, R.id.tv_1);
TextView age = Tools.ViewHolder.get(convertView, R.id.tv_2);
name.setText(mlist.get(position).getmName());
age.setText(mlist.get(position).getmAge());
imaMap.put(""+position, mIcon);
if (flag[position]==0) {
mIcon.setVisibility(View.VISIBLE);
}else {
mIcon.setVisibility(View.GONE);
}
return convertView;
}
public static void setImg(int position){
try {
imaMap.get(""+position).setVisibility(View.GONE);
flag[position]=1;
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
这里封装了一个ViewHolder,代码如下
package com.wjb.uiutil.listview;
import android.util.SparseArray;
import android.view.View;
public class Tools {
static class ViewHolder {
public static <T extends View> T get(View view, int id) {
SparseArray<View> viewHolder = (SparseArray<View>) view.getTag();
if (viewHolder == null) {
viewHolder = new SparseArray<View>();
view.setTag(viewHolder);
}
View childView = viewHolder.get(id);
if (childView == null){
childView = view.findViewById(id);
viewHolder.put(id, childView);
}
return (T) childView;
}
}
}
这里的ListAdapter继承baseAdapter,为了实现我们上述说的功能,我们这边先定义了一个hasHmap容器,来存储每个item里iamgeView控件。(记得在使用的时候,要new一个hasHmap实例出来哦,很多小伙伴这边会忘了!不然会报错。
imaMap = new HashMap<String, ImageView>();
)。
然后我们在getView的方法里。我们把初始化好的imageView添加到map里,imaMap.put(""+position, mIcon);
。这里用position作为key。iamgeView作为值。
这里已经可以实现隐藏图片了,但是因为考虑到listView复用的问题。我们这边设置了一个标志位flag,当我们隐藏图片时,就把当前的item的标志位置为1,flag[position]=1;
。然后在getView方法里加上如下代码。这样就可以解决复用造成的当下拉时,新出现的item的图片也被隐藏了.
if (flag[position]==0) {
mIcon.setVisibility(View.VISIBLE);
}else {
mIcon.setVisibility(View.GONE);
}
最后送上mainActivity 的代码。
package com.wjb.uiutil.listview;
import java.util.ArrayList;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ListView;
import com.example.uiutil.R;
import com.hhd.wjb.network.HttpRequestUtil;
public class MainActivity extends Activity {
private ArrayList<Student> list;
private ListView mlist;
private void onCreateView() {
// TODO Auto-generated method stub
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mlist = (ListView) findViewById(R.id.mylist);
list = new ArrayList<Student>();
for (int i = 0; i <40; i++) {
Student mStudent = new Student();
int j = i;
mStudent.setmId(R.drawable.ic_launcher);
mStudent.setmName("学生"+ j +"号");
mStudent.setmAge(j+"岁");
list.add(mStudent);
}
System.out.println("list的大小为:"+list.size());
final ListAdapter mAdapter = new ListAdapter(MainActivity.this, list);
mlist.setAdapter(mAdapter);
mlist.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
final int position, long id) {
AlertDialog.Builder dialog = new AlertDialog.Builder(MainActivity.this);
dialog.setTitle("警告");
dialog.setMessage("你要隐藏当前item的图片吗?");
dialog.setNegativeButton("取消", new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
return;
}
});
dialog.setPositiveButton("确定", new OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
mAdapter.setImg(position);
}
});
dialog.show();
}
});
}
}
一个Studen类
package com.wjb.uiutil.listview;
public class Student {
private String mName = "";
private String mAge = "";
private int mId ;
public Student(String name,String age,int id) {
super();
mName = name;
mAge =age;
mId = id;
}
public Student() {
super();
// TODO Auto-generated constructor stub
}
public String getmName() {
return mName;
}
public void setmName(String mName) {
this.mName = mName;
}
public String getmAge() {
return mAge;
}
public void setmAge(String mAge) {
this.mAge = mAge;
}
public int getmId() {
return mId;
}
public void setmId(int mId) {
this.mId = mId;
}
}
效果图如下
好了,今天就到这里结束了。本人正在研究博客怎么写,目前写得很粗糙,见谅见谅!!!