2010-12-16 105 views
10

我爲每個視圖創建了一個具有自定義佈局的ListView。我有幾個onClickListeners內的列表視圖適配器TextView項目內的自定義佈局。 onClickListeners在列表視圖適配器中工作,我可以獲取視圖的位置,但是當我嘗試在onClickListeners內調用我的活動中的方法時,我得到「無法對非靜態方法進行靜態引用」錯誤。所以我開始把事情轉化爲靜態,這使事情按預期工作,但我相信你們都知道這是一個很大的錯誤,終於趕上了我。Android ListView適配器OnClickListener問題

如何在我的主要活動中訪問方法而不使方法靜態?我是這個新手,所以請原諒我的問題。由於

部分代碼...

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; 
} 

回答

26

爲什麼你不重視的onItemClickListener到你的活動你的ListView,而不是從每個內部視圖在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); 

和在onItemClick方法的監聽器中,您可以訪問活動方法。

編輯1: 的OnItemClickListener提供給您下面的參數,適配器視圖父,觀景,INT位置,長

你個人的TextView是視圖參數的孩子,你可以訪問它獲得childAt ......是這樣的:

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 
    } 

} 

編輯2:

您的主要活動,請記住,按照慣例,所有的類名都大寫,所以主類必須是主類

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; 
} 

希望工程:)

+0

感謝響應。 onItemClickListener允許指出哪些單獨的TextView項目在自定義佈局VICE中被點擊,只是指單擊的單個視圖(位置)?怎麼樣?這可能是我錯過的一條信息。 – ReinD 2010-12-16 16:46:00

+0

@ user544751,看到我編輯的帖子 – Franco 2010-12-16 16:55:20

+0

再次感謝。我理解你的例子,但我不需要點擊的價值,我需要知道哪個TextView被點擊。即TextView1,TextView2,TextView3,TextView4。我一直在玩它,但我不知道如何匹配R.id.myTextViewId與被點擊的內容。 – ReinD 2010-12-16 19:21:18