我想分享我的担忧,并从您那里获得一些反馈。
我正在尝试实现自定义的ListView,其要求是,
- 每个raw都应该包含一个imageView、一个textView和一个Button
- 单击按钮时,应打开主页
- 单击行中的其他位置时,应显示详细描述
以下是我所做的,
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。