【问题标题】:on button click add custom row to list view using custom adapter在按钮上单击使用自定义适配器将自定义行添加到列表视图
【发布时间】:2018-02-01 17:08:58
【问题描述】:

免责声明! 代码运行良好,但效率不高。 问题是我必须在将行添加到之前单击 FAB TWICE 列表显示。我希望能够只单击一次 FAB,以便将行添加到 列表视图!

ListItems.java

 public class ListItems {
    int icon;
    String name;
    String detail;




    public ListItems(int icon,String name,String detail){
        super();
        this.icon = icon;
        this.name = name;
        this.detail = detail;

    }

    public String getTitle() {
        return name;
    }

    public String getDescription() {

        return detail;
    }

    public int getIcon() {
        return icon;
    }
}

............适配器............

ListItemHelper.java

  public class ListItemHelper extends ArrayAdapter<ListItems> {
    private final Context context;
    private final ArrayList<ListItems> itemsArrayList;
    public ListItemHelper(Context context, ArrayList<ListItems> itemsArrayList) {
        super(context, R.layout.list_item, itemsArrayList);
        this.context = context;
        this.itemsArrayList = itemsArrayList;

    }





       @Override

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


        LayoutInflater inflater = (LayoutInflater) context

                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);


        View rowView = inflater.inflate(R.layout.list_item, parent, false);


        ImageView iconView = (ImageView) rowView.findViewById(R.id.iv_list_icon);

        TextView labelView = (TextView) rowView.findViewById(R.id.tv_list_name);

        TextView valueView = (TextView) rowView.findViewById(R.id.tv_detail_list);



        labelView.setText(itemsArrayList.get(position).getTitle());

        valueView.setText(itemsArrayList.get(position).getDescription());

        iconView.setImageResource(itemsArrayList.get(position).getIcon());


        return rowView;

    }

}

还有片段活动...

FragmentActivity.java

...

    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);



     //This is where the problem is ..I think!

        fabCall = (FloatingActionButton) view.findViewById(R.id.fab_menu_call);
        fabCall.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View v){
                list = (ListView) getActivity().findViewById(R.id.list);
                list.setAdapter(adapter);
                adapter = new ListItemHelper(getActivity(),generateData());

            }
        });
}



   // Or may the problem is here.. I don't know!

     private ArrayList<ListItems> generateData() {

            ArrayList<ListItems> items = new ArrayList<ListItems>();

            items.add(new ListItems(R.drawable.ic_shortcut_call,"Call","Shortcut added"));


        return items;
    }

...

【问题讨论】:

    标签: java android xml listview listviewitem


    【解决方案1】:

    这是你做所有事情的问题,但点击 fab 首先设置适配器调用,然后将新数据放入适配器尝试此代码

    fabCall.setOnClickListener(new View.OnClickListener(){
                @Override
                public void onClick(View v){
                    list = (ListView) getActivity().findViewById(R.id.list);
                   //first fill the adapter with updated list
                    adapter = new ListItemHelper(getActivity(),generateData())
                   // then set the adapter
                    list.setAdapter(adapter);
                    //notify change
                     adapter.notifyDataSetChanged();
                    ;
    
                }
            });
    

    【讨论】:

    • 成功了!非常感谢您...问题是在初始化适配器之前将适配器分配给列表。
    • 声望低于 15 人的反馈会被记录下来,但不会公开展示。谢谢。
    • 然后接受答案,这样它可以帮助别人
    【解决方案2】:

    尝试以下方法:

    适配器:

    public class ListItemHelper extends ArrayAdapter {
    private Context context;
    public ListItemHelper(Context context, ArrayList<ListItems> itemsArrayList) {
        super(context, R.layout.list_item, itemsArrayList);
        this.context = context;
    }
    
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        LayoutInflater inflater = (LayoutInflater) context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View rowView = inflater.inflate(R.layout.list_item, parent, false);
        ImageView iconView = (ImageView) rowView.findViewById(R.id.iv_list_icon);
        TextView labelView = (TextView) rowView.findViewById(R.id.tv_list_name);
        TextView valueView = (TextView) rowView.findViewById(R.id.tv_detail_list);
    
        labelView.setText(((ListItems)getItem(position)).getTitle());
        valueView.setText(((ListItems)getItem(position)).getDescription());
        iconView.setImageResource(((ListItems)getItem(position)).getIcon());
        return rowView;
    }
    }
    

    活动:

            @Override
        public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
            super.onViewCreated(view, savedInstanceState);
            fabCall = (FloatingActionButton) view.findViewById(R.id.fab_menu_call);
            fabCall.setOnClickListener(new View.OnClickListener(){
                @Override
                public void onClick(View v){
                    adapter.add(generateData());
                }
            });
            list = view.findViewById(R.id.list);
            adapter = new ListItemHelper(getContext(), new ArrayList<ListItems>());
            list.setAdapter(adapter);
        }
    
        private ListItems generateData() {
            return new ListItems(R.drawable.ic_launcher_background,"Call","Shortcut added");
        }
    

    【讨论】:

      【解决方案3】:

      您需要通知适配器您的列表已更改并且有一个新项目

      添加这个:

      adapter.notifyDataSetChanged();

      之后

      adapter = new ListItemHelper(getActivity(),generateData());

      这将解决您的问题


      为什么点击两次就可以了?

      当您单击两次时它起作用了,因为第一次您将向列表中添加新项目并初始化新适配器

      在这一行 -> adapter = new ListItemHelper(getActivity(),generateData());

      以及第二次再次点击时

      您将新适配器设置到此处的列表中 -> list.setAdapter(adapter);

      这会将带有新项目的新内部化适配器连接到列表


      你的代码应该看起来像这样来解决问题

      fabCall.setOnClickListener(new View.OnClickListener(){
                  @Override
                  public void onClick(View v){
                      list = (ListView) getActivity().findViewById(R.id.list);
                      adapter = new ListItemHelper(getActivity(),generateData());
                      list.setAdapter(adapter);
                     
                      adapter.notifyDataSetChanged();
      
                  }
              });
      

      【讨论】:

      • 首先感谢您的回答!但问题还没有解决。我试过你的方法..还有 adapter.setNotifyOnChange(true);它也不起作用。
      • list.setAdapter(adapter);放在adapter = new ListItemHelper(getActivity(),generateData());之后告诉我这是否对你有帮助
      • 你能检查一下 ListItemHelper 类扩展了什么吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-10-15
      • 2011-12-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多