之前使用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;
}
}
这样就大功告成了