【问题标题】:setOnItemClickListener is not working in listview while i use imagebutton inside custom adapter当我在自定义适配器中使用 imagebutton 时,setOnItemClickListener 在 listview 中不起作用
【发布时间】:2018-04-06 09:41:50
【问题描述】:

在 ListView 中,我通过 CustomAdapter 类(扩展 ArrayAdapter)添加 TextView 和 ImageButton。当我在 CustomAdapter 类中将 onClickListener 添加到 ImageButton 时,ListView onItemClickListener 不起作用。如果我想选择多个列表还有一个列表,监听器不工作,并行 ImageButton onClickListener 工作。我希望 ListView 和 ImageButton onClickListener 和 onItemClickListener 在我的 Activity 中工作。如何解决这个问题?

谁给点建议!

代码如下:

public class ViewHolder {
     TextView username;
     ImageButton download;
     TextView time;
     ImageView contactpic;  }

    public interface ButtonListener {
        public void onButtonClickListner(int position, VoiceMailRecords value);
    }

    public void setCustomButtonListner(ButtonListener listener) {
        this.customListner = listener;
    }
    public View getView(final int position, View convertView, ViewGroup parent)
    {
            ViewHolder viewHolder;
            viewHolder = new ViewHolder();
            if(convertView==null) {
                convertView = LayoutInflater.from(getContext()).inflate(R.layout.recorded_item, parent, false);
                //TextView date = (TextView) convertView.findViewById(R.id.date);
                viewHolder.time = (TextView) convertView.findViewById(R.id.callingTime);
                //TextView number = (TextView) convertView.findViewById(R.id.callerNumber);
                viewHolder.username = (TextView) convertView.findViewById(R.id.callerName);
                viewHolder.contactpic = (ImageView) convertView.findViewById(R.id.imageView_round);
                //   ImageView checked = (ImageView) convertView.findViewById(R.id.is_checked);
                viewHolder.download = (ImageButton) convertView.findViewById(R.id.is_download);
                convertView.setTag(viewHolder);
            }
            else {
                viewHolder = (ViewHolder) convertView.getTag();
            }
            final VoiceMailRecords user = getItem(position);
            viewHolder.username.setText(user.getCallerNumber());

            return convertView;


    }

活动中

voiceMailRecordAdapter=new VoiceMailRecordAdapter(this,voiceMailRecords,this);
voicemailList.setAdapter(voiceMailRecordAdapter);
voiceMailRecordAdapter.notifyDataSetChanged();

voicemailList.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
    @Override
    public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
        Toast.makeText(ListVoiceMailRecord.this,"Position :"+position+" clicked",Toast.LENGTH_LONG).show();
        return true;
    }
});

@Override
public void onButtonClickListner(int position, VoiceMailRecords value) {
    Log.d(TAG, "VoiceMailApi onButtonClickListner " );
    Toast.makeText(ListVoiceMailRecord.this,"onButtonClickListner :"+position+"",Toast.LENGTH_LONG).show();
}

【问题讨论】:

  • 你能显示代码吗?
  • 我更新了我的代码@JayPatel
  • @RevathiManoharan 你能详细说明一下吗

标签: android listview android-studio


【解决方案1】:

您需要为您的 ImageButton 设置 focusableInTouchMode 为 false。

在你的 imageButton 中添加这一行

android:clickable="false"
android:focusableInTouchMode="false"
android:focusable="false"

而 instead of onItemClick() 尝试 onClick() 进行转换视图,

convertView.setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View v) {
          Log.d("clicked"," yes");
      }
}

【讨论】:

  • 仍然 ListView onClickListener 不工作只有 ImageButton Listener 工作
  • 你的意思是onitemclick()还是onclick()。如果是onclick(),为什么需要listview的onclick监听器。
  • 我的意思是 onitemclick()
  • 你可以试试onclicklistener for convertview。它适用于我的情况
  • 是的,在您的适配器中,在 getview() 方法中,使用 clickListener 进行转换视图
【解决方案2】:

很多时候android:focusable="false" 和android:focusableInTouchMode="false" 可以解决问题,但如果这些都不起作用,那么有时列表将无法创建点击侦听器。在这种情况下,您可能需要再添加一个属性。

android:descendantFocusability="blocksDescendants" 

并且必须将此属性添加到您提供 ListView 元素的 XML 的最顶层布局中。

【讨论】:

  • 仍然无法工作@Jay Patel 让你知道我正在使用 RelationLayout
【解决方案3】:

您可以在适配器中添加接口,并可以处理活动或片段中的点击

     public interface  ButtonClick{
            void Click(View view,int position);
        }
    public Adapter(Context context, ButtonClick buttonclick){

            this.buttonclick=buttonclick;
          this.context=context;
        }
        ButtonClick buttonclick;

     yourimage.setTag(position);
           yourimage.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    int pos= (int) v.getTag();
                    if(buttonclick!=null){
                        buttonclick.Click(v,pos);

                    }

                }
            });

您可以在设置适配器时处理点击活动

    Adapter adapter = new Adapter(Youractivity.this, new Adapter.ButtonClick() {
                        @Override
                        public void Click(View view, int position) {
                            // your logic
                        }
                    });

希望这会有所帮助。

this is how i have implemented in multiple projects

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-23
    • 2019-05-23
    • 1970-01-01
    • 2021-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多