在按钮上单击使用自定义适配器将自定义行添加到列表视图

on button click add custom row to list view using custom adapter

免责声明!代码运行良好,但效率不高。 问题是在将行添加到 列表显示。我希望能够只单击一次 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;

    }

}

片段 activity...

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;
    }

...

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

添加这个:

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();

            }
        });

尝试以下操作:

适配器:

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;
}
}

Activity:

        @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");
    }

这就是问题所在,你做的一切都很好,但点击 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();
                ;

            }
        });