簡體   English   中英

在按鈕上單擊,使用自定義適配器將自定義行添加到列表視圖

[英]on button click add custom row to list view using custom adapter

免責聲明! 該代碼可以正常工作,但是效率不高。 問題是在將行添加到列表視圖之前,我必須單擊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;
    }

...

您需要通知適配器您的列表已更改,並且有一個新項

添加:

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

活動:

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

            }
        });

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM