1

実際、私はリストビューを持っていて、アイテムとして「2つの画像+2つのテキストビュー」を持っています。

私が正確にやりたいのは、ユーザーが画像をクリックしたときにテキストビューのテキストを変更したいということです。

public class ListViewCustomAdapter extends BaseAdapter implements OnClickListener{

`ViewHolder holder;`
`ArrayList<Object> itemList;`

`public Activity context;`
`public LayoutInflater inflater;`

`public ListViewCustomAdapter(Activity context,ArrayList<Object> itemList) {`
    `super();`

    `this.context = context;`
    `this.itemList = itemList;`

    `this.inflater =` `(LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);`
`}`

`@Override`
`public int getCount() {`
    `// TODO Auto-generated method stub`
    `return itemList.size();`
`}`

`@Override`
`public Object getItem(int position) {`
    `// TODO Auto-generated method stub`
    `return itemList.get(position);`
`}`

`@Override`
`public long getItemId(int position) {`
    `// TODO Auto-generated method stub`
    `return 0;`
`}`

`public static class ViewHolder`
`{`
    `ImageView plus;`
    `ImageView minus;`
    `TextView question;`
    `TextView score;`
`}`

`@Override`
`public View getView(int position, View convertView, ViewGroup parent) {`
    `// TODO Auto-generated method stub`


    `if(convertView==null)`
    `{`
        `holder = new ViewHolder();`
        `convertView = inflater.inflate(R.layout.listitem_row, null);`

        `holder.plus = (ImageView) convertView.findViewById(R.id.plus);`
        `holder.minus = (ImageView) convertView.findViewById(R.id.minus);`

        `holder.plus.setOnClickListener(this);`
        `holder.minus.setOnClickListener(this);`

        `holder.question = (TextView) convertView.findViewById(R.id.question);`
        `holder.score = (TextView) convertView.findViewById(R.id.score);`

                    `convertView.setTag(holder);`
    `}`
    `else`
        `holder=(ViewHolder)convertView.getTag();`

    `ItemBean bean = (ItemBean) itemList.get(position);`

    `holder.minus.setImageResource(bean.getminus());`
    `holder.plus.setImageResource(bean.getplus());`
    `holder.question.setText(bean.getquestion());`
    `holder.score.setText(bean.getscore());`

    `return convertView;`
`}`

`@Override`
`public void onClick(View v) {`
    `switch(v.getId()) {`
        `case R.id.minus:`
        `{`

            `int score = Integer.getInteger(holder.score.getText().toString());`
            `holder.score.setText(Integer.toString(score-1));`
            `break;`
        `}`
        `case R.id.plus:`
        `{`

            `int score = Integer.getInteger(holder.score.getText().toString());`
            `holder.score.setText(Integer.toString(score+1));`
            `break;`
        `}`
    `}}`

}

nullポインタ例外が発生します。私が問題だと思うのは、このリストビューに複数のアイテムがあり、各アイテムにこのスコアテキストビューアイテムが含まれているように、プログラムはどのテキストビューをターゲットにするかを理解できないことです。

Plzは私を助けてくれます!!

4

5 に答える 5

1

最善の方法は、作成時に ListItem の onClickListener を設定することです。その後、ListItem がクリックされたときの動作を指定できるため、TextView テキストを変更するように指示できます。

そのセットアップを作成するための非常に優れたチュートリアルは次のとおりです

于 2012-04-20T11:36:28.863 に答える
1

convertView.setTag(holder);holder=(ViewHolder)convertView.getTag();` の代わりに convertView.setId(holder); を使用します。および holder=(ViewHolder)convertView.getId();

于 2012-04-20T11:52:40.430 に答える
1

みんな、ありがとう。

しかし、私の問題に対する解決策は非常にシンプルでスマートでした。解決しました。

holder.minus.setTag( holder ); を使用してホルダーを取り付けました。リストビューの各行の各項目 (ボタン/イメージビュー) に対して、次にその特定のボタン/イメージビューの Onclick リスナーで、ホルダー = (ViewHolder)v.getTag(); を使用しています。ListViewのそのアイテムにその特定のホルダーを使用するには:)楽しんでください

@Override public View getView(int position, View convertView, ViewGroup parent) {

        int type = getItemViewType(position);

        System.out.println("getView " + position + " " + convertView + " type = " + type);
        if (convertView == null) {
            holder = new ViewHolder();
            switch (type) {
                case TYPE_ITEM:
                    convertView = mInflater.inflate(R.layout.item, null);
                    holder.score = (TextView)convertView.findViewById(R.id.score);
                    holder.question = (TextView)convertView.findViewById(R.id.question);
                    holder.plus = (ImageView)convertView.findViewById(R.id.plus);


                    holder.minus = (ImageView)convertView.findViewById(R.id.minus);

holder.plus.setTag( ホルダー ); holder.minus.setTag(ホルダー);

                    holder.minus.setOnClickListener(new View.OnClickListener() {

                        @Override
                        public void onClick(View v) {

                            holder = (ViewHolder)v.getTag();

                            String test =holder.score.getText().toString();

                    }
                        }
                    });


                    holder.plus.setOnClickListener(new View.OnClickListener() {

                        @Override
                        public void onClick(View v) {

                            holder = (ViewHolder)v.getTag();

                            String test =holder.score.getText().toString();

                                                    }
                    });


                    break;
                case TYPE_SEPARATOR:

                    convertView = mInflater.inflate(R.layout.heading, null);
                    holder.score = (TextView)convertView.findViewById(R.id.textSeparator);
                    holder.score.setText(mData.get(position));
                    break;
            }
            convertView.setTag(holder);
        } else {
            holder = (ViewHolder)convertView.getTag();
        }
        switch (type) 
        {
            case TYPE_ITEM:

                String temp = mData.get(position);

                break;
            case TYPE_SEPARATOR:

                holder.score.setText(mData.get(position));

                break;
        }
        return convertView;
    }

}
于 2012-05-08T04:16:23.267 に答える
0

まず、ベースアダプタのどのビューにもonClickリスナーを割り当てていません。

次に、行にあるビューにonClickイベントを使用する代わりに、ListLiewにOnItemClickListenerを使用することをお勧めします。これは非常に簡単で、行アイテムのクリックに使用する方が適切です

例えば:

private OnItemClickListener lstClick = new OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> parent, View view,
                 int position, long id) {

        //do whatever you want here
    }
};

次のようにListViewに設定します。

listView.setOnItemClickListener(lstClick);
于 2012-04-20T11:46:22.417 に答える
0

それ以外の場合は、以下のコードを置き換えないでください

`if(convertView==null)`
    `{`
        `holder = new ViewHolder();`
        `convertView = inflater.inflate(R.layout.listitem_row, null);`

        `holder.plus = (ImageView) convertView.findViewById(R.id.plus);`
        `holder.minus = (ImageView) convertView.findViewById(R.id.minus);`

        `holder.plus.setOnClickListener(this);`
        `holder.minus.setOnClickListener(this);`

        `holder.question = (TextView) convertView.findViewById(R.id.question);`
        `holder.score = (TextView) convertView.findViewById(R.id.score);`

                    `convertView.setTag(holder);`
    `}
        `holder=(ViewHolder)convertView.getTag();`

    `ItemBean bean = (ItemBean) itemList.get(position);`

    `holder.minus.setImageResource(bean.getminus());`
    `holder.plus.setImageResource(bean.getplus());`
    `holder.question.setText(bean.getquestion());`
    `holder.score.setText(bean.getscore());`

    `return convertView;`
`}`
于 2012-04-20T11:38:21.013 に答える