您的位置:首页 > 其它

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

2016-08-30 15:50 344 查看
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滚动
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: