java - 在 Custom ArrayList Adapter 场景中调用 .setAdapter 时的操作流程是什么?

标签 java android listview arraylist

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

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

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;
   }
}

例如,假设我在我的 Activity onCreate 方法中创建了一个 ArrayList 和一个新的 Adapter。

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);
}

一旦方法setAdapter(helperAdapter)被称为我的 ArrayList 如何使用 getItem(position) 查询其对象来电getView()方法?

我没有看到任何对我的 ArrayList 的引用,我只看到对象数据存储在临时 User 中对象,我只是有点迷失了这是怎么发生的(我附上了一张照片试图帮助解释我迷路的地方)?

用户.java

public class User {
public String name;
public String hometown;

public User(String name, String hometown) {
   this.name = name;
   this.hometown = hometown;
   }
 }  

图像 enter image description here

最佳答案

如果您查看 UsersAdapter 的构造函数你会看到你实际上通过了 ArrayList<User> users作为最后一个参数传递给父类构造函数。

super(context, R.layout.item_user, users);

ArrayAdaper保留对您传入的用户列表的引用并在内部使用它。如果你看一下getItem(...)来自 ArrayAdapter这样做只是从指定索引处的列表中返回项目。

public T getItem(int position) {
    return mObjects.get(position); // mObjects references same ArrayList as users
}

长话短说,这和做 users.get(position) 是一样的在这种情况下。

关于java - 在 Custom ArrayList Adapter 场景中调用 .setAdapter 时的操作流程是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37061539/

相关文章:

java - 角色出现

java - 获取javax swing计时器值

java - java中以下语句是什么意思(MY_CLASSPATH=lib/* :properties:.)

android - 如何避免回调后 OkHttp Dispatcher 中出现致命异常

android - ListView 内存不足 : External allocation too large for this process

java - Spring 的 @Value 注释可以与实现 BeanPostProcessor 的类型一起使用吗?

java - view.setText 发生在循环之后?

android - 使用 Datastore 防止内存泄漏的最佳做法是什么?

c# - 如何在 ASP.NET 网站上显示硬盘文件夹中的图像列表?

java - 如何在 strings.xml 或 asset 中存储数组并在 ListViewAdapter 中使用