0

私は作成されたカスタム行でリストビューを開発しますが、リストボタンをクリックしてアラートダイアログボックスを開き、ラジオボタンを選択してダイアログを閉じ、更新機能を呼び出しますが、行テキストを変更する方法.私のコードは以下です.私に解決策を教えてください.and保存された状態のすべての行。

public class AlMessagesAdapter extends ArrayAdapter<DtoAllMessages> {

        private LayoutInflater inflator;
        private ArrayList<DtoAllMessages> userlist;

        public AlMessagesAdapter(Activity context,
                ArrayList<DtoAllMessages> list) {
            super(context, R.layout.custom_list, list);

            this.userlist = list;
            inflator = context.getLayoutInflater();
        }

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

            ViewHolder holder = null;
            if (convertView == null) {
                convertView = inflator.inflate(R.layout.custom_list, null);
                holder = new ViewHolder();
                holder.title = (TextView) convertView.findViewById(R.id.tvName);
                holder.date_cr = (TextView) convertView
                        .findViewById(R.id.tvDate);
                holder.img = (ImageView) convertView.findViewById(R.id.ivIcon);
                holder.tokenBtn = (TextView) convertView
                        .findViewById(R.id.tokenBtn);
                convertView.setTag(holder);
                convertView.setTag(R.id.tvName, holder.title);
                convertView.setTag(R.id.tvDate, holder.date_cr);
                convertView.setTag(R.id.ivIcon, holder.img);
                convertView.setTag(R.id.tokenBtn, holder.tokenBtn);

            } else {
                holder = (ViewHolder) convertView.getTag();
            }

             token = userlist.get(position).getToken();


            token = token.substring(0, token.length() - 3);

            holder.title.setText(userlist.get(position).getName() + "(" + token
                    + ")");

            String type_data = userlist.get(position).getType().toString();

            if ((type_data.equals("text")) || (type_data.equals("photo"))) {
                holder.date_cr.setText(userlist.get(position).getType()
                        + ":Received "
                        + userlist.get(position).getCreated_date());
                holder.tokenBtn.setVisibility(View.VISIBLE);
                list.setItemsCanFocus(true);
            } else if (type_data.equals("out")) {
                holder.date_cr.setText(userlist.get(position).getType()
                        + ":Sent " + userlist.get(position).getCreated_date());
                holder.tokenBtn.setVisibility(View.GONE);
            }

            if (type_data.equals("text")) {
                holder.img.setBackgroundResource(R.drawable.chatmessage);

            } else if (type_data.equals("photo")) {
                holder.img.setBackgroundResource(R.drawable.photomessage);

            } else if (type_data.equals("out")) {

                holder.img.setBackgroundResource(R.drawable.outmessafe);
            }

            if (position % 2 == 0) {
                convertView.setBackgroundResource(R.drawable.whitebackground);
            } else {
                convertView.setBackgroundResource(R.drawable.greybackground);
            }

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

                @Override
                public void onClick(View v) {

                    AlertBoxShow(position);
                }
            });

            return convertView;
        }

        class ViewHolder {
            protected ImageView img;
            protected TextView date_cr;
            protected TextView title;
            protected TextView tokenBtn;
        }
    }

holder.tokenButton をクリックして、以下のコードでアラートダイアログボックスを開きます::

public void AlertBoxShow(int position) {
        final int pos=position;
        Log.v("log_tag"," position ::"+pos);
        final CharSequence[] items = { " 5 ", " 10 ", " 15 "};

        AlertDialog.Builder alt_bld = new AlertDialog.Builder(this);
        alt_bld.setSingleChoiceItems(items, -1,
                new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog,  int which) {

                        switch (which) {
                        case 0:
                            updateStatus(pos,5);
                            dialog.dismiss();
                            // Your code when first option seletced
                            break;
                        case 1:
                            updateStatus(pos,10);
                            // Your code when 2nd option seletced
                            dialog.dismiss();
                            break;
                        case 2:
                            updateStatus(pos,15);
                            dialog.dismiss();
                            // Your code when 3rd option seletced
                            break;
                        }

                    }

                });
        AlertDialog alert = alt_bld.create();
        alert.show();
    }

そして、ホルダー.タイトルsetTextにupdatestatus関数を呼び出し、リスト行を更新する方法と、以下の更新ステータス関数を呼び出します。

private void updateStatus(int index, int radioSelectValue) {

        holder.title.setText(userlist.get(index).getName() + "(" + token
                + ")");


    }
4

2 に答える 2

0

私があなたの質問を理解している限り、ユーザーがアラートボックスで行った選択に従ってリストアイテムのデータを更新しようとしていると思います。その場合は、アダプターの基になるデータを変更します。アダプターの外部でテキストビューを更新しようとしないでください。データを更新してから、アダプターで notifyDataSetChanged() メソッドを呼び出すだけです。それでおしまい。

于 2013-05-10T09:43:56.800 に答える
0

とを使用setTag()getTag()て、クリックされた行アイテムの位置を取得できます。

以下はsetTag()

convertView.setTag(R.id.tokenBtn, postion);

そしてgetTag()中にholder.tokenBtn onClick()

int pos = (Integer)v.getTag(R.id.tokenBtn);
TextView txtview = (TextView)v.getTag(R.id.tvName); // use this TextView 
                                                            to update the value.
AlertBoxShow(pos);
于 2013-05-10T07:48:02.787 に答える