ListView自定义布局以及相关操作
2016-08-30 15:50
344 查看
1.实现自定义布局的ListView
(1) 继承BaseAdapter,重写适配器类
(2) ListView自定义的item布局 note_item.xml
(3) ListView所对应的实体类 实现了Serializable,以便对象传输
(4) 收集数据 这里的数据是从数据库中取的
(5) 为ListView添加适配器
2.为ListView的item设置点击事件和长按事件
(1) 点击事件
(2) 长按事件,实现对应的item的删除。
3.如果将ListView嵌套在ScrollView中使用的时候,需要重写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滚动 } }
相关文章推荐
- ExpandableListView的自定义布局以及注意事项
- 数据存储和布局相关以及ListView
- listview的相关操作
- Adobe AIR迷你教程 — 使用自定义窗口以及对窗口的移动,缩放,关闭操作
- ListView自定义相关
- ListView的Adapter使用(绑定数据) 之 自定义每一项的布局去绑定数据(一)
- 二叉排序树的建立以及相关操作 C语言
- C# Excel导入导出以及其他相关操作
- 有向图的十字链表存储以及相关操作
- ListView 自定义item布局 android.widget.LinearLayout$LayoutParams
- android ListView布局之三(使用自定义的Adapter绑定数据,通过contextView.setTag绑定数据)有按钮的ListView
- c# ListView 虚拟模式 相关操作
- 循环链表以及相关操作(VB实现)
- IE7 zoom属性相关的布局问题 以及 暴力调试
- 字符串以及内存操作相关函数
- android 自定义adapter extends BaseAdapter,做有自己布局的listView
- 使用自定义窗口以及对窗口的移动,缩放,关闭操作
- Adobe AIR迷你教程 -- 使用自定义窗口以及对窗口的移动,缩放,关闭操作
- android中,用SimpleAdapter创建有自己布局的listView,以及listView的修改更新notifyDataSetChanged()的使用。
- Adobe AIR迷你教程 -- 使用自定义窗口以及对窗口的移动,缩放,关闭操作