实施仅点击图片而非自定义列表视图中的文字

时间:2016-05-09 09:49:28

标签: android listview onitemclicklistener onitemclick

我有一个custom Listview,其中包含image& text已实施OnItemClickListener列表,该列表仅适用于不适用于text. OnItemClick的图片,但对于图片工作正常,但点击文字时会出现致命异常。此外,如果图像存在,图像将在列表中可见,否则它将被隐藏。

尝试android:focusable="false"android:clickable="false",但我仍然得到以下异常

  

java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法'android.graphics.Bitmap com.bumptech.glide.load.resource.bitmap.GlideBitmapDrawable.getBitmap()'

OnItemClick:

@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {


    final ImageView imageView1 = (ImageView) view.findViewById(R.id.imageList);
    final GlideBitmapDrawable bitmapDrawable = (GlideBitmapDrawable) imageView1.getDrawable();
    final Bitmap yourBitmap = bitmapDrawable.getBitmap();
    Dialog builder = new Dialog(this);
    builder.requestWindowFeature(Window.FEATURE_NO_TITLE);
    builder.getWindow().setBackgroundDrawable(
            new ColorDrawable(android.graphics.Color.TRANSPARENT));
    builder.setOnDismissListener(new DialogInterface.OnDismissListener() {
        @Override
        public void onDismiss(DialogInterface dialogInterface) {
            //nothing;
        }
    });

    ImageView imageView = new ImageView(this);
    imageView.setImageBitmap(yourBitmap);



    builder.addContentView(imageView, new RelativeLayout.LayoutParams(
            ViewGroup.LayoutParams.MATCH_PARENT,
            ViewGroup.LayoutParams.MATCH_PARENT));
    builder.show();


}

如何实现仅在图片上点击?

2 个答案:

答案 0 :(得分:0)

在自定义布局xml中,设置

android:descendantFocusability="blocksDescendants"

到您的根布局。

修改 检查我的自定义列表视图。

  

listitem.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="match_parent"
android:gravity="center"

android:descendantFocusability="blocksDescendants"
android:layout_height="60dp">

<ImageView
    android:id="@+id/m_imageview"
    android:layout_width="0dp"
    android:layout_weight="1"
    android:src="@drawable/ic_launcher"
    android:layout_height="50dp" />

<TextView
    android:id="@+id/m_textview"
    android:layout_width="0dp"
    android:layout_weight="3"
    android:layout_height="50dp"
    android:gravity="center|center"
    android:textColor="#ffffff"
    android:text="hello"/>

<Button
    android:id="@+id/m_buttonview"
    android:layout_width="0dp"
    android:layout_weight="2"
    android:text="OK"
    android:layout_height="50dp" />

</LinearLayout>
  

activity_main.xml中

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

<ListView
    android:id="@+id/lv_items"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:background="@drawable/list_selector"
    android:dividerHeight="2dp"
    android:divider="#ffffff"
    tools:context=".MainActivity" />


</RelativeLayout>
  

CustomListViewAdapter.java

public class CustomListViewAdapter extends ArrayAdapter<RowItem> {

Context context;

public CustomListViewAdapter(Context context, int resourceId,
                             List<RowItem> items) {
    super(context, resourceId, items);
    this.context = context;
}

/*private view holder class*/
private class ViewHolder {
    ImageView m_pic;
    TextView m_title;
    Button m_btn;
}

public View getView(final int position, View convertView, ViewGroup parent) {
    ViewHolder holder = null;
    RowItem rowItem = getItem(position);

    LayoutInflater mInflater = (LayoutInflater) context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
    if (convertView == null)
    {
        convertView = mInflater.inflate(R.layout.listitem, null);
        holder = new ViewHolder();
        holder.m_title = (TextView) convertView.findViewById(R.id.m_textview);
        holder.m_btn = (Button)convertView.findViewById(R.id.m_buttonview);
        holder.m_pic = (ImageView) convertView.findViewById(R.id.m_imageview);

        convertView.setTag(holder);
    }
    else
        holder = (ViewHolder) convertView.getTag();

    holder.m_title.setText(rowItem.getTxt());

    holder.m_pic.setImageResource(rowItem.getImage());

   holder.m_btn.setOnClickListener(new OnClickListener() {
       @Override
       public void onClick(View v) {

           Toast.makeText(context, position + " clicked" , Toast.LENGTH_LONG).show();
       }
   });

    return convertView;
}
}
  

RowItem.java

public class RowItem {

private int image;
private String txt;

public RowItem(int imageview , String textview)
{
    this.image = imageview;
    this.txt = textview;
}


public int getImage() {
    return image;
}

public String getTxt() {
    return txt;
}

public void setImage(int image) {
    this.image = image;
}

public void setTxt(String txt) {
    this.txt = txt;
}
}
  

MainActivity.java

public class MainActivity extends AppCompatActivity implements AdapterView.OnItemClickListener {

String m_txt[] = {"one" , "two" , "three" , "four", "five"};
int m_img [] = {R.drawable.ic_launcher ,
        R.drawable.ic_launcher ,
        R.drawable.ic_launcher ,
        R.drawable.ic_launcher ,
        R.drawable.ic_launcher};

ListView m_list;
List<RowItem> rowItems;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    m_list = (ListView)findViewById(R.id.lv_items);

    rowItems = new ArrayList<RowItem>();
    for (int i = 0; i < m_txt.length; i++) {
        RowItem item = new RowItem(m_img[i],m_txt[i]);
        rowItems.add(item);
    }

    CustomListViewAdapter adapter = new CustomListViewAdapter(this,
            R.layout.listitem, rowItems);
    m_list.setAdapter(adapter);
    m_list.setOnItemClickListener(MainActivity.this);

}

@Override
public void onItemClick(AdapterView<?> parent, View view, int position,
                        long id) {
    Toast toast = Toast.makeText(getApplicationContext(),
            "Item " + (position) + ": " + rowItems.get(position).getTxt(),
            Toast.LENGTH_SHORT);
    toast.setGravity(Gravity.BOTTOM | Gravity.CENTER_HORIZONTAL, 0, 0);
    toast.show();

}
}

这应该可以帮到你。

快乐的编码。!!!

答案 1 :(得分:0)

使用recyclerview。 recylerview将每个列表项作为一个视图处理,它可以为它所持有的每个视图保存clicklistener,并且该视图可以为其持有的每个视图保存clicklistener。