繁体   English   中英

如何为自定义ListView设置onClickListener

[英]How to set onClickListener for custom ListView

我创建了一个自定义ListView,其中布局用两种XML定义,一种包含一个布局中ListView的定义。

例如activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<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"
    tools:context=".MainActivity">

    <LinearLayout
        android:id="@+id/content"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <ListView
        android:id="@+id/myListView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>
    </LinearLayout>
</RelativeLayout>

XML的另一部分位于另一个文件中,例如custom_list.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@drawable/list_row_selector">

    <LinearLayout
        android:id="@+id/photoList"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <ImageView
            android:id="@+id/takePhoto"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:scaleType="centerCrop"
            android:src="@drawable/camera"/>
    </LinearLayout>
</RelativeLayout>

在我的活动中,我已声明actvivity_main.xml作为主要布局:

public class MainActivity extends AppCompatActivity{    
    private List<CustomRow> imageList;

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

        /* Initialization structures, variable, ecc */
        ListView lv = (ListView) findViewById(R.id.imageList);
        adapter = new CustomList(this, imageList);
        lv.setAdapter(adapter);
    }

    /* Add element list in ListView */
    private void addList(int idC){
        CustomRow cr = new CustomRow();
        cr.setId(idC);
        cr.setTitle("xxx "+ (idC+1));
        cr.setThumbnailUrl(R.drawable.no_image);
        imageList.add(cr);
        adapter.notifyDataSetChanged();
    }

    private void takePhoto(){
     //Do something   
    }
}

自定义List.java

public class CustomList extends BaseAdapter {
    private Activity activity;
    private LayoutInflater inflater;
    private List<CustomRow> ListItem;
    private ImageLoader imageLoader = AppController.getInstance().getImageLoader();

    public CustomList(Activity activity, List<CustomRow> listPhotoItems) {
        this.activity = activity;
        this.ListItem = listPhotoItems;
    }

    @Override
    public int getCount() {
        return ListItem.size();
    }

    @Override
    public Object getItem(int location) {
        return ListItem.get(location);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        if (inflater == null)
            inflater = (LayoutInflater) activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        if (convertView == null)
            convertView = inflater.inflate(R.layout.custom_list, null);
        if (imageLoader == null)
            imageLoader = AppController.getInstance().getImageLoader();

        ImageView thumbNail = (ImageView) convertView.findViewById(R.id.thumbnail);
        TextView title = (TextView) convertView.findViewById(R.id.title);

        CustomRow m = ListItem.get(position);
        thumbNail.setImageResource(m.getThumbnailUrl());
        title.setTag(m.getId());
        title.setText(m.getTitle());
        return convertView;
    }
}

现在,我必须实现takePhoto的OnClickListener,该怎么做? 如何从活动中绑定onClickListener?

我尝试了解决方案,但没有用...

您可以使用setonitemclicklistener

 lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
  @Override
           public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
 imageList.get(position); // here you will get the clicked item from 
    //your imagelist and you can check by getting a title  by using this

    String title= imageList.get(position).getTitle();
    if(title.equals("you title to match")){
    //do your action or you can get a particular position and click there
    }
           } 
        });

这是最终的解决方案,我已经用以下代码解决了我的问题:

    lv.setAdapter(adapter);
    lv.setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            View convertView = v;

            final ImageView photo = (ImageView) convertView.findViewById(R.id.takePhoto);
            photo.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Toast.makeText(CmpDetails.this, "Click", Toast.LENGTH_SHORT).show();
                }
            });
            return false;
        }
    });
tv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
  @Override
       public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
 list.get(position); 

    String str= list.get(position).getTitle();
       if(str.equals("")){
           //put your code here
  }
       } 
    });
@Override
public View getView(int position, View convertView, ViewGroup parent) {
    View v = convertView;

    TextView tv = (TextView) v.findViewById(R.id.textView1);
    tv.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            //do your code on click event
        }
    });


    return super.getView(position, convertView, parent);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM