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