ListView和CustomListViewAdapter上的OnClick事件实现



我想分享我的担忧,并从您那里获得一些反馈。

我正在尝试实现自定义的ListView,其要求是,

  1. 每个raw都应该包含一个imageView、一个textView和一个Button
  2. 单击按钮时,应打开主页
  3. 单击行中的其他位置时,应显示详细描述

以下是我所做的,

MainActivity.java
KwoolyCompanyAdapter adapter = new KwoolyCompanyAdapter(this, R.layout.listviewitem_company,list);
listView = (ListView)findViewById(R.id.listView);
listView.setAdapter(adapter);
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Intent intent = new Intent(view.getContext(), DescriptionActivity.class);
intent.putExtra("Company", (String)listView.getItemAtPosition(position));
startActivity(intent);
}
});

正如您所看到的,为了满足需求3,我已经将setOnItemClickListener放到了ListView中。

对于自定义Ui,我创建了一个名为KwolyCompanyAdapter的适配器,它扩展了BaseAdapter。

public View getView(int position, View convertView, ViewGroup parent) {
final int pos = position;
if(convertView==null){
LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = inflater.inflate(itemLayout, parent, false);
TextView textView = (TextView)convertView.findViewById(R.id.textView);
textView.setText(list.get(pos));
ImageView imageView = (ImageView)convertView.findViewById(R.id.imageView);
BitmapDrawable bitmapDrawable = (BitmapDrawable)ContextCompat.getDrawable(context, GetCompanyResourceId(list.get(pos)));
imageView.setImageDrawable(bitmapDrawable);
Button button = (Button)convertView.findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(GetCompanyHomepageURL(list.get(pos))));
context.startActivity(intent);
}
});
}
return convertView;
}

我创建了一个imageView、一个textView和一个按钮,并仅将setOnClickListener附加到按钮上。

问题是…按下按钮会引发一个事件并按预期工作。但当我点击其他地方时,什么也没发生。

我可以通过将OnClick事件处理程序放在imageView和textView中来实现它,但我认为这是不可取的,因为每次我们需要修复"点击"后的行为时,我们都需要修复KwolyCompanyAdapter。

你觉得怎么样?

谢谢!

默认情况下,所有Android控件都是可聚焦的。

您必须通过在列表项视图中的所有控件上添加android:focusable="false"来删除它,但这有问题,因为您的按钮单击事件不起作用。正确的方法是通过添加android:descendantFocusability="blocksDescendants"来阻止itemview根ViewGroup的可聚焦性。

例如:

<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">
<!-- Your child views -->
</LinearLayout>

删除OnItemClickListener,并添加OnClickListener到具有相同逻辑的适配器中的convertView。

最新更新