ListView自定义布局以及相关操作

原创 2016年08月30日 15:50:59

1.实现自定义布局的ListView

(1) 继承BaseAdapter,重写适配器类

public class ListViewAdapter extends BaseAdapter{
    private List<Note> data;
    private LayoutInflater layoutInflater;
    private Context context;
    public ListViewAdapter(Context context,List<Note> data){
        this.context=context;
        this.data=data;
        this.layoutInflater=LayoutInflater.from(context);
    }
    /**
     * 组件集合,对应list.xml中的控件
     * @author Administrator
     */
    public final class NoteItem{
        public TextView tvTitle;
        public TextView tvDate;
        public TextView tvContent;
}
    @Override
    public int getCount() {
        return data.size();
    }
    /**
     * 获得某一位置的数据
     */
    @Override
    public Object getItem(int position) {
        return data.get(position);
    }
    /**
     * 获得唯一标识
     */
    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        NoteItem noteItem=null;
        if(convertView==null){
            noteItem=new NoteItem();
            //获得组件,实例化组件
            convertView=layoutInflater.inflate(R.layout.note_item, null);
            noteItem.tvTitle=(TextView)convertView.findViewById(R.id.tv_title);
            noteItem.tvDate=(TextView)convertView.findViewById(R.id.tv_date);
            noteItem.tvContent=(TextView)convertView.findViewById(R.id.tv_content);
            convertView.setTag(noteItem);
        }else{
            noteItem=(NoteItem) convertView.getTag();
        }
        //绑定数据
        noteItem.tvTitle.setText(data.get(position).getTitle().toString());
        noteItem.tvDate.setText(data.get(position).getDate().toString());
        noteItem.tvContent.setText(data.get(position).getContent().toString());
        return convertView;
    }
}

(2) ListView自定义的item布局 note_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="wrap_content"
    android:background="#F1F5F8"
    android:orientation="vertical"
    android:padding="20dp">

    <TextView
        android:id="@+id/tv_title"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="标题"
        android:singleLine="true"
        android:maxEms="8"
        android:ellipsize="end"/>
    <TextView
        android:id="@+id/tv_date"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="2016"
        android:singleLine="true"
        />
    <TextView
        android:id="@+id/tv_content"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="具体内容"
        android:singleLine="true"
        android:maxEms="8"
        android:ellipsize="end"/>



</LinearLayout>

(3) ListView所对应的实体类 实现了Serializable,以便对象传输

public class Note implements Serializable{

    private String title;
    private String content;
    private String date;



    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }



    public String getContent() {
        return content;
    }

    public void setContent(String content) {
        this.content = content;
    }

    public String getDate()
    {
        return date;
    }

    public void setDate(String date) {
        this.date = date;
    }
}

(4) 收集数据 这里的数据是从数据库中取的

private List<Note> noteList=new ArrayList<>();

 Cursor c = db.query("notes",null,null,null,null,null,null);//查询并获得游标
        while(c.moveToNext()){//判断游标是否为空
                String date = c.getString(c.getColumnIndex("date"));
                String title = c.getString(c.getColumnIndex("name"));
                String content=c.getString(c.getColumnIndex("content"));
                note=new Note();
                note.setTitle(title);
                note.setDate(date);
                note.setContent(content);
                noteList.add(note);

        }

(5) 为ListView添加适配器

 listViewAdapter=new ListViewAdapter(getActivity(),noteList);
 lvNotes.setAdapter(listViewAdapter);

2.为ListView的item设置点击事件和长按事件

(1) 点击事件

//Item点击事件 Intent跳转实现同时实现对象传输
        lvNotes.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                Note note=noteList.get(position);
                Intent intent1=new Intent(getActivity(), FactNoteActivity.class);
                Bundle bundle=new Bundle();
                bundle.putSerializable("note", note);
                intent1.putExtras(bundle);
                startActivity(intent1);
            }
        });

(2) 长按事件,实现对应的item的删除。

//Item长按事件 这里用到了AlertDialog的自定义布局实现
        lvNotes.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
            @Override
            public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {

                final int index=position;
                final AlertDialog dialog = new AlertDialog.Builder(mContext).create();
                dialog.show();
                dialog.getWindow().setContentView(R.layout.alert_dialog);
                dialog.getWindow().findViewById(R.id.tv_ok).setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        dialog.dismiss();
                        Toast.makeText(getActivity(),"删除成功",Toast.LENGTH_LONG).show();
                        String title = noteList.get(index).getTitle();
                        String date=noteList.get(index).getDate();

                        //删掉长按的item
                        noteList.remove(index);
                        //动态更新listview 但是此时并未 从数据库删除数据
                        listViewAdapter.notifyDataSetChanged();


                        String whereClause = "name=? and date=?";//删除的条件
                        String whereArgs[] ={title,date};//删除的条件参数
                        db.delete("notes",whereClause,whereArgs);//执行删除
                    }
                });
                dialog.getWindow().findViewById(R.id.tv_cancel).setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        dialog.dismiss();
                    }
                });
                //返回true能屏蔽点击事件的干扰
                return true; 
            }
        });

3.如果将ListView嵌套在ScrollView中使用的时候,需要重写ListView,以解决两者的滑动冲突问题。

import android.content.Context;
import android.util.AttributeSet;
import android.widget.ListView;


public class NoScrollListView extends ListView{
    public NoScrollListView(Context context) {
        super(context);
    }

    public NoScrollListView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public NoScrollListView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2,
                MeasureSpec.AT_MOST);
        super.onMeasure(widthMeasureSpec, expandSpec);//这是让ListView 不滚动 确定高度 让scrollView滚动
    }
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

LIstView自定义布局

这是我的第一篇在CSDN博客写的内容。是关于在ListView中如何使用自定义的布局的问题。(本笔脑瓜不太好用,所以花了两天的时间去大概的弄明白了ListView的工作原理)我做了一个简单的聊天界面工...
  • bigname22
  • bigname22
  • 2016年05月13日 01:37
  • 655

ListView的子item自定义布局跟数据的填充

listview的数据填充有三种方法,这里我就
  • u010606061
  • u010606061
  • 2014年10月31日 11:37
  • 1022

listview自定义布局

在很多时候系统的listview很难满足我们的需要,因为布局比较复杂,所以这时候肯定需要一个布局文件来满足自己需要。这个东西相信大家在网上能搜索一大摞的资料,只是可能感觉不是很适合小白看吧,毕竟有很多...
  • u014128885
  • u014128885
  • 2015年04月20日 21:08
  • 347

android之ListView自定义布局

前面总结了如何应用android自带的布局到ListView中去,现在如果想让自己的ListView更生动,只需要将自己定义的布局应用到ListView中,在布局中添加一些生动的元素,比如,图标。 ...
  • ma12an
  • ma12an
  • 2012年07月21日 19:57
  • 13950

自定义ListView实现上拉分页加载更多数据

效果图: 布局文件 /LoadListView/res/layout/activity_main.xml
  • gly742279097
  • gly742279097
  • 2015年04月13日 21:55
  • 609

Android ListView自定义布局

本人,刚刚入行android,今天碰到ListView自定义布局的问题,参考了些网上资料,终于实现了这一功能,别喷我,小弟是新手 我认为最主要的是适配器的编写,在这里我们先写个LIstview的布局文...
  • u011930471
  • u011930471
  • 2014年01月03日 17:45
  • 508

自定义ListView子项目布局

之前学习的ListView都是采用android系统自带的子项目布局,比如android.R.layout.simple_list_item_1(单行文字),以及android.R.layout.si...
  • qq_20916555
  • qq_20916555
  • 2015年10月28日 18:07
  • 5606

ListView的适配(使用自定义ArrayAdapter)

ListView在平时开发中使用的最广泛,应用也是最多的,而使用系统的适配器并不能满足我们多样化的要求,因此本文就自定义适配器展开,下面直接附上我已经测试通过的代码: MainActivity.ja...
  • liuyucui100
  • liuyucui100
  • 2016年03月03日 14:57
  • 2266

请说出与线程同步以及线程调度相关的方法

-wait():使一个线程处于等待(阻塞)状态,并且释放所持有的对象的锁; -sleep():使一个正在运行的线程处于睡眠状态,是一个静态方法,调用此方法要处理InterruptedExce...
  • u014136713
  • u014136713
  • 2016年05月16日 18:36
  • 2182

关于ListView的总结

关于ListView网上也有许多的介绍,我选了一些结合到了一起,仅供参考。 在android开发中ListView是比较常用的组件  官方API地址:http://www.android-doc....
  • qian_xiao_lj
  • qian_xiao_lj
  • 2016年04月27日 15:14
  • 3072
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:ListView自定义布局以及相关操作
举报原因:
原因补充:

(最多只允许输入30个字)