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

来源:互联网 发布:java double向上取整 编辑:程序博客网 时间:2024/06/05 04:42

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滚动    }}
0 0
原创粉丝点击