Android的ListView的适配器OnClickListener问题 [英] Android ListView Adapter OnClickListener issue

查看:210
本文介绍了Android的ListView的适配器OnClickListener问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我创建了一个ListView为每个视图自定义布局。我有几个 onClickListeners 列表视图适配器 的TextView 中的自定义布局的项目之内。该onClickListeners列表视图适配器内的工作,我可以得到视图的位置,但是当我试图在拨打电话的 onClickListeners 在我活性的方法,我得到的不能让一个静态引用非静态方法的错误。于是,我开始将东西静态的,这使事情工作打算,但我敢肯定你们都知道这是一个很大的错误,它终于赶上了我。

到底如何做我访问我的主要活动方式未做方法静态?我在这个新的,所以请原谅我的noobish的问题。谢谢

部分code房源...

 公共类主要的扩展活动{
    私人的ArrayList< D​​ataItem的> dataItems;
    私人DataItemAdapter AA;
    私人的ListView dataListView;

    @覆盖
    公共无效的onCreate(包savedInstanceState){
        super.onCreate(savedInstanceState);
        的setContentView(R.layout.main);

        dataListView =(ListView控件)findViewById(R.id.dataListView);
        dataItems =新的ArrayList< D​​ataItem的>();
        INT渣油= R.layout.dataitem;
        AA =新DataItemAdapter(这一点,渣油,dataItems);
        dataListView.setAdapter(AA);
        dataListView.setItemsCanFocus(真正的);

    populateArray();
}

公共无效populateArray(){
    的DataItem的newitem =新的DataItem(
            2008,法拉利,F430,红,ASX772
        );
    dataItems.add(0,的newitem);
    的newitem =新的DataItem(
            2008,法拉利,F430,黑,TZB123
        );
    dataItems.add(0,的newitem);
    的newitem =新的DataItem(
            2009年,法拉利,F430,红,MIDAS
        );
    dataItems.add(0,的newitem);

    aa.notifyDataSetChanged();
}

公共静态无效modelInfo(INT POS){
    Log.i(modelInfo,=+正);
}

公共静态无效MAKEINFO(INT POS){
    Log.i(MAKEINFO,=+ POS);
}

公共静态无效assetinfo的(INT POS){
    Log.i(assetinfo的,=+正);
}

}


公共类DataItemAdapter扩展ArrayAdapter< D​​ataItem的> {
    私人活动的活动;
    私人诠释的资源;
    私有静态LayoutInflater吹气= NULL;

    公共DataItemAdapter(活动_activity,INT _resource,名单,其中,DataItem的> _items){
        超(_activity,_resource,_items);
        充气=(LayoutInflater)_activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        资源= _resource;
        活动= _activity;
    }

公共静态类ViewHolder {
    TextView的carYear;
    TextView的carMake;
    TextView的carModel;
    TextView的carColor;
    TextView的ASSETTAG;
   }

@覆盖
公共查看getView(INT位置,查看convertView,ViewGroup中父){
    查看VI = convertView;
    ViewHolder持有人;
    如果(convertView == NULL){
        VI = inflater.inflate(资源,NULL);
        持有人=新ViewHolder();
        holder.carYear =(TextView中)vi.findViewById(R.id.carYear);
        holder.carMake =(TextView中)vi.findViewById(R.id.carMake);
        holder.carModel =(TextView中)vi.findViewById(R.id.carModel);
        holder.carColor =(TextView中)vi.findViewById(R.id.carColor);
        holder.assetTag =(TextView中)vi.findViewById(R.id.assetTag);
        vi.setTag(保持器);
    } 其他 {
        支架=(ViewHolder)vi.getTag();
    }

    DataItem的项目=的getItem(位置);

    holder.carYear.setText(item.getCarYear());
    holder.carMake.setText(item.getCarMake());
    holder.carModel.setText(item.getCarModel());
    holder.carColor.setText(item.getCarColor());
    holder.assetTag.setText(item.getAssetTag());

    holder.carYear.setTag(位置);
    holder.assetTag.setTag(位置);

    最后OnClickListener makeListener =新OnClickListener(){
        @覆盖
        公共无效的onClick(视图v){
            的LinearLayout LL =(的LinearLayout)v.getParent();
            TextView的电视=(TextView中)ll.getChildAt(0);
            整数POS =(整数)tv.getTag();
            main.makeInfo(POS);
        }
    };
    holder.carMake.setOnClickListener(makeListener);

    最后OnClickListener modelListener =新OnClickListener(){
        @覆盖
        公共无效的onClick(视图v){
            的LinearLayout LL =(的LinearLayout)v.getParent();
            TextView的电视=(TextView中)ll.getChildAt(0);
            整数POS =(整数)tv.getTag();
            main.modelInfo(POS);

        }
   };

    holder.carModel.setOnClickListener(modelListener);

    最后OnClickListener assetListener =新OnClickListener(){
        @覆盖
        公共无效的onClick(视图v){
            的LinearLayout LL =(的LinearLayout)v.getParent();
            TextView的电视=(TextView中)ll.getChildAt(0);
            整数POS =(整数)tv.getTag();
            main.assetInfo(POS);
        }
    };
    holder.assetTag.setOnClickListener(assetListener);

    返回六;
}
 

解决方案

为什么你不附加一个onItemClickListener到你的活动你的ListView,而不是从在ListView每个内部景观进行项目单击

  dataListView =(ListView控件)findViewById(R.id.dataListView);
        dataItems =新的ArrayList< D​​ataItem的>();
        INT渣油= R.layout.dataitem;
        AA =新DataItemAdapter(这一点,渣油,dataItems);
        dataListView.setAdapter(AA);
        //附加一个监听器列表视图
        dataListView.setOnItemClickListener(听众);

        dataListView.setItemsCanFocus(真正的);
 

和你的听众对onItemClick方法中可以访问活动的方法。

编辑1: 该OnItemClickListener给你下面的参数,适配器视图父,视图中查看,INT位置,长

您个人的TextView认为参数的孩子,你可以访问它获得childAt ......是这样的:

  OnItemClickListener监听器=新OnItemClickListener(){

  @覆盖
  onItemClick(适配器视图<>母公司视图中查看,INT位置,长的id){
      ((TextView中)view.findViewById(R.id.yourTextViewId))的getText();
      //或做你的东西
  }

}
 

编辑2:

您的主要活动,请记住,按照惯例,所有的类名都大写,所以主类必须是主类

 公共类主要扩展活动{
    私人的ArrayList< D​​ataItem的> dataItems;
    私人DataItemAdapter AA;
    私人的ListView dataListView;

    @覆盖
    公共无效的onCreate(包savedInstanceState){
        super.onCreate(savedInstanceState);
        的setContentView(R.layout.main);

        dataListView =(ListView控件)findViewById(R.id.dataListView);
        dataItems =新的ArrayList< D​​ataItem的>();
        INT渣油= R.layout.dataitem;
        AA =新DataItemAdapter(这一点,渣油,dataItems);
        dataListView.setAdapter(AA);
        dataListView.setItemsCanFocus(真正的);

    populateArray();
}

公共无效populateArray(){
    的DataItem的newitem =新的DataItem(
            2008,法拉利,F430,红,ASX772
        );
    dataItems.add(0,的newitem);
    的newitem =新的DataItem(
            2008,法拉利,F430,黑,TZB123
        );
    dataItems.add(0,的newitem);
    的newitem =新的DataItem(
            2009年,法拉利,F430,红,MIDAS
        );
    dataItems.add(0,的newitem);

    aa.notifyDataSetChanged();
}

公共无效modelInfo(INT POS){
    Log.i(modelInfo,=+正);
}

公共无效MAKEINFO(INT POS){
    Log.i(MAKEINFO,=+ POS);
}

公共无效assetinfo的(INT POS){
    Log.i(assetinfo的,=+正);
}
}
 

现在,您的适配器

 公共类DataItemAdapter扩展ArrayAdapter< D​​ataItem的> {
    私人活动的活动;
    私人诠释的资源;
    私人LayoutInflater充气= NULL;

    公共DataItemAdapter(活动_activity,INT _resource,名单,其中,DataItem的> _items){
        超(_activity,_resource,_items);
        充气=(LayoutInflater)_activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        //我总是这样做的方式,但我不认为这是错误
        //充气= LayoutInflater.from(_activity.getBaseContext());
        资源= _resource;
        活动= _activity;
    }

公共静态类ViewHolder {
    TextView的carYear;
    TextView的carMake;
    TextView的carModel;
    TextView的carColor;
    TextView的ASSETTAG;
   }

@覆盖
公共查看getView(INT位置,查看convertView,ViewGroup中父){
    查看VI = convertView;
    ViewHolder持有人;
    如果(convertView == NULL){
        VI = inflater.inflate(资源,NULL);
        持有人=新ViewHolder();
        holder.carYear =(TextView中)vi.findViewById(R.id.carYear);
        holder.carMake =(TextView中)vi.findViewById(R.id.carMake);
        holder.carModel =(TextView中)vi.findViewById(R.id.carModel);
        holder.carColor =(TextView中)vi.findViewById(R.id.carColor);
        holder.assetTag =(TextView中)vi.findViewById(R.id.assetTag);
        vi.setTag(保持器);
    } 其他 {
        支架=(ViewHolder)vi.getTag();
    }

    DataItem的项目=的getItem(位置);

    holder.carYear.setText(item.getCarYear());
    holder.carMake.setText(item.getCarMake());
    holder.carModel.setText(item.getCarModel());
    holder.carColor.setText(item.getCarColor());
    holder.assetTag.setText(item.getAssetTag());

    holder.carYear.setTag(位置);
    holder.assetTag.setTag(位置);

    最后OnClickListener makeListener =新OnClickListener(){
        @覆盖
        公共无效的onClick(视图v){
            的LinearLayout LL =(的LinearLayout)v.getParent();
            TextView的电视=(TextView中)ll.getChildAt(0);
            整数POS =(整数)tv.getTag();
            //main.makeInfo(pos);
            ((主要)活动).makeInfo(POS);
        }
    };
    holder.carMake.setOnClickListener(makeListener);

    最后OnClickListener modelListener =新OnClickListener(){
        @覆盖
        公共无效的onClick(视图v){
            的LinearLayout LL =(的LinearLayout)v.getParent();
            TextView的电视=(TextView中)ll.getChildAt(0);
            整数POS =(整数)tv.getTag();
            //main.modelInfo(pos);
            ((主要)活动).modelInfo(POS);
        }
   };

    holder.carModel.setOnClickListener(modelListener);

    最后OnClickListener assetListener =新OnClickListener(){
        @覆盖
        公共无效的onClick(视图v){
            的LinearLayout LL =(的LinearLayout)v.getParent();
            TextView的电视=(TextView中)ll.getChildAt(0);
            整数POS =(整数)tv.getTag();
            //main.assetInfo(pos);
            ((主要)活动).assetInfo(POS);
        }
    };
    holder.assetTag.setOnClickListener(assetListener);

    返回六;
}
 

希望它的工作原理:)

I created a ListView with a custom layout for each view. I have several onClickListeners within the list view adapter for TextView items within the custom layout. The onClickListeners work within the list view adapter and I can obtain the position of the view, but when I try to make calls within the onClickListeners to methods in my activity, I get the "Cannot make a static reference to a non-static method" errors. So I started converting things to static, which made things work as intended, but I'm sure you all know it's a big mistake, which has finally caught up with me.

How the heck do I access methods in my main activity without making the methods static?? I'm new at this, so please forgive my noobish question. Thanks

partial code listing...

public class main extends Activity {
    private ArrayList<DataItem> dataItems;
    private DataItemAdapter aa;
    private ListView dataListView;  

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        dataListView = (ListView)findViewById(R.id.dataListView);     
        dataItems = new ArrayList<DataItem>();
        int resID = R.layout.dataitem;
        aa = new DataItemAdapter(this, resID, dataItems);
        dataListView.setAdapter(aa);
        dataListView.setItemsCanFocus(true);

    populateArray();
}

public void populateArray() {
    DataItem newItem = new DataItem(
            "2008","Ferrari","F430","Red","ASX772"
        );
    dataItems.add(0, newItem);
    newItem = new DataItem(
            "2008","Ferrari","F430","Black","TZB123"
        );
    dataItems.add(0, newItem);
    newItem = new DataItem(
            "2009","Ferrari","F430","Red","MIDAS"
        );
    dataItems.add(0, newItem);      

    aa.notifyDataSetChanged();
}

public static void modelInfo(int pos) {
    Log.i("modelInfo", "=" + pos);
}

public static void makeInfo(int pos) {
    Log.i("makeInfo", "=" + pos);
}

public static void assetInfo(int pos) {
    Log.i("assetInfo", "=" + pos);
}

}


public class DataItemAdapter extends ArrayAdapter<DataItem> {
    private Activity activity;
    private int resource;
    private static LayoutInflater inflater=null;

    public DataItemAdapter(Activity _activity,int _resource,List<DataItem> _items) {
        super(_activity, _resource, _items);
        inflater = (LayoutInflater)_activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        resource = _resource;
        activity = _activity;
    }

public static class ViewHolder {
    TextView carYear;
    TextView carMake;
    TextView carModel;
    TextView carColor;
    TextView assetTag;
   }

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    View vi=convertView;
    ViewHolder holder;
    if (convertView == null) {
        vi = inflater.inflate(resource, null);
        holder=new ViewHolder();
        holder.carYear = (TextView)vi.findViewById(R.id.carYear);
        holder.carMake = (TextView)vi.findViewById(R.id.carMake);
        holder.carModel = (TextView)vi.findViewById(R.id.carModel);
        holder.carColor = (TextView)vi.findViewById(R.id.carColor);
        holder.assetTag = (TextView)vi.findViewById(R.id.assetTag);
        vi.setTag(holder);
    } else {
        holder=(ViewHolder)vi.getTag();
    }

    DataItem item = getItem(position);  

    holder.carYear.setText(item.getCarYear());
    holder.carMake.setText(item.getCarMake());
    holder.carModel.setText(item.getCarModel());
    holder.carColor.setText(item.getCarColor());
    holder.assetTag.setText(item.getAssetTag());

    holder.carYear.setTag(position);
    holder.assetTag.setTag(position);

    final OnClickListener makeListener = new OnClickListener() {
        @Override
        public void onClick(View v) {
            LinearLayout ll = (LinearLayout)v.getParent();
            TextView tv = (TextView)ll.getChildAt(0);
            Integer pos = (Integer) tv.getTag();
            main.makeInfo(pos);
        }
    };
    holder.carMake.setOnClickListener(makeListener);

    final OnClickListener modelListener = new OnClickListener() {
        @Override
        public void onClick(View v) {
            LinearLayout ll = (LinearLayout)v.getParent();
            TextView tv = (TextView)ll.getChildAt(0);
            Integer pos = (Integer) tv.getTag();
            main.modelInfo(pos);

        }
   };        

    holder.carModel.setOnClickListener(modelListener);

    final OnClickListener assetListener = new OnClickListener() {
        @Override
        public void onClick(View v) {
            LinearLayout ll = (LinearLayout)v.getParent();
            TextView tv = (TextView)ll.getChildAt(0);
            Integer pos = (Integer) tv.getTag();
            main.assetInfo(pos);
        }
    };
    holder.assetTag.setOnClickListener(assetListener);        

    return vi;
}

解决方案

why you dont attach an onItemClickListener to your ListView in your activity, instead of perform ItemClick from each inner view in the ListView

        dataListView = (ListView)findViewById(R.id.dataListView);     
        dataItems = new ArrayList<DataItem>();
        int resID = R.layout.dataitem;
        aa = new DataItemAdapter(this, resID, dataItems);
        dataListView.setAdapter(aa);
        //attach a listener to the list view
        dataListView.setOnItemClickListener (listener);

        dataListView.setItemsCanFocus(true);

and inside your listener on onItemClick method you can access the activity methods.

EDIT 1: the OnItemClickListener gives to you the following parameters, AdapterView parent, View view, int position, long

your individual TextView is a child of the view parameter and you can access to it getting the childAt... something like this:

OnItemClickListener listener = new OnItemClickListener (){

  @Override
  onItemClick(AdapterView<?> parent, View view, int position, long id){
      ((TextView)view.findViewById(R.id.yourTextViewId)).getText();
      //or do your stuff
  }

}

EDIT 2:

your main activity, remember, by convention all Class name are capitalized, so main class must be Main class

public class Main extends Activity {
    private ArrayList<DataItem> dataItems;
    private DataItemAdapter aa;
    private ListView dataListView;  

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        dataListView = (ListView)findViewById(R.id.dataListView);     
        dataItems = new ArrayList<DataItem>();
        int resID = R.layout.dataitem;
        aa = new DataItemAdapter(this, resID, dataItems);
        dataListView.setAdapter(aa);
        dataListView.setItemsCanFocus(true);

    populateArray();
}

public void populateArray() {
    DataItem newItem = new DataItem(
            "2008","Ferrari","F430","Red","ASX772"
        );
    dataItems.add(0, newItem);
    newItem = new DataItem(
            "2008","Ferrari","F430","Black","TZB123"
        );
    dataItems.add(0, newItem);
    newItem = new DataItem(
            "2009","Ferrari","F430","Red","MIDAS"
        );
    dataItems.add(0, newItem);      

    aa.notifyDataSetChanged();
}

public void modelInfo(int pos) {
    Log.i("modelInfo", "=" + pos);
}

public void makeInfo(int pos) {
    Log.i("makeInfo", "=" + pos);
}

public void assetInfo(int pos) {
    Log.i("assetInfo", "=" + pos);
}
}

Now, your adapter

public class DataItemAdapter extends ArrayAdapter<DataItem> {
    private Activity activity;
    private int resource;
    private LayoutInflater inflater=null;

    public DataItemAdapter(Activity _activity,int _resource,List<DataItem> _items) {
        super(_activity, _resource, _items);
        inflater = (LayoutInflater)_activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        //i always do this way, but i dont think this is the error
        //inflater = LayoutInflater.from(_activity.getBaseContext());
        resource = _resource;
        activity = _activity;
    }

public static class ViewHolder {
    TextView carYear;
    TextView carMake;
    TextView carModel;
    TextView carColor;
    TextView assetTag;
   }

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    View vi=convertView;
    ViewHolder holder;
    if (convertView == null) {
        vi = inflater.inflate(resource, null);
        holder=new ViewHolder();
        holder.carYear = (TextView)vi.findViewById(R.id.carYear);
        holder.carMake = (TextView)vi.findViewById(R.id.carMake);
        holder.carModel = (TextView)vi.findViewById(R.id.carModel);
        holder.carColor = (TextView)vi.findViewById(R.id.carColor);
        holder.assetTag = (TextView)vi.findViewById(R.id.assetTag);
        vi.setTag(holder);
    } else {
        holder=(ViewHolder)vi.getTag();
    }

    DataItem item = getItem(position);  

    holder.carYear.setText(item.getCarYear());
    holder.carMake.setText(item.getCarMake());
    holder.carModel.setText(item.getCarModel());
    holder.carColor.setText(item.getCarColor());
    holder.assetTag.setText(item.getAssetTag());

    holder.carYear.setTag(position);
    holder.assetTag.setTag(position);

    final OnClickListener makeListener = new OnClickListener() {
        @Override
        public void onClick(View v) {
            LinearLayout ll = (LinearLayout)v.getParent();
            TextView tv = (TextView)ll.getChildAt(0);
            Integer pos = (Integer) tv.getTag();
            //main.makeInfo(pos);
            ((Main)activity).makeInfo(pos);
        }
    };
    holder.carMake.setOnClickListener(makeListener);

    final OnClickListener modelListener = new OnClickListener() {
        @Override
        public void onClick(View v) {
            LinearLayout ll = (LinearLayout)v.getParent();
            TextView tv = (TextView)ll.getChildAt(0);
            Integer pos = (Integer) tv.getTag();
            //main.modelInfo(pos);
            ((Main)activity).modelInfo(pos);
        }
   };        

    holder.carModel.setOnClickListener(modelListener);

    final OnClickListener assetListener = new OnClickListener() {
        @Override
        public void onClick(View v) {
            LinearLayout ll = (LinearLayout)v.getParent();
            TextView tv = (TextView)ll.getChildAt(0);
            Integer pos = (Integer) tv.getTag();
            //main.assetInfo(pos);
            ((Main)activity).assetInfo(pos);
        }
    };
    holder.assetTag.setOnClickListener(assetListener);        

    return vi;
}

hope it works :)

这篇关于Android的ListView的适配器OnClickListener问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆