关于ListView 条目点击混乱的问题

来源:互联网 发布:电力交易中心 知乎 编辑:程序博客网 时间:2024/06/10 16:57


一个比较简单的方法就是给数据源的实体类里边加一个属性。代码:

Activity 里边

public class MainActivity extends Activity {    ListView mListView;    List<ItemDao>list;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        mListView = (ListView) findViewById(R.id.mListView);        list=new ArrayList<>();        for (int i=0;i<100;i++){//list添加100条数据            ItemDao dao = new ItemDao();            list.add(dao);        }        MyAdapter adapter = new MyAdapter(this);        adapter.setList(list);//赋值给适配器        mListView.setAdapter(adapter);    }}
实体类,只有一个属性

public class ItemDao {    public boolean isClicked() {        return isClicked;    }    public void setIsClicked(boolean isClicked) {        this.isClicked = isClicked;    }    boolean isClicked;}
适配器

public class MyAdapter extends BaseAdapter {    public MyAdapter(Context context) {        this.context = context;    }    public void setList(List<ItemDao> list) {        this.list = list;    }    List<ItemDao> list;    Context context;    @Override    public int getCount() {        return list.size();    }    @Override    public Object getItem(int position) {        return list.get(position);    }    @Override    public long getItemId(int position) {        return position;    }    
 @Override    //这个方法说一下,当listView滚过一屏幕时就会重新调用getView()方法    public View getView(int position, View convertView, ViewGroup parent) {        ViewHolder holder; // holder,在手机性能比较差的时候快了不是一点半点                if (convertView == null) {            convertView = LayoutInflater.from(context).inflate(R.layout.list_item_view, null);            Button mButton = (Button) convertView.findViewById(R.id.mButton);            holder = new ViewHolder();            holder.button = mButton;            convertView.setTag(holder);        } else {            holder = (ViewHolder) convertView.getTag();        }        //这个地方很关键,不能在onClick里边写,重新调用getView的话,实例化一遍view,不走onclikeonclike设置的属性无效        // 通过isCliked属性判断        if (list.get(position).isClicked) {            if (position < 10) {                holder.button.setText("position :" + "0" + position + " 已赞");            } else {                holder.button.setText("position :" + position + " 已赞");            }            holder.button.setBackgroundColor(context.getResources().getColor(R.color.clicked));        } else {            if (position < 10) {                holder.button.setText("position :" + "0" + position + " 点赞");            } else {                holder.button.setText("position :" + position + " 点赞");            }            holder.button.setBackgroundColor(context.getResources().getColor(R.color.unClicked));        }        holder.button.setOnClickListener(new MyListener(position));        return convertView;    }    class ViewHolder {        Button button;    }    class MyListener implements View.OnClickListener {        public MyListener(int i) {            this.i = i;        }        int i;        @Override        public void onClick(View v) {            if (list.get(i).isClicked) {                list.get(i).setIsClicked(false);            } else {                list.get(i).setIsClicked(true);            }            notifyDataSetChanged();//刷新适配器,重新调用getview,不然点击不能改变view               }    }}
1 0