【问题标题】:How to add an onClickListener to different items in a ListView row如何将 onClickListener 添加到 ListView 行中的不同项目
【发布时间】:2016-04-08 08:18:26
【问题描述】:

所以我正在制作一个应用程序,其中一个功能是您可以设置警报。下面是我使用适配器放入 ListView 的 2 个示例警报。每个项目都有一个 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;
    }
}

【问题讨论】:

  • 尝试将android:gravity="center" 添加到GridView
  • 这不是我要问的,我是问如何为图像设置 onClickListener。
  • 添加您的自定义 ArrayAdapter 代码。当您对行项目的不同部分进行充气时,添加 OnClickListeners。

标签: android listview android-fragments onclicklistener


【解决方案1】:

创建您自己的Adapter,它扩展了ArrayAdapter(参见this link),覆盖getView() 方法,您可以在其中将OnClickListeners 添加到ListView 中的每个View孩子。要通知ListView 一个孩子被移除,请在ListViewAdapter 上致电notifyDataSetChanged()

您可以使用ListView 解决此问题,但我建议使用RecyclerView (Android RecyclerView)。 RecyclerView 更好地支持更新其子项(如删除、插入、更新子项)并设置了默认动画。

【讨论】:

  • 如何从这些列表视图的数据集中删除一个项目?例如,当我单击 x 时,我希望将其删除。我快搞定了,但是随着添加和删除警报的时间的推移,它变得一团糟。
  • 此外,我相信RecyclerView 缺少OnItemClickListener 正是出于这个原因。它旨在手动设置,以便处理此类情况。
【解决方案2】:

您必须在 AlertsAdapter 类中为单独的视图(如 x 按钮、图像)管理点击侦听器。

【讨论】:

    【解决方案3】:

    你可以在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();
            } 
        } 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-26
      • 1970-01-01
      • 1970-01-01
      • 2020-10-07
      • 1970-01-01
      • 1970-01-01
      • 2021-11-13
      相关资源
      最近更新 更多