![](/img/trans.png)
[英]Dynamically add items to list view using custom adapter for Android app
[英]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.