我创建了一个自定义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?
我尝试了this解决方案,但没有工作......
答案 0 :(得分:1)
你可以使用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
}
}
});
答案 1 :(得分:1)
这是最终的解决方案,我用这段代码解决了我的问题:
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;
}
});
答案 2 :(得分:1)
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
}
}
});
答案 3 :(得分:0)
@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);
}