定制的Andr​​oid的ListView项目使用自定义ArrayAdapter如何删除项目项目、自定义、oid、Andr

2023-09-06 09:56:12 作者:你我无言

有几个例子,我有建立这个应用程序,我想删除的项目,当我点击的ImageButton(该行项目XML声明)我试图实现当imagebuttom是pssed $ P $调用的回调,但之后如何删除/移除项目?如何才能做到这一点?THX所有!

这是我的活动:

 公共类MainActivity延伸活动{    @覆盖    保护无效的onCreate(捆绑savedInstanceState){        super.onCreate(savedInstanceState);        的setContentView(R.layout.activity_main);        ORDINE ordine_data [] =新ORDINE []                {                    新ORDINE(Cloudy1),                    新ORDINE(Cloudy2),                    新ORDINE(Cloudy3),                    新ORDINE(Cloudy4),                    新ORDINE(Cloudy5)                };        最终的ArrayList<&ORDINE GT;名单=新的ArrayList<&ORDINE GT;();        的for(int i = 0; I< ordine_data.length ++我){          list.add(ordine_data [I]);        }        最后OrdineAdapter适配器=新OrdineAdapter(这一点,R.layout.order_list_row,ordine_data);         ListView控件列表视图=(ListView控件)findViewById(R.id.listview);        查看标题=(查看)getLayoutInflater()膨胀(R.layout.listview_header,NULL);        listview.addHeaderView(头);        listview.setAdapter(适配器);        //最后StableArrayAdapter适配器=新StableArrayAdapter(这一点,android.R.layout.simple_list_item_1,清单);        //listview.setAdapter(adapter);        listview.setOnItemClickListener(新AdapterView.OnItemClickListener(){          @覆盖          公共无效onItemClick(适配器视图<>母公司,最终意见认为,INT位置,长的id){            最后弦乐项目=(字符串)parent.getItemAtPosition(位置);            view.animate()。setDuration(1000)。阿尔法(0)                .withEndAction(新的Runnable(){                  @覆盖                  公共无效的run(){                    list.remove(项目);                    adapter.notifyDataSetChanged();                    view.setAlpha(1);                  }                });          }        });    }    私有类StableArrayAdapter扩展ArrayAdapter<串GT; {        HashMap的<字符串,整数> mIdMap =新的HashMap<字符串,整数>();        公共StableArrayAdapter(上下文的背景下,INT textViewResourceId,            清单<串GT;对象){          超(背景下,textViewResourceId,对象);          的for(int i = 0; I< objects.size(); ++ I){            mIdMap.put(objects.get(ⅰ),ⅰ);          }        }        @覆盖        众长getItemId(INT位置){          字符串项=的getItem(位置);          返回mIdMap.get(项目);        }        @覆盖        公共布尔hasStableIds(){          返回true;        }      }    @覆盖    公共布尔onCreateOptionsMenu(菜单菜单){        //充气菜单;如果是present这增加了项目操作栏。        。getMenuInflater()膨胀(R.menu.main,菜单);        返回true;    }} 

这是我的适配器:

 公共类OrdineAdapter扩展ArrayAdapter<&ORDINE GT; {    上下文语境;    INT layoutResourceId;    ORDINE数据[] = NULL;    公共OrdineAdapter(上下文的背景下,INT layoutResourceId,ORDINE []数据){        超级(上下文,layoutResourceId,数据);        this.layoutResourceId = layoutResourceId;        this.context =背景;        this.data =数据;    }    @覆盖    公共查看getView(INT位置,查看convertView,父母的ViewGroup){        查看排= convertView;        OrdineHolder支架=无效;        如果(行== NULL)        {            LayoutInflater充气=((活动)上下文).getLayoutInflater();            行= inflater.inflate(layoutResourceId,父母,假);            持有人=新OrdineHolder();            holder.txtTitle =(TextView中)row.findViewById(R.id.txtUserName);            row.setTag(保持器);            的ImageButton btnRemove =(的ImageButton)row.findViewById(R.id.remove_product);            btnRemove.setOnClickListener(新OnClickListener(){                @覆盖                公共无效的onClick(查看为arg0){                    // TODO自动生成方法存根                    INT I;                    I = 0; //这仅用于测试!                }            });        }        其他        {            支架=(OrdineHolder)row.getTag();        }        ORDINE ORDINE =数据[位置]        holder.txtTitle.setText(ordine.title);        返回行;    }    静态类OrdineHolder    {        TextView的txtTitle;    }} 

解决方案

您逝去的 ordine_data 你的 OridneAdapter ;有你的列表变量和 ordine_data 之间没有任何联系。你加入你的 Ordines 你的的ArrayList 使用 ordine_data ,但是,这并不意味着有你传递给 OridneAdapter 列表中的数据之间的链接 Ordines 。您需要使用删除() ViewAdapter (即你的情况变量)来传递 ORDINE 要删除,然后调用 notifyDataSetChanged()。你可以试试这里面的run()

  ArrayAdapter< Ordines>适配器= parent.getAdapter(); adapter.remove(adapter.getItem(位置));adapter.notifyDataSetChanged(); 

另外,我认为你需要调用的start()动画运行。

with few examples i have build this application, I would like to remove the item when I click on the imagebutton( declared on the row item xml) I have tried to implement the callback invoked when the imagebuttom are pressed, but after how can delete/remove the item? How can do that? thx for all!

This is my activity:

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);


        Ordine ordine_data[] = new Ordine[]
                {
                    new Ordine("Cloudy1"),
                    new Ordine("Cloudy2"),
                    new Ordine("Cloudy3"),
                    new Ordine("Cloudy4"),
                    new Ordine("Cloudy5")
                };

        final ArrayList<Ordine> list = new ArrayList<Ordine>();
        for (int i = 0; i < ordine_data.length; ++i) {
          list.add(ordine_data[i]);
        }
        final OrdineAdapter adapter = new OrdineAdapter(this,R.layout.order_list_row, ordine_data);
         ListView listview = (ListView) findViewById(R.id.listview);

        View header = (View)getLayoutInflater().inflate(R.layout.listview_header, null);
        listview.addHeaderView(header);        
        listview.setAdapter(adapter);


        //final StableArrayAdapter adapter = new StableArrayAdapter(this,android.R.layout.simple_list_item_1, list);
        //listview.setAdapter(adapter);

        listview.setOnItemClickListener(new AdapterView.OnItemClickListener() {

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

            final String item = (String) parent.getItemAtPosition(position);
            view.animate().setDuration(1000).alpha(0)
                .withEndAction(new Runnable() {
                  @Override
                  public void run() {
                    list.remove(item);
                    adapter.notifyDataSetChanged();
                    view.setAlpha(1);
                  }
                });
          }

        });
    }




    private class StableArrayAdapter extends ArrayAdapter<String> {

        HashMap<String, Integer> mIdMap = new HashMap<String, Integer>();

        public StableArrayAdapter(Context context, int textViewResourceId,
            List<String> objects) {
          super(context, textViewResourceId, objects);
          for (int i = 0; i < objects.size(); ++i) {
            mIdMap.put(objects.get(i), i);
          }
        }

        @Override
        public long getItemId(int position) {
          String item = getItem(position);
          return mIdMap.get(item);
        }

        @Override
        public boolean hasStableIds() {
          return true;
        }

      }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

}

this is my adapter:

public class OrdineAdapter extends ArrayAdapter<Ordine>{

    Context context; 
    int layoutResourceId;    
    Ordine data[] = null;

    public OrdineAdapter(Context context, int layoutResourceId, Ordine[] data) {
        super(context, layoutResourceId, data);
        this.layoutResourceId = layoutResourceId;
        this.context = context;
        this.data = data;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View row = convertView;
        OrdineHolder holder = null;

        if(row == null)
        {
            LayoutInflater inflater = ((Activity)context).getLayoutInflater();
            row = inflater.inflate(layoutResourceId, parent, false);

            holder = new OrdineHolder();

            holder.txtTitle = (TextView)row.findViewById(R.id.txtUserName);        
            row.setTag(holder);

            ImageButton btnRemove = (ImageButton)row.findViewById(R.id.remove_product);
            btnRemove.setOnClickListener(new OnClickListener(){

                @Override
                public void onClick(View arg0) {
                    // TODO Auto-generated method stub
                    int i;
                    i=0; //this is for testing only!!!

                }

            });
        }
        else
        {
            holder = (OrdineHolder)row.getTag();
        }

        Ordine ordine = data[position];
        holder.txtTitle.setText(ordine.title);


        return row;
    }

    static class OrdineHolder
    {

        TextView txtTitle;
    }
}

解决方案

You are passing ordine_data to your OridneAdapter; there is no connection between your list variable and ordine_data. You are adding your Ordines to your ArrayListusing ordine_data, but this doesn't mean that there is a link between the data you pass to the OridneAdapter and the list of Ordines. You need to use remove() in ViewAdapter(the parent variable in your case) to pass the Ordine to be removed , and then call notifyDataSetChanged(). You can try this inside run():

ArrayAdapter<Ordines> adapter = parent.getAdapter();
 adapter.remove(adapter.getItem(position));
adapter.notifyDataSetChanged();

Also, I think you need to call start() for your Animation to run.