Android的ListView的适配器OnClickListener问题 [英] Android ListView Adapter OnClickListener issue
问题描述
我创建了一个ListView为每个视图自定义布局。我有几个 onClickListeners
列表视图适配器 的TextView
中的自定义布局的项目之内。该onClickListeners列表视图适配器内的工作,我可以得到视图的位置,但是当我试图在拨打电话的 onClickListeners
在我活性的方法,我得到的不能让一个静态引用非静态方法的错误。于是,我开始将东西静态的,这使事情工作打算,但我敢肯定你们都知道这是一个很大的错误,它终于赶上了我。
到底如何做我访问我的主要活动方式未做方法静态?我在这个新的,所以请原谅我的noobish的问题。谢谢
部分code房源...
公共类主要的扩展活动{
私人的ArrayList< DataItem的> dataItems;
私人DataItemAdapter AA;
私人的ListView dataListView;
@覆盖
公共无效的onCreate(包savedInstanceState){
super.onCreate(savedInstanceState);
的setContentView(R.layout.main);
dataListView =(ListView控件)findViewById(R.id.dataListView);
dataItems =新的ArrayList< DataItem的>();
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< DataItem的> {
私人活动的活动;
私人诠释的资源;
私有静态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< DataItem的>();
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< DataItem的> dataItems;
私人DataItemAdapter AA;
私人的ListView dataListView;
@覆盖
公共无效的onCreate(包savedInstanceState){
super.onCreate(savedInstanceState);
的setContentView(R.layout.main);
dataListView =(ListView控件)findViewById(R.id.dataListView);
dataItems =新的ArrayList< DataItem的>();
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< DataItem的> {
私人活动的活动;
私人诠释的资源;
私人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屋!