在按钮上单击使用自定义适配器将自定义行添加到列表视图
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();
;
}
});
免责声明!代码运行良好,但效率不高。 问题是在将行添加到 列表显示。我希望能够只单击一次 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();
;
}
});