Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/192.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 带节的Listview:如何识别单击了相应节的哪个项_Android - Fatal编程技术网

Android 带节的Listview:如何识别单击了相应节的哪个项

Android 带节的Listview:如何识别单击了相应节的哪个项,android,Android,我正在使用SetonicClickListener来处理带有节的列表。我在这个列表中有两个部分,我希望如果第一部分的任何项目/行被单击,它将禁止启动新活动,如果第二部分的任何项目被单击,它将不做任何事情。我如何确定该项目属于哪个部分????请帮忙 代码片段 SectionedAdapter adapter = new SectionedAdapter() { protected View getHeaderView(String caption, int index,

我正在使用SetonicClickListener来处理带有节的列表。我在这个列表中有两个部分,我希望如果第一部分的任何项目/行被单击,它将禁止启动新活动,如果第二部分的任何项目被单击,它将不做任何事情。我如何确定该项目属于哪个部分????请帮忙 代码片段

 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