ListView和CustomListViewAdapter

时间:2016-06-05 16:06:21

标签: android

我想与您分享我的关注并得到一些反馈。

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

  1. 每个raw应包含一个imageView,一个textView和一个Button。
  2. 单击按钮时,应打开主页。
  3. 点击该行中的其他位置时,应显示详细说明。
  4. 这就是我做的,

    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,我创建了一个名为KwoolyCompanyAdapter的适配器,它扩展了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来使其工作,但我认为这是不可取的,因为每次我们需要修复“点击”后的行为时,我们需要修复KwoolyCompanyAdapter。

    你觉得怎么样?

    谢谢!

2 个答案:

答案 0 :(得分:0)

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

您必须在列表项目视图中的所有控件上添加android:focusable="false"来删除它,但这有问题,因为您的按钮点击事件无效。正确的方法是通过添加android:descendantFocusability="blocksDescendants"来阻止项目视图根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>

答案 1 :(得分:0)

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