【问题标题】:Why cannot add new list in listView?为什么不能在 listView 中添加新列表?
【发布时间】:2015-11-28 15:47:05
【问题描述】:

我的活动中有listView 和图标button。当点击图标时,它应该转到Activity B,最后通过添加一个新列表将Activity B的值返回给A。但现在的问题是我只能创建一个列表。当它有另一个值返回 A 时,它会更新旧列表而不是添加新列表。

我从here得到教程,不同的是我使用startActivityForResult将值从Activity B返回给A。

请帮帮我..我被困在这里一整天了...

活动 A

 int mClickedPosition; // add list

  @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case R.id.addDetails:
                View menuItemView = findViewById(R.id.addDetails);
                PopupMenu po = new PopupMenu(this, menuItemView); //for drop-down menu
                po.getMenuInflater().inflate(R.menu.popup_details, po.getMenu());
                po.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
                public boolean onMenuItemClick(MenuItem item) {
                Toast.makeText(getApplication(), "You Clicked : " + item.getTitle(), Toast.LENGTH_SHORT).show();
                if ("Add Work Details".equals(item.getTitle())) {
                mClickedPosition = -1;
                Intent intent = new Intent(getApplication(), Add_Details_Information.class);  // go to Details class
                startActivityForResult(intent, PROJECT_REQUEST_CODE);
                }
                   return true;
                   }
                });
                po.show(); //showing popup menu
             }
                 return super.onOptionsItemSelected(item);

    }

  @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) { // receive from Add_Details_Information
       if(requestCode==PROJECT_REQUEST_CODE)
       {
                ReceiveProject = data.getStringExtra("Project");
                ReceiveDescription = data.getStringExtra("Description");
                ReceiveProgress = data.getIntExtra("progress",0);
                ReceiveTimeIn = data.getStringExtra("TimeIn");
                ReceiveTimeOut = data.getStringExtra("TimeOut");
                ArrayList<SearchResults> searchResults = GetSearchResults(ReceiveProject, ReceiveDescription, ReceiveProgress, ReceiveTimeIn, ReceiveTimeOut);
                (new MyCustomBaseAdapter(this,searchResults)).notifyDataSetChanged();
                listview.setAdapter(new MyCustomBaseAdapter(this,searchResults));
        }
        else if(requestCode==CAMERA_REQUEST_CODE)
       {

       }
    }

    private ArrayList<SearchResults> GetSearchResults(String p, String d,int pro, String i, String o) {
        ArrayList<SearchResults> results = new ArrayList<SearchResults>();
        SearchResults sr1=new SearchResults();
        sr1.setProject(" Project/Service/Training : " + p);
        sr1.setDescription(" Description : " + d);
        sr1.setProgress(" Progress : " + pro);
        sr1.setTimeIn(" Time In : " + i);
        sr1.setTimeOut(" Time Out : " + o);
        if(mClickedPosition==-1)
        {
            results.add(sr1);
        }
        return results;

    }

MyCustomBaseAdapter

public class MyCustomBaseAdapter extends BaseAdapter{   // for ListView in WorkDetailsTable


        private static ArrayList<SearchResults> searchArrayList;

        private LayoutInflater mInflater;

        public MyCustomBaseAdapter(Context context, ArrayList<SearchResults> results) {
            searchArrayList = results;
            mInflater = LayoutInflater.from(context);
        }

        public int getCount() {
            return searchArrayList.size();
        }

        public Object getItem(int position) {
            return searchArrayList.get(position);
        }

        public long getItemId(int position) {
            return position;
        }

        public View getView(int position, View convertView, ViewGroup parent) {
            ViewHolder holder;
            if (convertView == null) {
                convertView = mInflater.inflate(R.layout.custom_row_view, null);
                holder = new ViewHolder();
                holder.txtProject= (TextView) convertView.findViewById(R.id.ListProject);
                holder.txtDescription = (TextView) convertView.findViewById(R.id.ListDescription);
                holder.txtProgress = (TextView) convertView.findViewById(R.id.ListProgress);
                holder.txtIn=(TextView)convertView.findViewById(R.id.ListTimeIn);
                holder.txtOut=(TextView)convertView.findViewById(R.id.ListTimeOut);

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

            holder.txtProject.setText(searchArrayList.get(position).getProject());
            holder.txtDescription.setText(searchArrayList.get(position).getDescription());
            holder.txtProgress.setText(searchArrayList.get(position).getProgress());
            holder.txtIn.setText(searchArrayList.get(position).getTimeIn());
            holder.txtOut.setText(searchArrayList.get(position).getTimeOut());

            return convertView;
        }

        static class ViewHolder {
            TextView txtProject;
            TextView txtDescription;
            TextView txtProgress;
            TextView txtIn;
            TextView txtOut;
        }
    }

【问题讨论】:

    标签: android listview android-listview


    【解决方案1】:

    目前不是在 ListView 中添加新项目,而是将 Adapter 的新对象传递给 setAdapter,这将仅显示 ListView 中最新添加的项目,而不是在当前 Adapter 中添加。

    这样做:

    1. 在MyCustomBaseAdapter 类中创建一个方法,用于在数据源中添加新项目,其大小由getCount 方法返回:

    public void addNewItem(String ReceiveProject,String ReceiveDescription,...){
      // add ReceiveProject,ReceiveDescription 
      // in ArrayList which using in Adapter
    
      SearchResults objSearchResults=new SearchResults();
      objSearchResults.setProject(ReceiveProject);
      ....
      searchArrayList.add(objSearchResults);
      this. notifyDataSetChanged();
    }
    

    2. 使用MyCustomBaseAdapter 类中第一次在setAdapter 方法中传递的对象调用addNewItem 方法:

    if(requestCode==PROJECT_REQUEST_CODE)
       {
          MyCustomBaseAdapter objMyCustomBaseAdapter=
                          (MyCustomBaseAdapter)listview.getAdapter();     
       }
    

    【讨论】:

    • 你能再看看我的帖子吗?谢谢
    • 您的意思是我需要在 MyCustomBaseAdapter 中添加 addNewItem() 吗?
    • 好的,我已将addNewItem() 添加到MyCustomBaseAdapter。我需要在 Activity A 中删除这 3 行吗? ArrayList&lt;SearchResults&gt; searchResults = GetSearchResults(ReceiveProject, ReceiveDescription, ReceiveProgress, ReceiveTimeIn, ReceiveTimeOut); (new MyCustomBaseAdapter(this,searchResults)).notifyDataSetChanged(); listview.setAdapter(new MyCustomBaseAdapter(this,searchResults)); }
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-03
    • 2022-10-04
    • 1970-01-01
    • 1970-01-01
    • 2012-11-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多