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(适配器和布局)

  • 2016年02月18日 13:51
  • 1.39MB
  • 下载

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

listview的数据填充有三种方法,这里我就

Android -- 自定义实现横竖双向滚动的列表(ListView)布局

终于忙完手头上的工作了,难得有时间再唠叨一篇博客。在刚刚处理完的项目需求中,有一个小需求是客户要求查询出的所有数据一屏显示,如果显示不全,要做成可以左右滑动查看的形式(PS:原来的布局仅仅是一个Lis...

26、使用SimpleAdapter创建ListView和自定义Toast布局显示

在activity_main.xml文件中(显示的整个Listview)
  • wo_ha
  • wo_ha
  • 2016年05月11日 10:57
  • 766

【安卓-自定义布局】安卓App开发思路 一步一个脚印(十三)关于ListView的优化总结

关于ListView的优化总结 ListView在一般场景中,难免需要实现自定义的适配器,适配器中的getView方法方便灵活的可以按照我们的想法进行自定义。 值得一提的...

Android ListView自定义布局

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

自定义listview的布局

一、自定义listview的布局,首先是布局文件mylist.xml: http://schemas.android.com/apk/res/android"     android:layo...

ListView 自定义item布局 android.widget.LinearLayout$LayoutParams

05-09 10:51:21.522: ERROR/AndroidRuntime(4425): java.lang.ClassCastException: android.widget.LinearL...

Android学习ListView自定义布局,适配器BaseAdapter

关于BaseAdapter的学习,看了下别人的博客,自己写了个demo,觉得这样学习效率会高些。 一:先改写activity_main.xml:           xmlns:tools=...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:ListView自定义布局以及相关操作
举报原因:
原因补充:

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