You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android中如何操作ListView项并传递数据至下一个Activity?

Hey there! Let’s work through this ListView item interaction and data passing problem—this is such a common scenario in Android development, so I’ve got two reliable approaches for you that should fix whatever issue you’re hitting with getItem() or getView() handling.

First, let’s start with a quick prerequisite: if you’re passing custom objects (not just strings/numbers), make sure your data model implements Parcelable (recommended for efficiency) or Serializable. Here’s a quick example of a User model with Parcelable:

public class User implements Parcelable {
    private String userId;
    private String userName;

    // Constructor
    public User(String userId, String userName) {
        this.userId = userId;
        this.userName = userName;
    }

    // Parcelable implementation
    protected User(Parcel in) {
        userId = in.readString();
        userName = in.readString();
    }

    public static final Creator<User> CREATOR = new Creator<User>() {
        @Override
        public User createFromParcel(Parcel in) {
            return new User(in);
        }

        @Override
        public User[] newArray(int size) {
            return new User[size];
        }
    };

    // Getters
    public String getUserId() { return userId; }
    public String getUserName() { return userName; }

    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(userId);
        dest.writeString(userName);
    }
}

Approach 1: Use ListView's Built-in OnItemClickListener

This is the simplest method for when you want the entire list item to trigger the navigation to the next Activity.

  1. Set up your ListView and Adapter as usual
  2. Attach an OnItemClickListener to the ListView to handle item taps
  3. Fetch the selected item’s data and pass it via Intent
// Inside your MainActivity
ListView userListView = findViewById(R.id.user_list_view);
List<User> userList = fetchYourUserData(); // Replace with your data source
CustomUserAdapter adapter = new CustomUserAdapter(this, userList);
userListView.setAdapter(adapter);

// Set up the item click listener
userListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        // Get the selected user - use either of these two methods
        User selectedUser = (User) parent.getItemAtPosition(position);
        // OR User selectedUser = adapter.getItem(position);

        // Create intent and pass data
        Intent detailIntent = new Intent(MainActivity.this, UserDetailActivity.class);
        detailIntent.putExtra("SELECTED_USER", selectedUser); // Pass Parcelable object
        // For basic data types: detailIntent.putExtra("USER_ID", selectedUser.getUserId());
        startActivity(detailIntent);
    }
});

Pro Tip: If you’re using a custom BaseAdapter, make sure you’ve correctly overridden the getItem() method to return the right object at the given position:

@Override
public Object getItem(int position) {
    return userList.get(position);
}

Approach 2: Handle Clicks Directly in Your Custom Adapter's getView()

Use this method if you have multiple interactive elements in a list item (like a button or icon that needs its own click action), or if you need more control over the click behavior.

  1. In your Adapter’s getView() method, attach click listeners to the list item (or its child views)
  2. Bind the corresponding data to the click listener and launch the next Activity
public class CustomUserAdapter extends ArrayAdapter<User> {
    private Context mContext;
    private List<User> mUserList;

    public CustomUserAdapter(Context context, List<User> userList) {
        super(context, 0, userList);
        mContext = context;
        mUserList = userList;
    }

    @NonNull
    @Override
    public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
        ViewHolder holder;

        // Reuse view with ViewHolder pattern
        if (convertView == null) {
            convertView = LayoutInflater.from(mContext).inflate(R.layout.list_item_user, parent, false);
            holder = new ViewHolder();
            holder.userNameTv = convertView.findViewById(R.id.tv_user_name);
            holder.viewDetailsBtn = convertView.findViewById(R.id.btn_view_details);
            convertView.setTag(holder);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }

        final User currentUser = mUserList.get(position);
        holder.userNameTv.setText(currentUser.getUserName());

        // Click listener for the entire list item
        convertView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                launchDetailActivity(currentUser);
            }
        });

        // Click listener for a specific button in the list item
        holder.viewDetailsBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // You can pass specific data here instead of the whole object
                Intent intent = new Intent(mContext, UserDetailActivity.class);
                intent.putExtra("USER_ID", currentUser.getUserId());
                mContext.startActivity(intent);
            }
        });

        return convertView;
    }

    // Helper method to avoid code duplication
    private void launchDetailActivity(User user) {
        Intent intent = new Intent(mContext, UserDetailActivity.class);
        intent.putExtra("SELECTED_USER", user);
        mContext.startActivity(intent);
    }

    // ViewHolder class to optimize view recycling
    private static class ViewHolder {
        TextView userNameTv;
        Button viewDetailsBtn;
    }
}

Retrieving Data in the Next Activity

Finally, in your destination Activity, fetch the passed data from the Intent:

// Inside UserDetailActivity
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_user_detail);

    // Get Parcelable object
    User selectedUser = getIntent().getParcelableExtra("SELECTED_USER");
    // Get basic data type
    String userId = getIntent().getStringExtra("USER_ID");

    // Update your UI with the data
    if (selectedUser != null) {
        TextView userNameTv = findViewById(R.id.tv_detail_user_name);
        userNameTv.setText(selectedUser.getUserName());
    }
}

内容的提问来源于stack exchange,提问作者its_me_krish

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:11:13