【问题标题】:OnItemClickListener doesn't work but OnLongItemClickListener works in Custom ListviewOnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义列表视图中起作用
【发布时间】:2015-05-12 11:34:43
【问题描述】:

我有一个带有自定义适配器的自定义 listview。我想点击listview的项目做点什么。 OnItemClickListener 不起作用。但我实现了OnLongItemClickListener,它运行良好。

MainActivity

public class MainActivity extends Activity {
ArrayList<Product> products = new ArrayList<Product>();
Adapter listviewAdapter;  //custom adapter object
ListView listview; 
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    listview = (ListView) findViewById(R.id.lvMain);
    listview.setLongClickable(true);
    listviewAdapter = new Adapter(this, products);      
    listview.setAdapter(listviewAdapter);    
   listview.setOnItemLongClickListener(new OnItemLongClickListener() {
    @Override
    public boolean onItemLongClick(AdapterView<?> arg0, View arg1,
            int arg2, long arg3) {  //this works
        Toast.makeText(getApplicationContext(), "Long pressed", Toast.LENGTH_SHORT).show();
        return false;
    }
});      
   listview.setOnItemClickListener(new OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
            long arg3) {    //does not work
        Toast.makeText(getApplicationContext(), " pressed", Toast.LENGTH_SHORT).show();
    }
});     
}

更新自定义适配器适配器

public class Adapter extends BaseAdapter {
Context ctx;
LayoutInflater lInflater;
ArrayList<Product> objects;
TextView itemname,itemprice;
Adapter(Context context, ArrayList<Product> products) {
    ctx = context;
    objects = products;
    lInflater = (LayoutInflater) ctx
            .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
@Override
public int getCount() {
    return objects.size();
}
@Override
public Object getItem(int position) {
    return objects.get(position);
}
@Override
public long getItemId(int position) {
    return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
    View view = convertView;
    if (view == null) {
        view = lInflater.inflate(R.layout.item, parent, false);
    }
    Product p = getProduct(position);
     itemname= ((TextView) view.findViewById(R.id.tvDescr));
     itemname.setText(p.name);
     itemprice=((TextView) view.findViewById(R.id.tvPrice));
     itemprice.setText(p.price + "");
    CheckBox cbBuy = (CheckBox) view.findViewById(R.id.cbBox);
    cbBuy.setOnCheckedChangeListener(myCheckChangList);
    cbBuy.setTag(position);
    cbBuy.setChecked(p.selected);       
    view.setOnClickListener(new OnClickListener() {         
        @Override
        public void onClick(View arg0) {
            // TODO Auto-generated method stub

        }
    });       
    view.setOnLongClickListener(new OnLongClickListener() {

        @Override
        public boolean onLongClick(View v) {
            // TODO Auto-generated method stub
            return false;
        }
    });     
    return view;
}
Product getProduct(int position) {
    return ((Product) getItem(position));
}
ArrayList<Product> getBox() {
    ArrayList<Product> selected = new ArrayList<Product>();
    for (Product p : objects) {
        if (p.selected)
            selected.add(p);
    }
    return selected;
}
OnCheckedChangeListener myCheckChangList = new OnCheckedChangeListener() {
    public void onCheckedChanged(CompoundButton buttonView,boolean isChecked) {
        getProduct((Integer) buttonView.getTag()).selected = isChecked;
    }
};

}

自定义列表视图item.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" 
android:descendantFocusability="blocksDescendants">
<CheckBox
android:id="@+id/cbBox"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical" >
</CheckBox>
<LinearLayout
android:id="@+id/linearLayout1"
android:layout_height="wrap_content"
 android:orientation="vertical" >
<TextView
android:id="@+id/tvDescr"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text=""  >
    </TextView> 
</LinearLayout>

activity_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"  >
<ListView
android:id="@+id/lvMain"
android:layout_width="match_parent"
android:layout_height="0dp"
android:longClickable="true">
</ListView>

【问题讨论】:

  • 能否分享完整的适配器代码?
  • 更新了适配器代码。

标签: java android xml listview android-listview


【解决方案1】:

到您的文本视图和复选框

android:focusable="false"

【讨论】:

  • 我试过不行android:focusable="false" android:focusableInTouchMode="false"
【解决方案2】:

这是因为您的 CheckBox。你可以这样解决:

为您的线性布局添加一个 id。

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" 
android:descendantFocusability="blocksDescendants"
android:id="@+id/main_layout">

在你的 getView 中

LinearLayout main_layout = (LinearLayout)view.findViewById(R.id.main_layout));

main_layout.setOnClickListener(new OnClickListener() {

                            public void onClick(View v) {
                                listview .performItemClick(view,
                                        listview.getPositionForView(view),
                                        listview.getPositionForView(view));

                            }
                        });

编辑: 使用以下代码进行长按

main_layout.setOnLongClickListener(new OnLongClickListener() {

                            @Override
                            public boolean onLongClick(View arg0) {
                                listview.performLongClick();
                                return true;
                            }
                        });

【讨论】:

  • 通过这样做 OnItemLongClickListner 被禁用
  • ya.. 在我的自定义适配器中,我编写了您的代码 LinearLayout main_layout= (LinearLayout)view.findViewById(R.id.main_layout); main_layout.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { Toast.makeText(ctx.getApplicationContext(), " pressed", Toast.LENGTH_SHORT).show(); } }); 通过这个 onItemclick 现在可以工作,但我以前的 OnItemLongClickListner 现在不能工作。
  • 事实上,onItemLongClick 中的代码也会被触发。
  • 然后为那个 main_layout 做一件事 setOnLongClick。我在编辑检查中添加代码。
  • 现在onItemLongClickonItemClick 在长按项目行后会依次触发。
【解决方案3】:

您可以在 xml 中赋予android:onClick 属性:

<CheckBox
android:id="@+id/cbBox"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical" android:onClick="onCheckboxClicked" />

这将在您选中或取消选中复选框时起作用。

原因为什么 onClick 不起作用,但 onLongClick 起作用:

您已在列表视图行上应用onListItemClickListener,因此当您单击复选框时,此侦听器已使用该事件

listview.setOnItemClickListener(new OnItemClickListener() {

更新:

getView()

    // for list row
 view.setOnClickListener(new OnClickListener() {         
        @Override
        public void onClick(View arg0) {
            Log.d("onClick","row click");

        }
});   

    // for list row check box
 view.cbBuy.setOnClickListener(new OnClickListener() {         
        @Override
        public void onClick(View arg0) {
              Log.d("onClick","checkbox click");

        }
}); 

在 MainActivity 中

删除这部分:

/*   listview.setOnItemClickListener(new OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
                long arg3) {    //does not work
            Toast.makeText(getApplicationContext(), " pressed", Toast.LENGTH_SHORT).show();
        }
    }); */

无论复选框是否具有属性android:focusable="true"false,此代码都会运行 这是工作编译和运行代码 谢谢

【讨论】:

  • 我想将CheckBox onClick 事件和ListviewonClick 事件分开。这不能解决我的问题。
  • 我已经更新了我的答案..这是运行代码
【解决方案4】:

@Amsheer 您的代码有效。但为此,您必须更改自定义适配器并在其中编写 onClick 事件的操作。我想在 ManiActivity 中编写 onClick 事件。我找到了解决方法。我从自定义适配器中删除了它

 view.setOnLongClickListener(new OnLongClickListener() {        
        @Override
        public boolean onLongClick(View v) {
            // TODO Auto-generated method stub
            return false;
        }
    });
view.setOnClickListener(new OnClickListener() { 
    @Override
    public void onClick(View arg0) {
        // TODO Auto-generated method stub  
    }
});

【讨论】:

    猜你喜欢
    • 2011-07-29
    • 1970-01-01
    • 1970-01-01
    • 2016-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多