Android自定义适配器和ListView的点击事件相结合的使用

下边演示一个使用ListView和自定义适配器的案例,点击ListView中的条目会出现一个对话框,进行成绩的修改,修改之后会立即通知适配器进行数据的重新加载,如下:

(1)、用于显示listView的布局文件:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:padding="20dp" >

    <ListView
        android:id="@+id/course_student_manage"
        android:layout_width="match_parent"
        android:layout_height="match_parent" >
    </ListView>
</LinearLayout>

二、用于显示每一天信息的布局文件,就是每一个item选项,需要在适配器中使用到

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="80dp"
    android:padding="8dp" >

    <LinearLayout
        android:id="@+id/linearLayout1"
        android:layout_width="fill_parent"
        android:layout_height="80dp"
        android:orientation="vertical" >

        <LinearLayout
            android:layout_width="wrap_content"
            android:layout_height="40dp" >

            <TextView
                android:layout_width="40dp"
                android:layout_height="40dp"
                android:text="姓名"
                android:textSize="20sp" />

            <View
                android:layout_width="wrap_content"
                android:layout_height="1dp"
                android:layout_weight="1" />

            <TextView
                android:layout_width="40dp"
                android:layout_height="40dp"
                android:text="课程"
                android:textSize="20sp" />

            <View
                android:layout_width="wrap_content"
                android:layout_height="1dp"
                android:layout_weight="1" />

            <TextView
                android:layout_width="40dp"
                android:layout_height="40dp"
                android:text="分数"
                android:textSize="20sp" />
        </LinearLayout>

        <LinearLayout
            android:layout_width="fill_parent"
            android:layout_height="40dp" >

            <TextView
                android:id="@+id/tv_name"
                android:layout_width="80dp"
                android:layout_height="50dp"
                android:text=""
                android:textSize="20sp" />

            <View
                android:layout_width="wrap_content"
                android:layout_height="1dp"
                android:layout_weight="1" />

            <TextView
                android:id="@+id/tv_course"
                android:layout_width="80dp"
                android:layout_height="50dp"
                android:text=""
                android:textSize="20sp" />

            <View
                android:layout_width="wrap_content"
                android:layout_height="1dp"
                android:layout_weight="1" />

            <TextView
                android:id="@+id/tv_score"
                android:layout_width="40dp"
                android:layout_height="40dp"
                android:text=""
                android:textSize="20sp" />
        </LinearLayout>
    </LinearLayout>

</RelativeLayout>

效果如下:

(3)对listview的控制类:这里边有一些加载数据的方法,根据具体的情况修改之就可以

public class ManageStudentScoreActivity extends Activity implements
        OnItemClickListener {

    private List<Course> courseList;
    private ListView course_student_manage;
    private CourseAdapter adapter;

    private EditText update_score;
    private Button btn_ok;

    private String studentName;
    private String courseName;

    private AlertDialog dialog;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.course_studen_manage);

        course_student_manage = (ListView) this
                .findViewById(R.id.course_student_manage);

        // 加载数据
        courseList = loadCourseData();
        if (courseList != null) {
            adapter = new CourseAdapter(this, courseList);
        } else {
            ToastUtil.showToast(this, "没有学生选课信息!");
        }
        course_student_manage.setAdapter(adapter);
        course_student_manage.setOnItemClickListener(this);

    }

    /**
     * 查询所有学生信息
     *
     * @return
     */
    protected List<Course> loadCourseData() {
        CourseInter courseInter = new CourseImpl();
        return courseInter.getCourseDetail();
    }

    /**
     * listview的点击事件
     */
    public void onItemClick(AdapterView<?> adapter, View view, int position,
            long id) {

        //这里就是创建一个弹出的对话框
        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        // 加载布局文件
        LayoutInflater inflater = (LayoutInflater) this.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View dialogView = inflater.inflate(R.layout.dialog_update_score, null);
        update_score = (EditText) dialogView.findViewById(R.id.update_score);
        btn_ok = (Button) dialogView.findViewById(R.id.btn_ok);
        builder.setView(dialogView);
        builder.create();
        dialog = builder.show(); //一定要show

        // 获得每一个item的条目学生姓名 课程姓名 和分数
        View adapterView = view;
        TextView tv_score = (TextView) adapterView.findViewById(R.id.tv_score);
        TextView tv_name = (TextView) adapterView.findViewById(R.id.tv_name);
        TextView tv_course = (TextView) adapterView.findViewById(R.id.tv_course);

        studentName = tv_name.getText().toString();
        courseName = tv_course.getText().toString();

        btn_ok.setOnClickListener(new OnClickListener() {

            public void onClick(View v) {
                String scoreString = update_score.getText().toString();
                float score = Float.parseFloat(scoreString);
                // 更改成绩
                updateCourseDetail(studentName, courseName, score);
            }
        });
        // dialog.dismiss();

    }

    /**
     * 更新学生成绩信息的
     *
     * @param studentName
     * @param courseName
     * @param score
     */
    protected void updateCourseDetail(String studentName, String courseName,
            float score) {
        CourseInter courseInter = new CourseImpl();
        if (courseInter.updateStudentCourse(studentName, courseName, score)) {
            ToastUtil.showToast(ManageStudentScoreActivity.this, "修改成功!");
            //取消弹出的对话框
            dialog.dismiss();
            // 通知适配器数据已经变化
            adapter.notifyDataSetChanged();
        } else {
            ToastUtil.showToast(ManageStudentScoreActivity.this, "修改失败!");
        }
    }
}

(4)自定义适配器如下:为了可以使适配器可以自动刷新,一定要继承的方法

@Override
    public void notifyDataSetChanged() {
        super.notifyDataSetChanged();
    }

具体的适配器代码:

public class CourseAdapter extends BaseAdapter {

    private Context context;
    private List<Course> coursetList;

    public CourseAdapter(Context context, List<Course> coursetList) {
        this.context = context;
        this.coursetList = coursetList;
    }

    public int getCount() {
        return coursetList.size();
    }

    public Object getItem(int position) {
        return coursetList.get(position);
    }

    public long getItemId(int position) {
        return position;
    }

    /**
     * 通知adapter更新数据
     */
    @Override
    public void notifyDataSetChanged() {
        super.notifyDataSetChanged();
    }

    public View getView(int position, View convertView, ViewGroup parent) {

        if (convertView == null) {
            //这里加载的每一个item条目的布局文件
            convertView = LayoutInflater.from(context).inflate(
                    R.layout.student_score_item, null);
        }

        TextView tv_name = (TextView) convertView.findViewById(R.id.tv_name);
        TextView tv_course = (TextView) convertView
                .findViewById(R.id.tv_course);
        TextView tv_score = (TextView) convertView.findViewById(R.id.tv_score);

        // 获得某一个位置的student
        Course course = coursetList.get(position);
        tv_name.setText(course.getStudentName() + "");
        tv_course.setText(course.getCourseName() + "");
        tv_score.setText(course.getCourseSocre() + "");

        return convertView;
    }
}

ok!到此完成。

时间: 2024-12-26 12:15:47

Android自定义适配器和ListView的点击事件相结合的使用的相关文章

ListView使用自定义适配器的情况下实现适配器的控件点击事件执行Activity界面中的方法

如果ListView使用的是自定义的适配器,比如MyArrayAdapter extends ArrayAdapter<String> 那么,如何实现适配器中的点击事件执行activity界面中的方法呢? 实现思路:在自定义适配器MyArrayAdapter 类型中自定义接口和接口方法,然后在activity界面中MyArrayAdapter实例实现这个接口. 较为完整的代码见上文. 1.MyArrayAdapter 关键代码 自定义接口和方法的代码如下: //列表项的单击事件监听接口 pub

【转】Android自定义Adapter的ListView的思路及代码

原文网址:http://www.jb51.net/article/37236.htm Android自定义Adapter的ListView的思路及代码,需要的朋友可以参考一下 在开发中,我们经常使用到ListView这个控件.Android的API也提供了许多创建ListView适配器的快捷方式.例如ArrayAdapter.SimpleAdapter和SimpleCursorAdapter等.但你是否发现,如果采用这些系统自带的适配器,对于事件的响应只能局限在一个行单位.假设一行里面有一个按钮

Android学习---ListView的点击事件,simpleAdapter和arrayadapter的原理和使用 - Hi_Amos

如题,本文将介绍 listview的点击事件,simpleAdapter和arrayadapter的原理和使用. 1.ListView的注册点击事件 //注册点击事件 personListView.setOnItemClickListener(new AdapterView.OnItemClickListener() { /** * * @param parent 当前ListView * @param view 代表当前被点击的条目 * @param position 当前条目的位置 * @p

Android学习---ListView的点击事件,simpleAdapter和arrayadapter,SimpleCursoAdapter的原理和使用

如题,本文将介绍 listview的点击事件,simpleAdapter和arrayadapter的原理和使用. 1.ListView的注册点击事件 //注册点击事件 personListView.setOnItemClickListener(new AdapterView.OnItemClickListener() { /** * * @param parent 当前ListView * @param view 代表当前被点击的条目 * @param position 当前条目的位置 * @p

Android 自定义Adapter 但listview 只显示第一条数据

楼主让这个问题郁闷了一晚上.....在logcat里明明显示adapter的getview方法里的list大于一条数据 ,但posotion却一直是0.....运行后也只显示list[0]里面的数据....最后的最后原来错误出在布局文件上 我以前的是这样的; <ScrollView android:layout_width="fill_parent" android:layout_height="wrap_content" > <!-- listv

Android开发之PullToRefresh的Click点击事件的监听实现长按删除Item

本文为原创博客,出自http://blog.csdn.net/minimicall 到今天为止,搜芽的卖家版本应该来说已经基本完成,攻坚克难的一路过来.速度也控制的比较好. 项目过程进度 从任务分配量上来看,基本还是我个人英雄主义.接下来这样不行.但暂时也没办法,师弟还需要一个学习的过程.智质不错,而且态度端正.相信搜芽买家,他就可以承担更多的开发任务了. 接下来进入正题,说我们的PullToRefresh的点击事件.其实,我是想做长按进入删除的. 见效果图.当然这个是我做出来之后的了,但做出来

ListView的item中有button和checkbox,listview的点击事件无效

ListView的item中有button和checkbox,listview的点击事件无效,解决办法: 在item布局文件中的根控件中添加属性设置: android:descendantFocusability="blocksDescendants" 如果只能点击checkbox,而无法触发item的点击事件,那么可以禁掉checkbox的焦点获取,不让它可以点击就可以了 checkbox里面加 android:focusable="false" android:

ListView绑定点击事件

代码如下: cList.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick( AdapterView<?> listView, //listView本身 View itemView, //listView的子View int p1, //位置参数 long p2 //位置参数 ) { //TODO } } ListView绑定点击事件,布布扣,bubuko.com

[android篇]textview中片段响应点击事件(SpannableString)

项目需求 点击textView中的一小段文字,弹一个dialog框 失败解决方案 刚开始是用了两个textView水平布局,可想而知,当第一个textView快占满一行,还未换行时,第二个textView很可能出现换行排版问题 用spannableString的问题 小段文字有下划线 点击textView中的小段文字时,系统会当做url处理,给点击部分的text加一个蓝色的背景 解决方案 public class TouchableSpan extends ClickableSpan { pri