Android 带节的Listview:如何识别单击了相应节的哪个项
我正在使用SetonicClickListener来处理带有节的列表。我在这个列表中有两个部分,我希望如果第一部分的任何项目/行被单击,它将禁止启动新活动,如果第二部分的任何项目被单击,它将不做任何事情。我如何确定该项目属于哪个部分????请帮忙 代码片段Android 带节的Listview:如何识别单击了相应节的哪个项,android,Android,我正在使用SetonicClickListener来处理带有节的列表。我在这个列表中有两个部分,我希望如果第一部分的任何项目/行被单击,它将禁止启动新活动,如果第二部分的任何项目被单击,它将不做任何事情。我如何确定该项目属于哪个部分????请帮忙 代码片段 SectionedAdapter adapter = new SectionedAdapter() { protected View getHeaderView(String caption, int index,
SectionedAdapter adapter = new SectionedAdapter() {
protected View getHeaderView(String caption, int index,View convertView, ViewGroup parent) {
TextView result = (TextView) convertView;
if (convertView == null) {
result = (TextView) getLayoutInflater().inflate(R.layout.header, null);
}
if(caption != null){
result.setText(caption);
}else{
result.setVisibility(View.GONE);
}
return (result);
}
};
ListView lister;
@Override
public void onCreate(Bundle icicle)
{
super.onCreate(icicle);
setContentView(R.layout.main);
lister=(ListView)findViewById(R.id.lister);
first();
second();
}
first()
{
arr=...// some array of elements to be in first list
firstadapter fa=new firstadapter(this,R.layout.list,arr);
adapter.addSection("Old",fa );
lister.setAdapter(adapter);
}
second()
{
arr=...// some array of elements to be in second list
secondadapter sa=new secondadapter(this,R.layout.list,arr);
adapter.addSection("Old",sa );
lister.setAdapter(adapter);
}
class firstAdapter extends BaseAdapter
{
...
}
class secondAdapter extends BaseAdapter
{
...
}
abstract class SectionAdapter extends BaseAdapter
{
...
}
我会在你的arg1上设置一个标签
onItemClick(适配器视图arg0、视图arg1、内部arg2…..
如果您想在ListView的项目中放置一些额外的信息来区分视图,请使用setTag(Object)
希望这有帮助。在您的
getView()
中,您可以获取用于创建节的视图的类型。您可以通过getItemViewType()获取正在使用的视图的类型
。是一个完整的例子,它解释了它是如何工作的您还不清楚您的问题。您是否创建了两个列表或您已经给出了两个部分的相同列表。您可以根据位置值以任何方式执行任何操作。您可以在ArrayAdapter类中获得视图中的位置getView Override函数
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
View rowView = convertView;
if (rowView == null) {
LayoutInflater inflater = context.getLayoutInflater();
rowView = inflater.inflate(R.layout.listrowlayout, null, true);
holder = new ViewHolder();
holder.textView1 = (TextView) rowView.findViewById(R.id.label);
holder.textView2 = (TextView) rowView.findViewById(R.id.label2);
rowView.setTag(holder);
rowView.setTag(position, Long.valueOf(user_ids[position]));
} else {
holder = (ViewHolder) rowView.getTag();
}
if (user_ids[position] == 1) {
// do something
} else if (user_ids[position] == 2)
// do something
}
您将知道ListView的itemclickListener只会告诉您单击了列表中的哪个项目。此项目在返回视图的getView期间膨胀。如果我正确理解了您的问题,那么您可以在此处使用getChild来了解单击的特定视图。类似于
ListView.setItemCLickListener(new ItemCLickListener(){
onItemClick(AdapterView<?> arg0, View arg1, int arg2.....){
View childYouWant=(View) arg1.getChild();
ListView.setItemCLickListener(新的ItemCLickListener(){
onItemClick(适配器视图arg0、视图arg1、内部arg2…){
View childYouWant=(视图)arg1.getChild();
如果您正在使用sharky的代码,请执行以下修改以使其正常工作。我已更改了他的活动代码,以使其以我的方式简单工作:
import java.util.ArrayList;
import se.phoniro.phone.adapters.SeparatedListAdapter;
import android.app.Activity;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
public class temp extends Activity{
LayoutInflater inflater;
ArrayList<Holder> dataNew = new ArrayList<Holder>();
ArrayList<Holder> dataOld = new ArrayList<Holder>();
MyCustomAdapter adapterNew, adapterOld;
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
inflater = (LayoutInflater)getSystemService(LAYOUT_INFLATER_SERVICE);
dataNew.add(new Holder(DataType.New, "first"));
dataNew.add(new Holder(DataType.New, "second"));
dataNew.add(new Holder(DataType.New, "third"));
adapterNew = new MyCustomAdapter(dataNew);
dataOld.add(new Holder(DataType.Old, "first"));
dataOld.add(new Holder(DataType.Old, "second"));
dataOld.add(new Holder(DataType.Old, "third"));
adapterOld = new MyCustomAdapter(dataOld);
// create our list and custom adapter
SeparatedListAdapter adapter = new SeparatedListAdapter(this);
adapter.addSection("New Data", adapterNew);
adapter.addSection("Old Data", adapterOld);
ListView list = new ListView(this);
list.setAdapter(adapter);
this.setContentView(list);
list.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View v, int position, long arg3) {
//here i'm fetching the tag is set at the time in getView
Holder kv = (Holder)v.getTag();
//showing selection
Toast.makeText(getBaseContext(), kv.item + " is of type: " + kv.type.name(), Toast.LENGTH_SHORT).show();
}
});
}
private class MyCustomAdapter extends ArrayAdapter<Holder>{
ArrayList<Holder> data = null;
public MyCustomAdapter(ArrayList<Holder> objects) {
super(getBaseContext(), android.R.layout.simple_list_item_1, objects);
data = objects;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if(convertView == null)
convertView = inflater.inflate(android.R.layout.simple_list_item_1, parent, false);
TextView tv = (TextView) convertView.findViewById(android.R.id.text1);
Holder kv = data.get(position);
tv.setText(kv.item);
//setting tag to the view
tv.setTag(kv);
return tv;
}
}
//custom stuff
public enum DataType{Old,New}
class Holder{
public DataType type;
public String item = "";
public Holder(DataType t, String str){
type = t;
item = str;
}
}
}
import java.util.ArrayList;
导入se.phoniro.phone.adapters.SeparatedListAdapter;
导入android.app.Activity;
导入android.os.Bundle;
导入android.view.LayoutInflater;
导入android.view.view;
导入android.view.ViewGroup;
导入android.widget.AdapterView;
导入android.widget.AdapterView.OnItemClickListener;
导入android.widget.ArrayAdapter;
导入android.widget.ListView;
导入android.widget.TextView;
导入android.widget.Toast;
公共类临时扩展活动{
充气机;
ArrayList dataNew=新的ArrayList();
ArrayList dataOld=新的ArrayList();
MyCustomAdapter adapterNew、adapterOld;
@凌驾
创建(捆绑冰柱)时的公共空间{
超级冰柱;
充气机=(布局充气机)获取系统服务(布局充气机服务);
添加(新持有人(DataType.new,“第一”);
添加(新持有人(DataType.new,“第二”);
添加(新持有人(DataType.new,“第三”);
adapterNew=新的MyCustomAdapter(dataNew);
添加(新持有人(DataType.Old,“第一”);
添加(新持有人(DataType.Old,“第二”);
添加(新持有人(DataType.Old,“第三”);
adapterOld=新的MyCustomAdapter(dataOld);
//创建我们的列表和自定义适配器
SeparatedListAdapter=新的SeparatedListAdapter(此);
adapter.addSection(“新数据”,adapterNew);
adapter.addSection(“旧数据”,adapterOld);
ListView列表=新的ListView(此);
list.setAdapter(适配器);
此.setContentView(列表);
list.setOnItemClickListener(新的OnItemClickListener(){
@凌驾
public void onItemClick(AdapterView arg0,视图v,内部位置,长arg3){
//在这里,我获取的标签是在getView中设置的
保持架kv=(保持架)v.getTag();
//显示选择
Toast.makeText(getBaseContext(),kv.item+)的类型为:“+kv.type.name(),Toast.LENGTH_SHORT).show();
}
});
}
私有类MyCustomAdapter扩展了ArrayAdapter{
ArrayList数据=null;
公共MyCustomAdapter(ArrayList对象){
super(getBaseContext(),android.R.layout.simple\u list\u item\u 1,objects);
数据=对象;
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
if(convertView==null)
convertView=充气机。充气(android.R.layout.simple\u list\u item\u 1,父项,false);
TextView tv=(TextView)convertView.findViewById(android.R.id.text1);
保持架kv=数据获取(位置);
tv.setText(千伏项目);
//将标记设置为视图
tv.setTag(千伏);
返回电视;
}
}
//定制物品
公共枚举数据类型{Old,New}
阶级持有者{
公共数据类型;
公共字符串项=”;
公共持有者(数据类型t,字符串str){
类型=t;
项目=str;
}
}
}
希望它能满足您的期望:)如何创建带节的listview…我使用了sectioned adapter类,并为此传递了节名和Aaray。请详细说明您的查询。这两个节中都有数据吗?还是只有一个数据???@RajaReddy:给您--我使用了与jsharkey.org/blog/2008/08/18/类似的代码…我想要setOnItemClickListen用于标识单击了哪些节元素/项的er方法我应该如何使用setTag以及在方法本身中的何处setOnItemClickListener?抱歉,但没有清除如何使用setTag为ListView构建适配器时,您在其中或其他位置具有一组其他视图的RelativeLayout。无论如何,在创建在getView(…)点进行调整,为特定视图分配setTag(带有可分辨参数),在执行项目时,单击从arg1.getTag()中获取该标记,它将返回对象,您可以随意使用它。这也是我用来使其工作的方法。使用getTag()和setTag()i trie