Kotlin实现:ListView条目点击跳转并更新TextView、ImageView内容
解决方案
1. 定义数据模型
先创建一个简单的数据类,用来存储每个列表项的文本和图片资源信息:
public class ItemData { private String itemText; private int itemImageResId; public ItemData(String itemText, int itemImageResId) { this.itemText = itemText; this.itemImageResId = itemImageResId; } public String getItemText() { return itemText; } public int getItemImageResId() { return itemImageResId; } }
2. 准备布局文件
列表项布局(res/layout/list_item.xml)
用来渲染ListView的每个条目:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" android:padding="16dp"> <ImageView android:id="@+id/list_item_image" android:layout_width="48dp" android:layout_height="48dp" android:src="@mipmap/ic_launcher"/> <TextView android:id="@+id/list_item_text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="16dp" android:gravity="center_vertical" android:textSize="16sp"/> </LinearLayout>
主界面布局(res/layout/activity_main.xml)
包含ListView:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <ListView android:id="@+id/list_view" android:layout_width="match_parent" android:layout_height="match_parent"/> </LinearLayout>
详情界面布局(res/layout/activity_detail.xml)
即你提到的单一布局,包含TextView和ImageView:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:padding="16dp"> <ImageView android:id="@+id/detail_image" android:layout_width="200dp" android:layout_height="200dp" android:layout_gravity="center_horizontal"/> <TextView android:id="@+id/detail_text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="16dp" android:layout_gravity="center_horizontal" android:textSize="20sp"/> </LinearLayout>
3. 实现ListView的适配器
创建自定义适配器来绑定数据和列表项布局:
public class ItemAdapter extends ArrayAdapter<ItemData> { public ItemAdapter(Context context, List<ItemData> dataList) { super(context, 0, dataList); } @NonNull @Override public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) { if (convertView == null) { convertView = LayoutInflater.from(getContext()).inflate(R.layout.list_item, parent, false); } ItemData currentItem = getItem(position); ImageView itemImage = convertView.findViewById(R.id.list_item_image); TextView itemText = convertView.findViewById(R.id.list_item_text); itemImage.setImageResource(currentItem.getItemImageResId()); itemText.setText(currentItem.getItemText()); return convertView; } }
4. 主Activity配置ListView并处理点击事件
在包含ListView的Activity中,初始化数据、设置适配器,并处理条目点击跳转:
public class MainActivity extends AppCompatActivity { private ListView listView; private List<ItemData> itemDataList; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); listView = findViewById(R.id.list_view); // 初始化100条测试数据 itemDataList = new ArrayList<>(); for (int i = 1; i <= 100; i++) { // 这里用占位图片,可替换为自己的资源 itemDataList.add(new ItemData("条目 " + i, R.mipmap.ic_launcher)); } ItemAdapter adapter = new ItemAdapter(this, itemDataList); listView.setAdapter(adapter); // 处理条目点击事件 listView.setOnItemClickListener((parent, view, position, id) -> { ItemData clickedItem = itemDataList.get(position); Intent intent = new Intent(MainActivity.this, DetailActivity.class); // 传递数据到详情页 intent.putExtra("ITEM_TEXT", clickedItem.getItemText()); intent.putExtra("ITEM_IMAGE_RES", clickedItem.getItemImageResId()); startActivity(intent); }); } }
5. 详情Activity接收数据并更新布局
在展示单一布局的Activity中,获取传递的数据并更新控件:
public class DetailActivity extends AppCompatActivity { private TextView detailText; private ImageView detailImage; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_detail); detailText = findViewById(R.id.detail_text); detailImage = findViewById(R.id.detail_image); // 获取Intent传递的数据 Intent intent = getIntent(); if (intent != null) { String itemText = intent.getStringExtra("ITEM_TEXT"); int imageResId = intent.getIntExtra("ITEM_IMAGE_RES", R.mipmap.ic_launcher); // 更新控件内容 detailText.setText(itemText); detailImage.setImageResource(imageResId); } } }
注意事项
- 记得在
AndroidManifest.xml中注册DetailActivity:
<activity android:name=".DetailActivity"/>
- 如果你的图片是网络图片而非本地资源,需要修改数据模型存储图片URL,再用Glide等图片加载库加载。
内容的提问来源于stack exchange,提问作者Rajeev
相关产品推荐
相关产品推荐

