2010-12-16 23 views
10

各ビューのカスタムレイアウトでListViewを作成しました。私はTextViewのカスタムレイアウト内のリストビューアダプタ内にいくつかのonClickListenersを持っています。 onClickListenersはリストビューアダプタ内で動作し、ビューの位置を取得できますが、onClickListeners内のメソッドを自分のアクティビティ内で呼び出しようとすると、「非静的メソッドへの静的参照を作成できません」というメッセージが表示されます。エラー。だから私は物事を静的に変換し始めました。それは物事を意図した通りにしましたが、私はそれが大きなミスであることを知っていると確信しています。Android ListViewアダプタOnClickListenerの問題

メソッドを静的にしなくても、主なアクティビティでメソッドにアクセスするにはどうすればいいですか?私はこれで新しいので、私のnoobish質問を許してください。あなたがあなたの活動にあなたのListViewにonItemClickListenerを添付して、代わりのリストビュー

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

に各インナービューからによってitemClickを実行していけない理由は感謝

部分コードリスト...

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

onItemClickメソッドのリスナーの内部で、アクティビティメソッドにアクセスできます。

EDIT 1: OnItemClickListenerがあなたに次のパラメータを与え、AdapterView親、ビュービュー、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 
    } 

} 

EDIT 2:

あなたの主な活動、慣例により、すべてのクラスの名前を覚えて資産計上され、そのメインクラスはメインクラスでなければなりません

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

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); 
} 
} 
、お使いのアダプタは、それが:)働く対応するための

+0

感謝願っています。 onItemClickListenerは、クリックされた個々のビュー(位置)を参照するだけで、個々のTextViewアイテムのどれがカスタムレイアウトVICE内でクリックされたかを示すことができますか?どうやって?それはおそらく私が紛失している情報の一部です。 – ReinD

+0

@ user544751、私の編集後の記事を参照してください – Franco

+0

もう一度ありがとうございます。私はあなたの例を理解していますが、クリックされたものの価値は必要ありません。どのTextViewがクリックされたかを知る必要があります。すなわち、TextView1、TextView2、TextView3、TextView4。私はそれを試してきましたが、R.id.myTextViewIdとクリックされたものをどのようにマッチさせるのか分かりません。 – ReinD

関連する問題