使用adapter构造listview

  之前使用adapter构造listview走了很多弯路,特地记下来以供参考。

先来看简单的list_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="match_parent"
    android:id="@+id/list"
    android:orientation="horizontal">

    <TextView
        android:id="@+id/item1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_weight="1"/>

    <TextView
        android:id="@+id/item2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_weight="1"/>

    <TextView
        android:id="@+id/item3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_weight="1"/>

    <TextView
        android:id="@+id/item4"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_weight="2"/>

    <Button  android:id="@+id/delete"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="删除"/>


</LinearLayout>
 

最后定义了一个listview,list view可以用简单的simpleadapter来构造,但是如果想要添加button及其按钮的单击事件,必须要自己构造adapter来构造其布局。

下面给出adapter,继承baseadpater,其中最重要的方法是  public View getView(int i, View view, ViewGroup viewGroup)

这个方法用于返回一个view,我们先来单独解析这个方法:

public View getView(int i, View view, ViewGroup viewGroup) {
        ViewHolder holder = null;

        if (null == view ) {
            view = mInflater.inflate(R.layout.list_item, null);
            holder=new ViewHolder();

            holder.item1 = (TextView)view.findViewById(R.id.item1);
            holder.item2 = (TextView)view.findViewById(R.id.item2);
            holder.item3 = (TextView)view.findViewById(R.id.item3);
            holder.item4 = (TextView)view.findViewById(R.id.item4);
            holder.delete = (Button)view.findViewById(R.id.delete);
            view.setTag(holder);
        }else {
            holder = (ViewHolder)view.getTag();

        holder.item1.setText((String)((HashMap)items.get(i)).get("xm"));
        holder.item2.setText((String)((HashMap)items.get(i)).get("xb"));
        holder.item3.setText((String)((HashMap)items.get(i)).get("zy"));
        holder.item4.setText((String)((HashMap)items.get(i)).get("courses"));
        holder.delete.setTag(i);
        //给Button添加单击事件
        holder.delete.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                int dePosition = (Integer)v.getTag();
                items.remove(dePosition);
              notifyDataSetChanged();

            }
        });

        //holder.viewBtn.setOnClickListener(MyListener(position));
        return view;
    }
    public  class ViewHolder {
        public TextView item1;
        public TextView item2;
        public TextView item3;
        public TextView item4;
        public Button delete;
    }

这里viewholder 是对应一个类,用于将list_item里面的控件一一对应, 避免了就是每次在getVIew的时候,都需要重新的findViewById,重新找到控件,然后进行控件的赋值以及事件相应设置。这样其实在做重复的事情。

下面给出完整的适配器方法:

/**
 * Created by gzy on 2018/3/28.
 */

public class MyAdapter extends BaseAdapter {
    private Context context;
    private LayoutInflater mInflater;
    private List<Map<String, Object>> items;
   //传参须获得一个context,arraylist
    public MyAdapter(Context context, List<Map<String, Object>> items ) {
        this.context=context;
        this.mInflater = LayoutInflater.from(context);
        this.items=items;
        Toast.makeText(context, "aaaaaa", Toast.LENGTH_SHORT).show();
    }
    @Override
    public int getCount() {
        return items.size();
    }

    @Override
    public Object getItem(int i) {
        return items.get(i);
    }

    @Override
    public long getItemId(int i) {
        return i;
    }

    @Override
    public View getView(int i, View view, ViewGroup viewGroup) {
        ViewHolder holder = null;

        if (null == view ) {
            view = mInflater.inflate(R.layout.list_item, null);
            holder=new ViewHolder();

        //    Toast.makeText(context, "aaaabbbbbbbbba", Toast.LENGTH_SHORT).show();
            holder.item1 = (TextView)view.findViewById(R.id.item1);
            holder.item2 = (TextView)view.findViewById(R.id.item2);
            holder.item3 = (TextView)view.findViewById(R.id.item3);
            holder.item4 = (TextView)view.findViewById(R.id.item4);
            holder.delete = (Button)view.findViewById(R.id.delete);
            view.setTag(holder);
        }else {
            holder = (ViewHolder)view.getTag();
        }
      //  Toast.makeText(context, "aaahbjhba", Toast.LENGTH_SHORT).show();
        holder.item1.setText((String)((HashMap)items.get(i)).get("xm"));
        holder.item2.setText((String)((HashMap)items.get(i)).get("xb"));
        holder.item3.setText((String)((HashMap)items.get(i)).get("zy"));
        holder.item4.setText((String)((HashMap)items.get(i)).get("courses"));
        holder.delete.setTag(i);
        //给Button添加单击事件
        holder.delete.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                int dePosition = (Integer)v.getTag();
                items.remove(dePosition);
              notifyDataSetChanged();

            }
        });

        //holder.viewBtn.setOnClickListener(MyListener(position));
        return view;
    }
    public  class ViewHolder {
        public TextView item1;
        public TextView item2;
        public TextView item3;
        public TextView item4;
        public Button delete;
    }
}

这里的方法都是继承自baseadapter来的,所以这些method自动导入,但是别忽略了其他的方法,要修改他的返回值(我当初就是忘记修改这些return了)

最后在activity设置,为其添加adapter

public class MainActivity extends AppCompatActivity {
    private EditText xh, xm;
    private Spinner zy;
    private CheckBox xk1, xk2, xk3;
    private RadioGroup xb;
    private ListView info;
    private android.support.v7.app.ActionBar actionBar;
    private  ArrayAdapter<String> zyAdapter;
    private  MyAdapter myAdapter;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        actionBar = this.getSupportActionBar();
        actionBar.show();
        xh = (EditText) findViewById(R.id.xh);
        xm = (EditText) findViewById(R.id.xm);
        xb = (RadioGroup) findViewById(R.id.radio);
        zy = (Spinner) findViewById(R.id.zy);
        xk1 = (CheckBox) findViewById(R.id.xk1);
        xk2 = (CheckBox) findViewById(R.id.xk2);
        xk3 = (CheckBox) findViewById(R.id.xk3);
        info = findViewById(R.id.info);
        zy = (Spinner) findViewById(R.id.zy);

        final List<Map<String, Object>> items = new ArrayList<Map<String, Object>>();
        String[] zylist = this.getResources().getStringArray(R.array.zylist);
        //为spinner添加对象,相当于设置entries
        zyAdapter = new ArrayAdapter<String>(
                this,
                android.R.layout.simple_list_item_multiple_choice,
                new ArrayList<String>(Arrays.asList(zylist)));
        zy.setAdapter(zyAdapter);
        final Button button = (Button) findViewById(R.id.register);
        
        info.setAdapter(myAdapter = new MyAdapter(MainActivity.this,items));
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                String xhstr = xh.getText().toString();
                String xmstr = xm.getText().toString();
                String xbstr = (xb.getCheckedRadioButtonId() == R.id.male) ? "男" : "女";
                String zystr = zy.getSelectedItem().toString();
                // String courses=(xk1.isChecked()?(xk1.getText().toString()+","):"");
                boolean complete = true;
                if (xhstr.equals("")) {
                    complete = false;
                } else if (xmstr.equals("")) {
                    complete = false;
                } else if (!(xk1.isChecked() || xk2.isChecked() || xk3.isChecked())) {
                    complete = false;
                }
                if (!complete) {
                    Toast.makeText(MainActivity.this, "请把信息填写完整!", Toast.LENGTH_LONG).show();
                } else {
                    String courses = (xk1.isChecked() ? (xk1.getText().toString() + ",") : "") +
                            (xk2.isChecked() ? (xk2.getText().toString() + ",") : "") +
                            (xk3.isChecked() ? (xk3.getText().toString() + ",") : "");
                    if (courses.charAt(courses.length() - 1) == ',') {
                        courses = courses.substring(0, courses.length() - 1);
                    }

                    Map<String, Object> item = new HashMap<String, Object>();
                    item.put("xh", xhstr);
                    item.put("xm", xmstr);
                    item.put("xb", xbstr);
                    item.put("zy", zystr);
                    item.put("courses", courses);
                    item.put("xm", xmstr);
                    items.add(item);
//                    SimpleAdapter simpleAdapter = new SimpleAdapter(MainActivity.this,
//                            items,
//                            R.layout.list_item,
//                            new String[]{"xm", "xb", "zy", "courses"},
//                            new int[]{R.id.item1, R.id.item2, R.id.item3, R.id.item4}
//                    );

                    myAdapter.notifyDataSetChanged();
          //        Toast.makeText(MainActivity.this, xmstr + xbstr + zystr + "/" + courses, Toast.LENGTH_SHORT).show();
                }
            }
        });

    }
    public boolean onCreateOptionsMenu(Menu menu){
        menu.add(1,2,2,"修改课程");
        menu.add(1,1,1,"修改专业");
        this.getMenuInflater().inflate(R.menu.menu,menu);
        return  super.onCreateOptionsMenu(menu);
    }
  public boolean onOptionsItemSelected(MenuItem item){
        switch (item.getItemId()){
            case 1:
                break;
            case 2:
                break;
                //修改课程
            case R.id.modifyCourse:
                final TableLayout courseTableLayout = (TableLayout)this.getLayoutInflater().inflate(R.layout.modify_course, null);
                new AlertDialog.Builder(this)
                        .setTitle("修改课程")
                        .setView(courseTableLayout)
                        .setPositiveButton("确定",new DialogInterface.OnClickListener(){
                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                String kc1Name = ((EditText)courseTableLayout.findViewById(R.id.c1name)).getText().toString().trim();
                                String kc2Name = ((EditText)courseTableLayout.findViewById(R.id.c2name)).getText().toString().trim();
                                String kc3Name = ((EditText)courseTableLayout.findViewById(R.id.c3name)).getText().toString().trim();
                                xk1.setText(kc1Name);
                                xk2.setText(kc2Name);
                                xk3.setText(kc3Name);
                                dialog.dismiss();
                            }
                        }).setNegativeButton("取消", new DialogInterface.OnClickListener(){
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        dialog.dismiss();
                    }
                })
                        .create().show();
                break;
                //修改专业
            case R.id.modifyProfession:
                final TableLayout professionTableLayout = (TableLayout)this.getLayoutInflater().inflate(R.layout.modify_profession, null);
                final EditText editText=(EditText) professionTableLayout.findViewById(R.id.z1name);
                new AlertDialog.Builder(this)
                        .setTitle("维护专业")
                        .setView(professionTableLayout)
                        .setPositiveButton("确定",new DialogInterface.OnClickListener(){
                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                String zy1Name = ((EditText)professionTableLayout.findViewById(R.id.z1name)).getText().toString().trim();

                                zyAdapter.add(zy1Name);
                                dialog.dismiss();
                            }
                        }).setNegativeButton("取消", new DialogInterface.OnClickListener(){
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        dialog.dismiss();
                    }
                })
                        .create().show();
                break;

        }
        return  true;
  }
}
这样就大功告成了


 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值