所以我正在开发一个应用程序,其中一个功能是你可以设置警报。下面是我使用适配器放入ListView的两个警报示例。每个项目都有一个ImageView、一个TextView和另一个ImageView。
我的问题是,我将如何打开一个onClickListener
的不同图像,甚至可能是文本取决于我如何做的事情。
例如,当您单击“x”时,它将从列表中删除该警报(向我展示如何操作并让适配器知道警报已删除将很酷),或单击警报图片将激活/取消激活警报(这将在所看到的两个图像之间切换)。
这个屏幕是由MainActivity
膨胀AlertFragment
而成的。过去我在Fragments实现内部类时遇到过问题,但我现在的设置方式是(我认为)Fragments实现内部类。这是我目前所拥有的,我知道是错误的:
public class AlertsFragment extends Fragment {
private ListView mListView;
private List<Alert> alerts = new ArrayList<>();
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_alerts, container, false);
mListView = (ListView) rootView.findViewById(R.id.alerts_list_view);
alerts.add(new Alert(1, 5400, true));
alerts.add(new Alert(2, 120, false));
AlertsAdapter adapter = new AlertsAdapter(getActivity(), R.layout.alert_item_row, alerts);
mListView.setAdapter(adapter);
getActivity().setTitle(new AlertsItem().getLabel());
mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, final int position, long id) {
Log.d("matt", "list_item");
ImageView img = (ImageView) getActivity().findViewById(R.id.active_image);
img.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
Log.d("matt", "image");
alerts.get(position).setActive(!alerts.get(position).isActive());
}
});
}
});
return rootView;
}
}
你们能给予的任何帮助我都将不胜感激,谢谢。
请输入您的姓名和密码。
下面是我的ArrayAdapter代码:
/**
* Adapter for adding Alerts to ListView
*/
public class AlertsAdapter extends ArrayAdapter {
private int resource;
List<Alert> objects;
public AlertsAdapter(Context context, int resource, List<Alert> objects) {
super(context, resource, objects);
this.resource = resource;
this.objects = objects;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View row = convertView;
AlertHolder holder = null;
if (row == null) {
LayoutInflater inflater = ((Activity)getContext()).getLayoutInflater();
row = inflater.inflate(resource, parent, false);
holder = new AlertHolder();
holder.imgActive = (ImageView)row.findViewById(R.id.active_image);
holder.txtTitle = (TextView)row.findViewById(R.id.txt_title);
holder.txtTime = (TextView)row.findViewById(R.id.txt_time);
row.setTag(holder);
}
else {
holder = (AlertHolder)row.getTag();
}
Alert alert = (Alert) getItem(position);
int image;
if (alert.isActive()) {
image = R.drawable.ic_alert_active_medium;
}
else {
image = R.drawable.ic_alert_inactive_medium;
}
holder.imgActive.setImageResource(image);
holder.txtTitle.setText("Route " + Integer.toString(alert.getRoute()));
int min = alert.getTime() / 60;
int hr = min / 60;
min = min % 60;
holder.txtTime.setText(((hr == 0) ? "" : (Integer.toString(hr) + " hr ")) + Integer.toString(min) + " min ");
return row;
}
private static class AlertHolder {
ImageView imgActive;
TextView txtTitle;
TextView txtTime;
}
}
4条答案
按热度按时间ie3xauqp1#
创建你自己的
Adapter
来扩展ArrayAdapter
(参见this link),重写getView()
方法,在那里你可以将OnClickListener
添加到ListView
的每个View
的子节点中。要通知ListView
一个子节点被删除,在ListView
的Adapter
上调用notifyDataSetChanged()
。您可以使用
ListView
来解决这个问题,但我建议使用RecyclerView
(Android RecyclerView)。RecyclerView
对更新其子对象(如删除、插入、更新子对象)有更好的支持,并且设置了默认动画。5hcedyr02#
您必须在AlertsAdapter类中管理单击侦听器,以获得单独视图,如x按钮、图像。
oknrviil3#
您可以在onClick方法中处理这个问题。
jucafojl4#
我在这段代码中使用了同样的情况,当我点击行时,我把位置保存到我的保持器中,我想你可以使用同样的代码,改变一小部分代码。