1. 程式人生 > >android開發之為listview繫結資料的三種方式

android開發之為listview繫結資料的三種方式

第一種,使用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;
        }


    }

效果如上所示

三種方法完成了