如何创建一个列表视图,以便点击每个列表项目将打开不同的活动?
问题描述:
我有一个列表视图。我想单击每个列表项目并打开不同的活动。其实,我写了代码,但它不工作。我的编码技能无法处理这个问题。如何用字符串和类对创建Hahmap,然后将其放入ArrayAdapter。任何人都可以给我看代码吗?如何创建一个列表视图,以便点击每个列表项目将打开不同的活动?
ListViewAcivity.java
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast;
import java.util.ArrayList;
import java.util.HashMap;
public class ListViewActivity extends Activity {
ListView listView ;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main_screen_activity);
// Get ListView object from xml
listView = (ListView) findViewById(R.id.list);
// Defined Array values to show in ListView
HashMap<String, Class> hashMap=new HashMap<String, Class>();
hashMap.put("A Function", MActivity.class);
hashMap.put("B Function",AActivity.class);
hashMap.put("c Function",XActivity.class);
hashMap.put("D Function",ZActivity.class);
hashMap.put("E Function", PActivity.class);
hashMap.put("F Function", QActivity.class);
// Define a new Adapter
// First parameter - Context
// Second parameter - Layout for the row
// Third parameter - ID of the TextView to which the data is written
// Forth - the Array of data
//错误是在这里...... //此构造函数不能得到解决。 //我不知道如何使用// String,Class对和Array Adapter。
ArrayAdapter<HashMap<String,Class>> adapter = new ArrayAdapter<HashMap<String,Class>>(this, android.R.layout.simple_list_item_1, android.R.id.text1, hashMap);
// Assign adapter to ListView
listView.setAdapter(adapter);
// ListView Item Click Listener
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
// ListView Clicked item index
int itemPosition = position;
// ListView Clicked item value
String itemValue = (String) listView.getItemAtPosition(position);
switch(itemPosition){
case 0: Intent newActivity = new Intent(ListViewActivity.this, MActivity.class);
startActivity(newActivity);
break;
case 1: Intent newActivity1 = new Intent(ListViewActivity.this, AActivity.class);
startActivity(newActivity1);
break;
case 2: Intent newActivity2 = new Intent(ListViewActivity.this, XActivity.class);
startActivity(newActivity2);
break;
case 3: Intent newActivity3 = new Intent(ListViewActivity.this, ZActivity.class);
startActivity(newActivity3);
break;
case 4: Intent newActivity4 = new Intent(ListViewActivity.this, PActivity.class);
startActivity(newActivity4);
break;
case 5: Intent newActivity5 = new Intent(ListViewActivity.this, QActivity.class);
startActivity(newActivity5);
break;
}
}
@SuppressWarnings("unused")
public void onClick(View v){
};
});}
}
main_screen_Activity.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<ListView
android:id="@+id/list"
android:layout_width="match_parent"
android:layout_height="wrap_content"></ListView>
</LinearLayout>
答
简单的静态实例。
public class MainActivity extends AppCompatActivity {
ListView lv1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//Initialize the list view
lv1 = (ListView) findViewById(R.id.mainlist);
//Add the List data
//as the array is stored starting with 0, the Layouts will be having 0th position, Intents being 1 and so on..
String[] sessiontuts = new String[]{"Activity 1", "Activity2"};
//use the Simple array adapter
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,android.R.id.text1,sessiontuts);
//now to bind the data to list, just set the adapter we just created to the listview,
lv1.setAdapter(adapter);
//we need to have click listner on the particular item,
//all the items in list will have a position starting from 0 to n,
//so, write the intent code to launch particular activity depending on list item position
lv1.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int pos, long l) {
//using switch case, to check the condition.
switch (pos){
case 0:
startActivity(new Intent(getApplicationContext(), Act1.class));
break;
case 1:
startActivity(new Intent(getApplicationContext(), Act2.class));
break;
}
}
});
}
}
答
一种ArrayAdapter期望一个阵列或对象来显示的列表。所以你需要提供一个数组/列表
是什么让你认为它可以处理地图?列表/数组表示事物的序列;而地图则代表了某种东西到其他东西的映射。
换句话说:你不能传递一个地图对象。
只需传递一个包含要显示的字符串的列表或数组(“Medical Reminders”,...)。
但是有那张地图有价值;你只需要改变你的代码位:
首先,你可以使用键映射为输入的创建一个ArrayAdapter,像这样的时候:
List<String> arrayItems = new ArrayList<>(hashMap.keySet());
,然后在onClickItem()
你做不是需要检索索引 - 因为你已经有了那张告诉你哪个类属于哪个字符串的地图!含义:ListView为您提供所选项目字符串和hashMap
将所有可能的字符串映射到相应的活动类别!
所以,你可以扔掉你的整个“开关”的代码,而是做这样的事情:为你所要求的功能
String itemValue = (String) listView.getItemAtPosition(position);
Class classForSelectedValue = hashMap.get(itemValue);
Intent activity = new Intent(ListViewActivity.this, classForSelectedValue);
感谢您的澄清。现在,我明白了。我正在修复它。再次感谢。 – SOURAV
当然,如果它给你你正在寻找的东西,随时接受我的答案。 – GhostCat