2013-02-05 46 views
0

我有一个ListActivity和在我的列表中我有非常复杂的listitems与多个ImagesViews TextViews和按钮。当我点击一个按钮时,我想编辑一些textviews并改变一些背景颜色。我的实现工作,但只有当我点击的按钮是在第一行可见。我使用getChildAt()来抓取其中一个可见的行,但我需要知道要抓取哪一行。如何知道android列表中的哪一行按下按钮?

public void onClick(View v){ 
    System.out.println("Something got clicked"); 
    if(v.getId() == R.id.lovebutton){ 
     MainListItem i = mainAdapter.getItem(listView.getFirstVisiblePosition()); 
      i.loved=true; 
      i.loves++; 
      View view; 
       view = listView.getChildAt(0); 
       //view = listView.getChildAt(1); 
      ((TextView) view.findViewById(R.id.lovecount)).setText(String.valueOf(i.loves)); 
      view.findViewById(R.id.lovebutton).setBackgroundColor(Color.parseColor(i.brandLoveColor)); 
      ((ImageView)view.findViewById(R.id.lovebutton)).setImageResource(R.drawable.lovewhite); 
     }} 
+0

你为什么不使用BaseAdapter和分别处理每个视图....? –

+0

ArrayAdapter和BaseAdapter有什么区别?我目前使用ArrayAdapter – mpatten

+0

是ListView的按钮部分吗? –

回答

2

有很多方法可以做到这一点。保存pojo中的状态,在onClick中更新它们并呼叫#notifyDataSetChanged()。 或者, 您可以将位置作为标签添加到适配器的getView中的按钮上。在OnClick中,您可以获取标签。这样你就会知道按钮属于哪个位置。

从乔的帮助不大 - Android: Access child views from a ListView

public void onClick(View v){ 
    System.out.println("Something got clicked"); 
    if(v.getId() == R.id.lovebutton){ 
     int wantedPosition = Integer.parseInt(view.getTag()); 
     int firstPosition = listView.getFirstVisiblePosition() - listView.getHeaderViewsCount(); // This is the same as child #0 
     int wantedChild = wantedPosition - firstPosition; 
     // Say, first visible position is 8, you want position 10, wantedChild will now be 2 
     // So that means your view is child #2 in the ViewGroup: 
     if (wantedChild < 0 || wantedChild >= listView.getChildCount()) { 
      Log.w(TAG, "Unable to get view for desired position, because it's not being displayed on screen."); 
      return; 
     } 
     // Could also check if wantedPosition is between listView.getFirstVisiblePosition() and listView.getLastVisiblePosition() instead. 
     View wantedView = listView.getChildAt(wantedChild); 
     MainListItem i = mainAdapter.getItem(wantedPosition); 
     i.loved=true; 
     i.loves++; 
     ((TextView) view.findViewById(R.id.lovecount)).setText(String.valueOf(i.loves)); 
     view.findViewById(R.id.lovebutton).setBackgroundColor(Color.parseColor(i.brandLoveColor)); 
     ((ImageView)view.findViewById(R.id.lovebutton)).setImageResource(R.drawable.lovewhite); 
    } 
} 
+0

谢谢我最终在按钮上使用了'setTag()',它的工作方式就像一个魅力! – mpatten

1

在listView中得到点击行,你必须使用“OnItemClickListener”。

lv.setOnItemClickListener(new OnItemClickListener() { 

        @Override 
        public void onItemClick(AdapterView<?> arg0, View arg1, 
          int pos, long arg3) { 
         HashMap<String, String> o = (HashMap<String, String>) lv.getItemAtPosition(pos);  
          System.out.println(pos);//This will return your position 

        } 
       }); 
相关问题