android(2)在listView中设置长按显示button,实现删除item

之前写的第一个代码,只是实现了使用baseadapter 适配器显示listview,但是,在其中的一个button,并没有加上实质性的内容。现在,我们要为这个listview中的button设置长按显示button,并且点击之后能够删除这个item。(以后看见这些的时候,记得,你写这个玩意很辛苦)
1.首先,修改xml文件,将button的属性设置为不可见。代码如下:

  

2.在baseadapter中设置获取button的语句,以及设置button点击监听
代码如下

package com.sellsapp.message;

import java.util.List;

import com.sellsapp.R;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;

public class msgAdapter extends BaseAdapter{

    private Context context;
    private List list=null;
        public msgAdapter(Context context,List list){
            this.context=context;
            this.list=list;
        }
    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        // TODO 自动生成的方法存根
        ViewHolder holder=null;
        //Iterator it=list.iterator();
        message msg=list.get(position);
        if(convertView==null){
            holder=new ViewHolder();
            convertView = LayoutInflater.from(context).inflate(R.layout.message_item, null);
            holder.image=(ImageView) convertView.findViewById(R.id.Msgimage);
            holder.text=(TextView) convertView.findViewById(R.id.Msgtext);
            holder.text2=(TextView) convertView.findViewById(R.id.Msgtext2);
            holder.delete=(Button) convertView.findViewById(R.id.delete);//获取button
            convertView.setTag(holder);
        }else {
            holder=(ViewHolder) convertView.getTag();

        }

        holder.image.setImageResource(msg.getMsgimage());
        holder.text.setText(msg.getMsgtext());
        holder.text2.setText(msg.getMsgtext2());
        //设置监听点击删除
        holder.delete.setOnClickListener(new OnClickListener(){

            @Override
            public void onClick(View v) {
                // TODO 自动生成的方法存根
                list.remove(position);

                notifyDataSetChanged();
            }}


                );

        return convertView;
    }


    @Override
    public int getCount() {
        // TODO 自动生成的方法存根
        return list.size();
    }

    @Override
    public Object getItem(int position) {
        // TODO 自动生成的方法存根
        return list.get(position);
    }

    @Override
    public long getItemId(int position) {
        // TODO 自动生成的方法存根
        return position;
    }
    final static class ViewHolder {


        ImageView image;
        TextView text;
        TextView text2;
        Button delete;
    }   
}

3.这里是最重要的,也是最难的,在原来的Activity或者fragment中为listview设置长按监听,当长按item的时候,显示button,当点击item时,跳转到另一个Action,button显示时,点击删除item,
代码如下:

package com.sellsapp.message;

import java.util.ArrayList;
import java.util.List;

import com.sellsapp.R;

import android.content.Intent;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.AdapterView.OnItemLongClickListener;
import android.widget.Button;
import android.widget.ListView;

//消息的fragment
public class MessageFragment extends Fragment {


    private List list=new ArrayList();

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {

        View view = inflater.inflate(R.layout.message_fragment, null);
        init(view);
        return view;


    }

    //需要实现功能 的代码全部写在这里面
    private void init(View view) {
        initlist();
        msgAdapter adapter=new msgAdapter(this.getActivity(),list);
        //这里用getActivity()获取他的activity,虽然我不知到对不对,但是值得一试
        final ListView msgList=(ListView) view.findViewById(R.id.messagelist);
        msgList.setAdapter(adapter);

        //item单击监听,跳转刀其他activity
        msgList.setOnItemClickListener(new OnItemClickListener(){
                        @Override
            public void onItemClick(AdapterView arg0, View arg1, int arg2,
                    long arg3) {
                // TODO 自动生成的方法存根
                            Button btn= (Button) arg1.findViewById(R.id.delete);
                            if(btn.getVisibility() == View.VISIBLE){
                            btn.setVisibility(View.INVISIBLE);
                            }
                            Intent intent=new Intent(getActivity(),TestActivity.class);
                            getActivity().startActivity(intent);

            }

        });
            //长按监听,实现长按显示Button
        msgList.setOnItemLongClickListener(new OnItemLongClickListener(){

            @Override
            public boolean onItemLongClick(AdapterView arg0, View arg1,
                    int arg2, long arg3) {

                // TODO 自动生成的方法存根
                Button btn= (Button) arg1.findViewById(R.id.delete);
                if(btn.getVisibility() == View.INVISIBLE){
                btn.setVisibility(View.VISIBLE);
                }
                else{
                btn.setVisibility(View.INVISIBLE);
                }   
                return true;//关于返回值,若返回False,则是当长按时,既调用onItemLongClick,同时调用onItemLongClick后
                //还会调用onItemClick,就是说会同时调用onItemLongClick,和onItemClick,
                //若返回true,则只调用onItemLongClick
            }


        });
}
    public void initlist(){
        //list.clear();
        message msg=new message(R.drawable.ic_launcher,"hello","我帅不帅啊");
        list.add(msg);
    }

}

好的,至于testActivity ,只是一个普通的Activity ,随便设置即可。
关于OnItemlongClicklistener()中参数的问题,具体如下

 public abstract boolean onItemLongClick (AdapterView> parent, View view, int position, long id)



  当按下视图中的项目并保持按下状态(长按)时执行的回调函数。 实现时如果需要访问与选中条目关联的数据,可以调用 getItemAtPosition(position)。
  //参数
  parent //发生点击事件的 AbsListView。
  view    //AbsListView 中被点击的视图。
  position   // 视图在一览中的位置(索引)。
  id //被点击条目的行 ID。
  //返回值
  //如果回调函数处理了长按事件,返回真;否则返回假。

这一次大致就是如此。
4.在这个生成文件中的问题,由于采用的时fragment,当从Activity中取得fragment的视图的时候,每次都会初始化一边fragment的视图,每次都调用其中的initlist()函数,造成每次都会多生成一个item,下一次,将会解决这个问题
本次记录结束

你可能感兴趣的:(android开发)