listview 修改当前item的子控件的属性

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;
    }
}

效果图如下
这里写图片描述这里写图片描述]![这里写图片描述这里写图片描述这里写图片描述

好了,今天就到这里结束了。本人正在研究博客怎么写,目前写得很粗糙,见谅见谅!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值