【问题标题】:How to distinguish between views in a ListFragment with CustomArrayAdapter?如何用 CustomArrayAdapter 区分 ListFragment 中的视图?
【发布时间】:2014-08-15 16:11:38
【问题描述】:

我想知道是否可以在 onListItemClick 中添加逻辑\区分视图? 我有一个包含多个视图的 listFragment,并且想要执行不同的操作。我试图在我的视图上使用 .isPressed() 方法,但没有成功。

这样做的正确方法是什么。 -谢谢。


根据标记答案的建议,我在我的 CustomArrayAdapter 中实现了以下代码,并且一切正常。我有一个 ListFragment 实现了单元格的 onListItemClick 和同一单元格内的可点击 imagesViews。希望这可以帮助下一个人。

public class ZAdapter extends ArrayAdapter<HashMap<String, String>>{

protected static final String TAG = "myLog";
Context context;
ArrayList<HashMap<String,String>> myListOfMaps;

public ZAdapter(Context context, int textViewResourceId,    ArrayList<HashMap<String, String>> myListOfMaps) {
    super(context, textViewResourceId, myListOfMaps);
    // TODO Auto-generated constructor stub
    this.context=context;

    this.myListOfMaps = myListOfMaps;

}


public class MyViewHolder
{

    ImageView editImage;
    TextView tvTitle;
    TextView tvSubTitle;
    TextView tvRepEmail;
    TextView tvRepCell;

    public MyViewHolder(View v)
    {
        editImage = (ImageView) v.findViewById(R.id.row_icon);
         tvTitle = (TextView) v.findViewById(R.id.row_title);
         tvSubTitle = (TextView) v.findViewById(R.id.row_subTitle);
         tvRepEmail = (TextView) v.findViewById(R.id.tvRepEmail);
         tvRepCell = (TextView) v.findViewById(R.id.tvRepCell);
    }


}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
    // TODO Auto-generated method stub
    final int index=position;

    View row = convertView;
    MyViewHolder holder = null;


    if(row==null){
    LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    row = inflater.inflate(R.layout.row, parent, false);
    holder = new MyViewHolder(row);


    row.setTag(holder);

    }else{

        holder = (MyViewHolder) row.getTag();



    }



    holder.editImage.setImageResource(R.drawable.edit_img);holder.editImage.setTag("goEdit");
    holder.tvTitle.setText(myListOfMaps.get(position).get("prod"));
    holder.tvSubTitle.setText(myListOfMaps.get(position).get("dist"));
    holder.tvRepEmail.setText(myListOfMaps.get(position).get("repEmail"));
    holder.tvRepCell.setText(myListOfMaps.get(position).get("repPhone"));

    holder.editImage.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            Log.d(TAG, "*****************  getView() *********called"+index);

        }
    });


    return row;
}

}

-谢谢你

【问题讨论】:

  • 点击监听器应该在适配器中而不是在 ListItemClick 监听器中

标签: java android android-listview android-listfragment


【解决方案1】:

不确定您是否可以在 onListItemClick 函数中处理它。您可以处理事件点击的一个地方是 Adapter 类 - getView 函数。在这个函数中,您可以找到您的控件并注册事件处理程序。

请注意,您只在此块中设置事件处理程序

if (convertView == null) {

    // Find your controls and register event handlers here  
}

【讨论】:

  • 感谢您的帮助。让我试试 brb。
  • 我听取了您的建议,一切顺利。我已经在原帖中为下一个人发布了答案。感谢您的帮助。
【解决方案2】:

在一行中的每个视图上设置点击侦听器的最佳位置是您的ViewHolder。在视图持有者构造函数中,为您要设置的子视图设置onClickListener。此外,如果您需要知道行的id,您应该在ViewHolder 类中定义一个id' 字段,然后在onClickListener 中使用它。不要忘记在 getView 方法中更新 viewholder id(或者如果您在 bindView 中使用 CursorAdapter)。

【讨论】:

    【解决方案3】:

    onListItemClick 方法中的View 参数是被点击的视图。在您的情况下,它是v。要采取适当的行动,只需通过获取其 id 并酌情委托来确定它是什么视图。

    这是一种可能的结构:

    public void onListItemClick(ListView l, View v, int position, long id) {
    
        switch(v.getId()) {
            case R.id.row_icon:
                // do something
            case R.id.row_title:
                // do something
            case R.id.row_subTitle:
                // do something
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-04-28
      • 1970-01-01
      • 2014-05-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多