在自定义ArrayList适配器方案中调用.setAdapter时的操作流程是什么?

时间:2016-05-05 22:48:48

标签: java android listview arraylist

在尝试填充活动中的ListView时,我对ArrayAdapter如何与ArrayList交互的概念感到困惑。

这是一个导致我有点困惑的指南示例: https://github.com/codepath/android_guides/wiki/Using-an-ArrayAdapter-with-ListView

<img src="{{Product.image.url}}"/>
<h1>{{Product.title}}</h1>

<form method="POST" action="">{% csrf_token %}
{{ form_product_unit.as_p }}

<input type="submit" value="Add" />
</form>

让我们举例说,我在我的activity onCreate方法中创建了一个ArrayList和一个新的Adapter。

public class UsersAdapter extends ArrayAdapter<User> {
    // View lookup cache
    private static class ViewHolder {
        TextView name;
        TextView home;
    }

    public UsersAdapter(Context context, ArrayList<User> users) {
       super(context, R.layout.item_user, users);
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
       // Get the data item for this position

       >>>>>>> User user = getItem(position); <<<<<<<<<

       // Check if an existing view is being reused, otherwise inflate the view
       ViewHolder viewHolder; // view lookup cache stored in tag
       if (convertView == null) {
          viewHolder = new ViewHolder();
          LayoutInflater inflater = LayoutInflater.from(getContext());
          convertView = inflater.inflate(R.layout.item_user, parent, false);
          viewHolder.name = (TextView) convertView.findViewById(R.id.tvName);
          viewHolder.home = (TextView) convertView.findViewById(R.id.tvHome);
          convertView.setTag(viewHolder);
       } else {
           viewHolder = (ViewHolder) convertView.getTag();
       }
       // Populate the data into the template view using the data object
       viewHolder.name.setText(user.name);
       viewHolder.home.setText(user.hometown);
       // Return the completed view to render on screen
       return convertView;
   }
}

调用方法protected void onCreate(Bundle savedInstanceState) { ArrayList<User> myArray = new ArrayList<User>(); User foobar = new User(); myArray.add(foobar); // Adds my new user to the arrayList ArrayAdapter helperAdapter = new ArrayAdapter(this, myArray); ListView lv = (ListView) findViewById(R.id.feed); lv.setAdapter(helperAdapter); } 后,我的ArrayList如何通过setAdapter(helperAdapter)方法中的getItem(position)调用查询其对象?

我没有看到对我的ArrayList的任何引用,我只是看到对象数据存储在一个临时的getView()对象中,而我对这种情况的发生方式感到有点迷失(我附上了一张照片试图解释我迷路的地方吗?

User.java

User

图像 enter image description here

1 个答案:

答案 0 :(得分:1)

如果查看proc ttest; where group = 'A' or 'C'; var x y; run; 的构造函数,您将看到实际上是将UsersAdapter作为最后一个参数传递给父类构造函数。

ArrayList<User> users

super(context, R.layout.item_user, users); 保留对您传入的用户列表的引用,并在内部使用它。如果您查看来自ArrayAdaper的{​​{1}}正在做什么,只需从指定索引处的列表中返回该项。

getItem(...)

长话短说,就像在这种情况下做ArrayAdapter一样。