0

我有一个 ListActivity,在我的列表中,我有非常复杂的列表项,其中包含多个 ImagesViews TextViews 和 Buttons。当我单击一个按钮时,我想编辑一些文本视图并更改一些背景颜色。我的实现有效,但前提是我单击的按钮位于可见的第一行内。我getChildAt()用来抓取其中一个可见行,但我需要知道要抓取哪一个。

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

2 回答 2

2

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

在 Joe 的帮助下 - Android:从 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);
    }
}
于 2013-02-05T05:12:45.823 回答
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

                    }
                });
于 2013-02-05T05:01:19.967 回答