0

ListActivityがあり、リストには、複数のImagesViews、TextViews、およびButtonsを持つ非常に複雑なlistitemsがあります。ボタンをクリックすると、いくつかのテキストビューを編集し、いくつかの背景色を変更したいと思います。私の実装は機能しますが、クリックしたボタンが表示されている最初の行内にある場合に限ります。getChildAt()表示されている行の1つを取得するために使用していますが、どの行を取得するかを知る必要があります。

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でタグを取得できます。このようにして、ボタンがどの位置に属しているかを知ることができます。

ジョーの少しの助けを借りて-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 に答える