android開發之為listview繫結資料的三種方式
阿新 • • 發佈:2019-01-01
第一種,使用simple adapter
simpleadapter 是最簡單的一種方式,但是其資料來源必須是map型別。
1.生成 SimpleAdapter()物件
2.設定資料來源
3.設定每個item的佈局
4.設定SimpleAdapter(Context context, //上下文
List<? extends Map<String, ?>> data, //資料來源
int resource, //每個item的佈局
String[] from,//map的key
int[] to) //相應控制元件的id
5.為listview繫結SimpleAdapter
接下來看程式碼:
public class User { private String userName; private int userRank; public User(String userName, int userRank) { super(); this.userName = userName; this.userRank = userRank; } public User(){ super(); } public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public int getUserRank() { return userRank; } public void setUserRank(int userRank) { this.userRank = userRank; } }
Actvity的程式碼:
public class RankingActivity extends Activity { //資料來源 ArrayList<User> al = new ArrayList<User>(); private ListView ls_rank; List<Map<String, String>> data = new ArrayList<Map<String, String>>(); @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.rankinglist); ls_rank = (ListView) findViewById(R.id.ls_rank); al.add(new User("aaa", 666)); al.add(new User("bbb", 777)); al.add(new User("ccc", 888)); fillData(); // 第一種 simpleAdapter SimpleAdapter adapter = new SimpleAdapter(RankingActivity.this, data, R.layout.rank_list_item, new String[]{"userName", "userRank"}, new int[]{R.id.tv_name, R.id.tv_rank}); ls_rank.setAdapter(adapter); private void fillData() { for (User user : al) { Map<String, String> map = new HashMap<String, String>(); map.put("userName", user.getUserName()); map.put("userRank", user.getUserRank() + ""); data.add(map); } }
第二種:BaseAdapter
1.建立一個MyBaseAdapter,重寫四個方法
class MyBaseAdapter extends BaseAdapter {
@Override
public int getCount() {
return al.size();
}
@Override
public Object getItem(int i) {
return i;
}
@Override
public long getItemId(int i) {
return i;
}
@Override
public View getView(int i, View view, ViewGroup viewGroup) {
View row = view;
Wrapper wrapper;
if (row == null) {
row = getLayoutInflater().inflate(R.layout.rank_list_item, viewGroup, false);
wrapper = new Wrapper(row);
row.setTag(wrapper);
} else {
wrapper = (Wrapper) row.getTag();
}
TextView tvName = wrapper.gettvName();
TextView tvRank = wrapper.gettvRank();
tvName.setText(al.get(i).getUserName());
tvRank.setText(al.get(i).getUserRank()+"");
return row;
}
}
class Wrapper {
private TextView tvName;
private TextView tvRank;
private View row;
public Wrapper(View row) {
this.row = row;
}
public TextView gettvName() {
if (tvName == null) {
tvName = (TextView) row.findViewById(R.id.tv_name);
}
return tvName;
}
public TextView gettvRank() {
if (tvRank == null) {
tvRank = (TextView) row.findViewById(R.id.tv_rank);
}
return tvRank;
}
}
然後在onCreate裡面繫結adapter就可以了
效果如上所示
三:ArrayAdapter,新建一個MyArrayAdapter 重寫getView方法
class MyArrayAdapter extends ArrayAdapter<User>{
public MyArrayAdapter(@NonNull Context context, @LayoutRes int resource, @IdRes int textViewResourceId, @NonNull List objects) {
super(context, 0, 0, objects);
}
@NonNull
@Override
public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
View row = convertView;
Wrapper wrapper;
if (row == null) {
row = getLayoutInflater().inflate(R.layout.rank_list_item, parent, false);
wrapper = new Wrapper(row);
row.setTag(wrapper);
} else {
wrapper = (Wrapper) row.getTag();
}
TextView tvName = wrapper.gettvName();
TextView tvRank = wrapper.gettvRank();
tvName.setText(al.get(position).getUserName());
tvRank.setText(al.get(position).getUserRank()+"");
return row;
}
}
效果如上所示
三種方法完成了