更换的ListView行与其他布局的onClick [英] Replacing ListView row with another layout onClick

查看:119
本文介绍了更换的ListView行与其他布局的onClick的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我只TextView的一个ListView。我想这要是我点击一个ListView一行的执行情况,更换按钮一个EditText应该出现,无论我输入的EditText上,点击替换,该listrow应该更新。我面对的是充气名单上的布局我的主要问题row.Can有人告诉我如何实现这一目标?

 公共类ContextMenuActivity延伸活动{
    私人的ListView列表;
    TextView的电视;
    ArrayList的<字符串> alistItems;
    INT loopCount;
    CustomAdapter适配器;
    LayoutInflater充气;
    的TextView TextView的;
    的EditText edtTextToReplace;
    RelativeLayout的rl_inflate;
    查看子女;

    @覆盖
    保护无效的onCreate(包savedInstanceState){
        super.onCreate(savedInstanceState);
        的setContentView(R.layout.contextmenulist);
        的initComponents();
        的setActionListener();
    }

    @覆盖
    公共无效onCreateContextMenu(文本菜单菜单,视图V,
            ContextMenuInfo menuInfo){

        super.onCreateContextMenu(菜单,V,menuInfo);
        menu.setHeaderTitle(「购股权」);
        menu.add(0,v.getId(),0,编辑);
        menu.add(0,v.getId(),0,删除);
        / *
         * MenuInflater充气= getMenuInflater();
         * inflater.inflate(R.menu.context_menu,菜单);
         * /
    }



    私人无效的initComponents(){
        充气= ContextMenuActivity.this.getLayoutInflater();

        名单=(ListView控件)findViewById(R.id.contextmenu_lst_list);
        电视=(TextView中)findViewById(R.id.listitem_txt_item);
        alistItems =新的ArrayList<字符串>();
        为(loopCount = 1; loopCount小于30; loopCount ++){
            alistItems.add(项目+ loopCount);
        }
        prepareView();
    }

    私人无效prepareView(){
        适配器=新CustomAdapter(getApplicationContext(),R.layout.listitem,
                alistItems);
        list.setAdapter(适配器);
        registerForContextMenu(名单);
    }

    私人无效的setActionListener(){

        list.setOnItemClickListener(新OnItemClickListener(){

            @覆盖
            公共无效onItemClick(适配器视图<>为arg0,最终的视图中查看,
                    最终诠释ARG2,长ARG3){
                的System.out.println(ALIST为+ alistItems);
                TextView的=(的TextView)view.findViewById(R.id.listitem_txt_item);
                rl_inflate =(RelativeLayout的)查看
                        .findViewById(R.id.rl_inflate);
                孩子= getLayoutInflater()。膨胀(R.layout.clicklistitem,
                        空值);
                rl_inflate.addView(子);
                textView.setVisibility(View.GONE);
                rl_inflate.setVisibility(View.VISIBLE);
                按钮将my_btn =(按钮)子
                        .findViewById(R.id.clicklistitem_btn_replace);
                edtTextToReplace =(EditText上)子
                        .findViewById(R.id.clicklistitem_edt);
                my_btn.setOnClickListener(新OnClickListener(){

                    @覆盖
                    公共无效的onClick(视图v){
                        textView.setText(edtTextToReplace.getText()的toString());
                        alistItems.set(ARG2,edtTextToReplace.getText()
                                的ToString());
                        rl_inflate.setVisibility(View.GONE);
                        rl_inflate.removeViewInLayout(子);
                        textView.setVisibility(View.VISIBLE);
                        adapter.notifyDataSetChanged();
                    }
                });
            }
        });
    }

    公共类CustomAdapter扩展ArrayAdapter<字符串> {
        ArrayList的<字符串> alistItems;
        INT资源;

        公共CustomAdapter(上下文的背景下,INT资源,
                ArrayList的<字符串> alistItems){
            超(背景下,资源);
            this.alistItems = alistItems;
            this.resource =资源;
        }

        @覆盖
        公众诠释getCount将(){
            返回alistItems.size();
        }

        @覆盖
        公共查看getView(INT位置,查看convertView,ViewGroup中父){
            持有人440 =新的持有人();
            如果(convertView == NULL){
                convertView =气筒
                        .inflate(R.layout.listitem,父母,假);
            }
            holder.tvRow =(TextView中)convertView
                    .findViewById(R.id.listitem_txt_item);
            convertView.setTag(保持器);
            支架=(座)convertView.getTag();
            holder.tvRow.setText(alistItems.get(位置));
            返回convertView;
        }
    }

    类持有人{
        TextView的tvRow;
    }
}
 

解决方案

您可以通过两种方式实现这一目标: -

  1. 首先是在ListView的项目布局添加的EditText和一个按钮,并隐藏他们。现在设置列表视图的onItemClickListener其中隐藏的TextView并显示editext和替换按钮。

  2. 二是建立与编辑文本和一个按钮一个新的布局和设置onItemClickListener的列表视图和行点击时,你可以很容易地膨胀时,布局到你的列表视图的项目布局。

第二个解决方案code: -

inflate.xml

 <的EditText
            机器人:ID =@ + ID / enter_txt
            机器人:layout_width =FILL_PARENT
            机器人:layout_height =WRAP_CONTENT
/>

<按钮
            机器人:ID =@ + ID / btn_replace
            机器人:layout_width =FILL_PARENT
            机器人:layout_height =WRAP_CONTENT
/>
 

* list_view_item.xml *

 <的TextView
            机器人:ID =@ + ID / my_txt发生
            机器人:layout_width =FILL_PARENT
            机器人:layout_height =WRAP_CONTENT
            机器人:文本=ABCD
/>

< RelativeLayout的
            机器人:ID =@ + ID / rl_inflate
            机器人:layout_width =FILL_PARENT
            机器人:layout_height =WRAP_CONTENT
/>
 

列表视图onItemClickListener

  listView.setOnItemClickListener(新OnItemClickListener(){

        @覆盖
        公共无效onItemClick(适配器视图<>母公司视图中查看,
                INT位置,长的id){

                           TextView的txt_view =(TextView中)view.findViewById(R.id.my_txt);

                           txt_view.setVisibility(View.GONE);

                       RelativeLayout的rl_inflate =(RelativeLayout的)view.findViewById(R.id.rl_inflate);
                           查看孩子= getLayoutInflater()膨胀(R.layout.inflate)。
                           rl_inflate.addView(子);


                          按钮将my_btn =(按钮)child.findViewById(R.id.btn_replace);
                          EditText上enter_txt =(EditText上)child.findViewById(R.id.enter_txt);

                          my_btn.setOnClickListener(新OnClickListener(){

            @覆盖
            公共无效的onClick(视图v){
                                 txt_view.setText(enter_txt.getText()的toString());
                                 txt_view.setVisibility(View.VISIBLE);
            }
            });
        }
    });
 

I have a ListView with only TextView. I want an implementation in which if I click on a ListView row, an edittext with a replace button should appear and whatever I type in that edittext and click replace, the listrow should update. My main problem which I face is inflating a layout on List row.Can anybody tell me how to achieve this?

public class ContextMenuActivity extends Activity {
    private ListView list;
    TextView tv;
    ArrayList<String> alistItems;
    int loopCount;
    CustomAdapter adapter;
    LayoutInflater inflater;
    TextView textView;
    EditText edtTextToReplace;
    RelativeLayout rl_inflate;
    View child;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.contextmenulist);
        initComponents();
        setActionListener();
    }

    @Override
    public void onCreateContextMenu(ContextMenu menu, View v,
            ContextMenuInfo menuInfo) {

        super.onCreateContextMenu(menu, v, menuInfo);
        menu.setHeaderTitle("Options");
        menu.add(0, v.getId(), 0, "Edit");
        menu.add(0, v.getId(), 0, "Delete");
        /*
         * MenuInflater inflater = getMenuInflater();
         * inflater.inflate(R.menu.context_menu, menu);
         */
    }



    private void initComponents() {
        inflater = ContextMenuActivity.this.getLayoutInflater();

        list = (ListView) findViewById(R.id.contextmenu_lst_list);
        tv = (TextView) findViewById(R.id.listitem_txt_item);
        alistItems = new ArrayList<String>();
        for (loopCount = 1; loopCount < 30; loopCount++) {
            alistItems.add("Item " + loopCount);
        }
        prepareView();
    }

    private void prepareView() {
        adapter = new CustomAdapter(getApplicationContext(), R.layout.listitem,
                alistItems);
        list.setAdapter(adapter);
        registerForContextMenu(list);
    }

    private void setActionListener() {

        list.setOnItemClickListener(new OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> arg0, final View view,
                    final int arg2, long arg3) {
                System.out.println("alist is " + alistItems);
                textView = (TextView) view.findViewById(R.id.listitem_txt_item);
                rl_inflate = (RelativeLayout) view
                        .findViewById(R.id.rl_inflate);
                child = getLayoutInflater().inflate(R.layout.clicklistitem,
                        null);
                rl_inflate.addView(child);
                textView.setVisibility(View.GONE);
                rl_inflate.setVisibility(View.VISIBLE);
                Button my_btn = (Button) child
                        .findViewById(R.id.clicklistitem_btn_replace);
                edtTextToReplace = (EditText) child
                        .findViewById(R.id.clicklistitem_edt);
                my_btn.setOnClickListener(new OnClickListener() {

                    @Override
                    public void onClick(View v) {
                        textView.setText(edtTextToReplace.getText().toString());
                        alistItems.set(arg2, edtTextToReplace.getText()
                                .toString());
                        rl_inflate.setVisibility(View.GONE);
                        rl_inflate.removeViewInLayout(child);
                        textView.setVisibility(View.VISIBLE);
                        adapter.notifyDataSetChanged();
                    }
                });
            }
        });
    }

    public class CustomAdapter extends ArrayAdapter<String> {
        ArrayList<String> alistItems;
        int resource;

        public CustomAdapter(Context context, int resource,
                ArrayList<String> alistItems) {
            super(context, resource);
            this.alistItems = alistItems;
            this.resource = resource;
        }

        @Override
        public int getCount() {
            return alistItems.size();
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            Holder holder = new Holder();
            if (convertView == null) {
                convertView = inflater
                        .inflate(R.layout.listitem, parent, false);
            }
            holder.tvRow = (TextView) convertView
                    .findViewById(R.id.listitem_txt_item);
            convertView.setTag(holder);
            holder = (Holder) convertView.getTag();
            holder.tvRow.setText(alistItems.get(position));
            return convertView;
        }
    }

    class Holder {
        TextView tvRow;
    }
}

解决方案

You can achieve this in two ways :-

  1. First is in listview's item layout add EditText and a Button and hide them. Now set onItemClickListener of listview in which hide textview and show editext and replace button.

  2. Second is create a new layout with edit text and a button and set onItemClickListener for listview and when clicked on row you can easily inflate that layout into your listview's item layout.

Second Solution code:-

inflate.xml

<EditText
            android:id="@+id/enter_txt"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
/>

<Button
            android:id="@+id/btn_replace"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
/>

*list_view_item.xml*

<TextView
            android:id="@+id/my_txt"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:text="ABCD"
/>

<RelativeLayout
            android:id="@+id/rl_inflate"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
/>

listview onItemClickListener

        listView.setOnItemClickListener(new OnItemClickListener() {

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

                           TextView txt_view = (TextView)view.findViewById(R.id.my_txt);

                           txt_view.setVisibility(View.GONE);

                       RelativeLayout rl_inflate = (RelativeLayout)view.findViewById(R.id.rl_inflate);
                           View child = getLayoutInflater().inflate(R.layout.inflate);
                           rl_inflate.addView(child);


                          Button my_btn = (Button)child.findViewById(R.id.btn_replace);
                          EditText enter_txt = (EditText)child.findViewById(R.id.enter_txt);

                          my_btn.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                                 txt_view.setText(enter_txt.getText().toString());
                                 txt_view.setVisibility(View.VISIBLE);
            }
            });
        }
    });

这篇关于更换的ListView行与其他布局的onClick的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆