Android中ListView子项点击跳转对应新Activity的实现咨询
实现ListView子项点击跳转对应Activity的方案
需求与已完成开发
需要实现点击ListView的每个子项时打开对应的新Activity,目前已完成以下开发:
- 创建字符串数组资源
- 完成ListView及子项布局
- 编写自定义BaseAdapter(
InformatiiAdapter) - 在主Activity(
Informatii)中设置了ListView点击事件,但未完善跳转逻辑
已完成代码片段
- 字符串数组资源:
<string-array name="title"> <item>eeeeee </item> <item>wwwww </item> <item>qqqqq </item> <item>aaaaa </item> <item>nnnnn </item> <item>ccccc </item> </string-array>
- 自定义BaseAdapter(
InformatiiAdapter):
public class InformatiiAdapter extends BaseAdapter { Informatii informatii; String[] title; Animation animation; public InformatiiAdapter(Informatii informatii, String[] title) { this.informatii = informatii; this.title = title; } public static int getRandom(int max) { return (int )(Math.random()*max); } @Override public int getCount() { return title.length; } @Override public Object getItem(int position) { return position; } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { convertView= LayoutInflater.from(informatii).inflate(R.layout.new_item_layout, parent, false); animation= AnimationUtils.loadAnimation(informatii, R.anim.animation1); TextView textView; LinearLayout ll_bg; ll_bg=convertView.findViewById(R.id.ll_bg); textView=convertView.findViewById(R.id.textView); int number=getRandom(8); if(number==1) { ll_bg.setBackground(ContextCompat.getDrawable(informatii,R.drawable.gradient_1)); } else if(number==2){ ll_bg.setBackground(ContextCompat.getDrawable(informatii,R.drawable.gradient_2)); } else if(number==3){ ll_bg.setBackground(ContextCompat.getDrawable(informatii,R.drawable.gradient_3)); } else if(number==4){ ll_bg.setBackground(ContextCompat.getDrawable(informatii,R.drawable.gradient_4)); } else if(number==5){ ll_bg.setBackground(ContextCompat.getDrawable(informatii,R.drawable.gradient_5)); } else if(number==6){ ll_bg.setBackground(ContextCompat.getDrawable(informatii,R.drawable.gradient_6)); } else if(number==7){ ll_bg.setBackground(ContextCompat.getDrawable(informatii,R.drawable.gradient_7)); } else if(number==8){ ll_bg.setBackground(ContextCompat.getDrawable(informatii,R.drawable.gradient_8)); } else { ll_bg.setBackground(ContextCompat.getDrawable(informatii,R.drawable.gradient_1)); } textView.setText(title[position]); textView.setAnimation(animation); return convertView; } }
- 主Activity(
Informatii)现有代码:
public class Informatii extends AppCompatActivity { ListView listView; Animation animation; String[] title; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_informatii); getSupportActionBar().setTitle("Informații anxietate"); listView=findViewById(R.id.list_view); title=getResources().getStringArray(R.array.title); InformatiiAdapter adapter=new InformatiiAdapter(Informatii.this, title); animation= AnimationUtils.loadAnimation(this,R.anim.animation1); listView.setAdapter(adapter); listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { if(position==1){ Intent intent= new Intent(Informatii.this, Anxietate.class); } } }); } }
解决方案
方案一:使用switch-case匹配position
直接根据子项的position值,匹配对应的Activity并启动:
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { Intent intent = null; switch (position) { case 0: intent = new Intent(Informatii.this, EeeeeeActivity.class); // 对应第一个子项"eeeeee" break; case 1: intent = new Intent(Informatii.this, Anxietate.class); // 对应第二个子项"wwwww" break; case 2: intent = new Intent(Informatii.this, QqqqqActivity.class); // 对应第三个子项"qqqqq" break; case 3: intent = new Intent(Informatii.this, AaaaaActivity.class); // 对应第四个子项"aaaaa" break; case 4: intent = new Intent(Informatii.this, NnnnnActivity.class); // 对应第五个子项"nnnnn" break; case 5: intent = new Intent(Informatii.this, CccccActivity.class); // 对应第六个子项"ccccc" break; // 若有第七个子项,添加以下代码 // case 6: // intent = new Intent(Informatii.this, XxxxxActivity.class); // break; } if (intent != null) { startActivity(intent); } } });
方案二:使用Activity类数组映射(更易维护)
将Activity类与子项顺序绑定到数组中,后续修改只需调整数组,无需改动逻辑:
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { // 数组顺序需与字符串数组"title"的子项顺序完全对应 Class<?>[] activityClasses = { EeeeeeActivity.class, Anxietate.class, QqqqqActivity.class, AaaaaActivity.class, NnnnnActivity.class, CccccActivity.class // 第七个子项对应的Activity添加在此 // XxxxxActivity.class }; // 避免数组越界 if (position >= 0 && position < activityClasses.length) { Intent intent = new Intent(Informatii.this, activityClasses[position]); startActivity(intent); } } });
注意事项
- 所有跳转目标Activity必须在
AndroidManifest.xml中注册,示例:
<activity android:name=".EeeeeeActivity"/> <activity android:name=".Anxietate"/> <activity android:name=".QqqqqActivity"/> <!-- 其他Activity同理添加 -->
- 代码中的Activity类名请替换为你项目中的实际类名。
内容的提问来源于stack exchange,提问作者Patrick Kossik
相关产品推荐
相关产品推荐

