Android ListView与onClick项目
我是一个新的程序员,在Android中是新的。 我使用这个例子http://www.androidhive.info/2012/09/android-adding-search-functionality-to-listview/它很好。
现在我想让这些项目(戴尔,三星Galaxy S3等)调用一个函数来打开一个新的活动,每个不同的信息。
例如:
如果我碰戴尔,一个新的活动必须显示给我关于戴尔的信息。 如果我碰三星,也是一样的。
我谷歌search,但找不到任何有用的,任何提示? 我认为这是基本的,但我是新的,所以我不知道从哪里开始
在你的活动中,你定义你的列表视图
你写
listview.setOnItemClickListener(new OnItemClickListener(){ @Override public void onItemClick(AdapterView<?>adapter,View v, int position){ ItemClicked item = adapter.getItemAtPosition(position); Intent intent = new Intent(Activity.this,destinationActivity.class); //based on item add info to intent startActivity(intent); } });
在你写的适配器的getItem中
public ItemClicked getItem(int position){ return items.get(position); }
你意图开始新的活动。 将数据发送到意图的一种方法是传递一个实现了意图中的可分段的类。 注意你正在通过这个课程的副本。
http://developer.android.com/reference/android/os/Parcelable.html
在这里我有一个onItemClick。 我创build了意图,并把一个完整的类放到意图中。 我发送的课程实施了parcelable。 提示:您只需实现可重新创build类所需的最低限度的parsing。 也就是说,一个文件名或一个简单的东西,就像一个构造函数可以用来创build类的东西。 新的活动可以在以后得到Extras,它本质上是用它的构造函数方法创build一个类的副本。
当我在列表视图中收到onclick时,在这里启动我的应用程序的kmlreader类。
注意:下面的摘要是我传递的类的列表,所以get(position)返回类infact它是与列表视图相同的列表
List<KmlSummary> summary = null; ... public final static String EXTRA_KMLSUMMARY = "com.gosylvester.bestrides.util.KmlSummary"; ... @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { lastshownitem = position; Intent intent = new Intent(context, KmlReader.class); intent.putExtra(ImageTextListViewActivity.EXTRA_KMLSUMMARY, summary.get(position)); startActivity(intent); }
后来在新的活动中,我拿出了可parsing的类
kmlSummary = intent.getExtras().getParcelable( ImageTextListViewActivity.EXTRA_KMLSUMMARY); //note: //KmlSummary implements parcelable. //there is a constructor method for parcel in // and a overridden writetoparcel method // these are really easy to setup. public KmlSummary(Parcel in) { this._id = in.readInt(); this._description = in.readString(); this._name = in.readString(); this.set_bounds(in.readDouble(), in.readDouble(), in.readDouble(), in.readDouble()); this._resrawid = in.readInt(); this._resdrawableid = in.readInt(); this._pathstring = in.readString(); String s = in.readString(); this.set_isThumbCreated(Boolean.parseBoolean(s)); } @Override public void writeToParcel(Parcel arg0, int arg1) { arg0.writeInt(this._id); arg0.writeString(this._description); arg0.writeString(this._name); arg0.writeDouble(this.get_bounds().southwest.latitude); arg0.writeDouble(this.get_bounds().southwest.longitude); arg0.writeDouble(this.get_bounds().northeast.latitude); arg0.writeDouble(this.get_bounds().northeast.longitude); arg0.writeInt(this._resrawid); arg0.writeInt(this._resdrawableid); arg0.writeString(this.get_pathstring()); String s = Boolean.toString(this.isThumbCreated()); arg0.writeString(s); }
祝你好运Danny117
你一定要扩展你的ArrayListAdapter
并在你的getView()
方法中实现这个。 第二个参数(一个View
)应该被夸大,如果它的值是null
,利用它,并设置一个onClickListener()
在膨胀之后。
把它称为你的第二个getView()
的参数叫做convertView
:
convertView.setOnClickListener(new View.OnClickListener() { public void onClick(final View v) { if (isSamsung) { final Intent intent = new Intent(this, SamsungInfo.class); startActivity(intent); } else if (...) { ... } } }
如果你想了解如何扩展ArrayListAdapter
,我推荐这个链接 。
以及你的onitemClick
你将发送选定的价值如deal
,并发送它在您的意图时,开放新的活动,并在新的活动获取发送的数据和相关的选定的项目将显示您的数据
从list
获取名称
String item = yourData.get(position).getName();
意图设置数据
intent.putExtra("Key", item);
在第二个活动中获取数据
getIntent().getExtras().getString("Key")
lv.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { Intent i = new Intent(getActivity(), DiscussAddValu.class); startActivity(i); } });
listview.setOnItemClickListener(new OnItemClickListener(){ @Override public void onItemClick(AdapterView<?>adapter,View v, int position){ Intent intent; switch(position){ case 0: intent = new Intent(Activity.this,firstActivity.class); break; case 1: intent = new Intent(Activity.this,secondActivity.class); break; case 2: intent = new Intent(Activity.this,thirdActivity.class); break; //add more if you have more items in listview //0 is the first item 1 second and so on... } startActivity(intent); } });
为了什么样的地狱实施Parcelable?
他传递给适配器String []所以
- 获取项目(string)的位置
- 创造意图
- 把它作为额外的
- 开始活动
- 在活动得到额外的
存储你可以在这里使用的产品列表HashMap(例如STATIC对象)
描述产品的示例类:
public class Product { private String _name; private String _description; private int _id public Product(String name, String description,int id) { _name = name; _desctription = description; _id = id; } public String getName() { return _name; } public String getDescription() { return _description; } } Product dell = new Product("dell","this is dell",1); HashMap<String,Product> _hashMap = new HashMap<>(); _hashMap.put(dell.getName(),dell);
那么你传递给适配器的键集:
String[] productNames = _hashMap.keySet().toArray(new String[_hashMap.size()]);
当在适配器u返回视图你设置这样的监听器例如:
@Override public View getView(int position, View convertView, ViewGroup parent) { Context context = parent.getContext(); String itemName = getItem(position) someView.setOnClikListener(new MyOnClickListener(context, itemName)); } private class MyOnClickListener implements View.OnClickListener { private String _itemName; private Context _context public MyOnClickListener(Context context, String itemName) { _context = context; _itemName = itemName; } @Override public void onClick(View view) { //------listener onClick example method body ------ Intent intent = new Intent(_context, SomeClassToHandleData.class); intent.putExtra(key_to_product_name,_itemName); _context.startActivity(intent); } }
那么在其他活动中:
@Override public void onCreate(Bundle) { String productName = getIntent().getExtra(key_to_product_name); Product product = _hashMap.get(productName); }
* key_to_product_name是一个公共静态string作为额外的关键
PS。 对不起,我很急:) :)。 这个应该给你一个想法如何做ps3。 当我有更多的时间,我会添加一个详细的描述
我的评论:
- 请勿使用任何开关语句
- 不要为每个产品创build单独的活动(只需要一个)
我能够通过从上下文引用或Context.this
getapplicationcontext
来解决整个问题。
listview.setOnItemClickListener(new OnItemClickListener(){ //setting onclick to items in the listview. @Override public void onItemClick(AdapterView<?>adapter,View v, int position){ Intent intent; switch(position){ // case 0 is the first item in the listView. case 0: intent = new Intent(Activity.this,firstActivity.class); break; //case 1 is the second item in the listView. case 1: intent = new Intent(Activity.this,secondActivity.class); break; case 2: intent = new Intent(Activity.this,thirdActivity.class); break; //add more if you have more items in listView startActivity(intent); } });