android-fragments 如何将onClickListener添加到ListView行中的不同项

oiopk7p5  于 2022-11-14  发布在  Android
关注(0)|答案(4)|浏览(133)

所以我正在开发一个应用程序,其中一个功能是你可以设置警报。下面是我使用适配器放入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;
    }
}
ie3xauqp

ie3xauqp1#

创建你自己的Adapter来扩展ArrayAdapter(参见this link),重写getView()方法,在那里你可以将OnClickListener添加到ListView的每个View的子节点中。要通知ListView一个子节点被删除,在ListViewAdapter上调用notifyDataSetChanged()
您可以使用ListView来解决这个问题,但我建议使用RecyclerViewAndroid RecyclerView)。RecyclerView对更新其子对象(如删除、插入、更新子对象)有更好的支持,并且设置了默认动画。

5hcedyr0

5hcedyr02#

您必须在AlertsAdapter类中管理单击侦听器,以获得单独视图,如x按钮、图像。

oknrviil

oknrviil3#

您可以在onClick方法中处理这个问题。

public MyViewHolder(final View itemView) {
        super(itemView);

        iconImageView = (ImageView) itemView.findViewById(R.id.myRecyclerImageView);
        iconTextView = (TextView) itemView.findViewById(R.id.myRecyclerTextView);

        itemView.setOnClickListener(this);
        iconTextView.setOnClickListener(this);
        iconImageView.setOnLongClickListener(this);
    } 

    // onClick Listener for view 
    @Override 
    public void onClick(View v) {

        if (v.getId() == iconTextView.getId()){
            Toast.makeText(v.getContext(), "ITEM PRESSED = " + String.valueOf(getAdapterPosition()), Toast.LENGTH_SHORT).show();
        } else { 
            Toast.makeText(v.getContext(), "ROW PRESSED = " + String.valueOf(getAdapterPosition()), Toast.LENGTH_SHORT).show();
        } 
    }
jucafojl

jucafojl4#

我在这段代码中使用了同样的情况,当我点击行时,我把位置保存到我的保持器中,我想你可以使用同样的代码,改变一小部分代码。

public class DeliveryAdapter extends ArrayAdapter<Delivery> {

    public DeliveryAdapter(Context context, List<Delivery> objects) {
        super(context, 0, objects);
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        LayoutInflater inflater = (LayoutInflater) getContext()
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);

        ViewHolder holder;

        if (null == convertView) {
            holder = new ViewHolder();
            convertView = inflater.inflate(
                    R.layout.list_item_delivery,
                    parent,
                    false);

            holder.tvName = convertView.findViewById(R.id.tvName);
            holder.ivCheck = convertView.findViewById(R.id.ivCheck);
            convertView.setTag(holder);
        }else{
            holder = (ViewHolder) convertView.getTag();
        }

        Delivery item = getItem(position);

        holder.tvName.setText(item.getName());
        holder.ivCheck.setVisibility((item.isCheckVisible()) ? View.VISIBLE : View.GONE);
        holder.position = position;

        convertView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                ViewHolder viewHolder = (ViewHolder) view.getTag();
                for (int i = 0; i< getCount(); i++){
                    Delivery currentItem = getItem(i);
                    currentItem.setCheckVisible(viewHolder.position == i);
                }
                notifyDataSetChanged();
            }
        });

        return convertView;
    }

    public static class ViewHolder{
        public ImageView ivCheck;
        public TextView tvName;

        int position;

    }
}

相关问题