Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/209.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适配器OnClickListener问题_Android - Fatal编程技术网

Android ListView适配器OnClickListener问题

Android ListView适配器OnClickListener问题,android,Android,我为每个视图创建了一个具有自定义布局的ListView。我在列表视图适配器中有几个onClickListeners,用于自定义布局中的TextView项。onClickListeners在列表视图适配器中工作,我可以获取视图的位置,但是当我尝试在onClickListeners中调用活动中的方法时,我会遇到“无法对非静态方法进行静态引用”错误。所以我开始把东西转换成静态的,这使得事情按照预期的方式工作,但我相信你们都知道这是一个很大的错误,这最终让我明白了 我该如何访问我的主要活动中的方法而不使

我为每个视图创建了一个具有自定义布局的ListView。我在列表视图适配器中有几个
onClickListeners
,用于自定义布局中的
TextView
项。onClickListeners在列表视图适配器中工作,我可以获取视图的位置,但是当我尝试在
onClickListeners
中调用活动中的方法时,我会遇到“无法对非静态方法进行静态引用”错误。所以我开始把东西转换成静态的,这使得事情按照预期的方式工作,但我相信你们都知道这是一个很大的错误,这最终让我明白了

我该如何访问我的主要活动中的方法而不使这些方法成为静态的??我是新手,所以请原谅我的粗鲁问题。谢谢

部分代码列表

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;
}
public类主扩展活动{
私有ArrayList数据项;
专用数据适配器aa;
私有ListView数据列表视图;
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
dataListView=(ListView)findViewById(R.id.dataListView);
dataItems=newarraylist();
int resID=R.layout.dataitem;
aa=新的DataItemAdapter(此、剩余、dataItems);
setAdapter(aa);
dataListView.setItemsCanFocus(true);
populateArray();
}
公共无效公共阵列(){
DataItem newItem=新DataItem(
“2008”、“法拉利”、“F430”、“红色”、“ASX772”
);
dataItems.add(0,newItem);
newItem=新数据项(
“2008”、“法拉利”、“F430”、“黑色”、“TZB123”
);
dataItems.add(0,newItem);
newItem=新数据项(
“2009”、“法拉利”、“F430”、“红色”、“迈达斯”
);
dataItems.add(0,newItem);
aa.notifyDataSetChanged();
}
公共静态无效模型信息(int pos){
Log.i(“modelInfo”,“=”+pos);
}
公共静态无效生成信息(int pos){
Log.i(“makeInfo”,“=”+pos);
}
公共静态无效资产信息(int pos){
Log.i(“assetInfo”,即“=”+pos);
}
}
公共类DataItemAdapter扩展了ArrayAdapter{
私人活动;
私有int资源;
专用静态充气机=空;
公共DataItemAdapter(活动、int资源、列表项){
超级(活动、资源、项目);
充气器=(LayoutInflater)\u activity.getSystemService(Context.LAYOUT\u充气器\u SERVICE);
资源=_资源;
活动=_活动;
}
公共静态类视图持有者{
TextView-carYear;
文本视图卡马克;
TextView carModel;
文本视图carColor;
文本视图资产;
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
视图vi=转换视图;
视窗座;
if(convertView==null){
vi=充气机。充气(资源,空);
holder=新的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=(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());
支架.车年.设置标签(位置);
固定器固定标签(位置);
final OnClickListener makeListener=new OnClickListener(){
@凌驾
公共void onClick(视图v){
LinearLayout ll=(LinearLayout)v.getParent();
TextView tv=(TextView)ll.getChildAt(0);
整数pos=(整数)tv.getTag();
main.makeInfo(pos);
}
};
holder.carMake.setOnClickListener(makeListener);
final OnClickListener modelListener=新OnClickListener(){
@凌驾
公共void onClick(视图v){
LinearLayout ll=(LinearLayout)v.getParent();
TextView tv=(TextView)ll.getChildAt(0);
整数pos=(整数)tv.getTag();
main.modelnfo(pos);
}
};        
holder.carModel.setOnClickListener(modelListener);
最终OnClickListener assetListener=新的OnClickListener(){
@凌驾
公共void onClick(视图v){
LinearLayout ll=(LinearLayout)v.getParent();
TextView tv=(TextView)ll.getChildAt(0);
整数pos=(整数)tv.getTag();
主要资产信息(pos);
}
};
holder.assetTag.setOnClickListener(assetListener);
返回vi;
}

为什么不在活动中的ListView中附加一个监听器,而不是从ListView中的每个内部视图执行ItemClick

        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);
dataListView=(ListView)findViewById(R.id.dataListView);
dataItems=newarraylist();
int resID=R.layout.dataitem;
aa=新的DataItemAdapter(此、剩余、dataItems);
setAdapter(aa);
//将侦听器附加到列表视图
dataListView.setOnItemClickListener(listener);
dataListView.setItemsCanFocus(true);
在你的监听器中,你可以访问activity方法

编辑1: OnItemClickListener为您提供以下参数:AdapterView父级、View视图、int位置、long

您的单个TextView是view参数的子级,您可以访问它,并获取子级,如下所示:

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
  }

}
OnItemClickListener=新的OnItemClickListener(){
@凌驾
onItemClick(AdapterView父对象、视图vie
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);
}
}
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;
}