Es gibt viele Diskussionen zu diesem Thema. Aber keiner von ihnen funktioniert für mich. Ich habe einen benutzerdefinierten ListView mit einem ImageView
in der ListView
implementiert und der ListView
ist von der ListFragment
erweitert. Meine ImageView ist anklickbar, so dass, wenn der Benutzer auf ImageView klickt, die Kameraaktivität aktiviert ist und die ImageView mit dem aufgenommenen Bild aktualisiert wird. Die XML wird wie untenSo richten Sie den onClickListener für die Bildansicht in der Listenansicht ein
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:background="@drawable/list_background_selector"
android:orientation="horizontal"
android:padding="5dip" >
<!-- ListRow Left sied Thumbnail image -->
<LinearLayout android:id="@+id/thumbnail"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="3dip"
android:layout_alignParentLeft="true"
android:background="@drawable/image_bg"
android:layout_marginRight="5dip">
<ImageView
android:id="@+id/list_image"
android:layout_width="50dip"
android:clickable="true"
android:focusable="false"
android:contentDescription="@string/image_view_description"
android:layout_height="50dip"
android:src="@drawable/icons_preview"
/>
</LinearLayout>
</RelativeLayout>
nun gezeigt ist, ich brauche den Benutzer Klick zu unterscheiden, die für das Listenelement oder für das Image ist. Ich habe onListItemClick
eingerichtet, das den Klick des Benutzers für das Listenelement in der ListView abfangen kann, aber wenn ich für ImageView klicke, funktioniert es nicht. Wie kann ich erkennen, wenn der Benutzer auf ImageView klickt? Meine ListFragment-Klasse ist wie folgt.
public class MyListFragment extends ListFragment {
private customList_Adaptor adapter;
private static final int CAMERA_REQUEST = 0;
private static final int RESULT_OK = 0;
private static MyListFragmentInterface mCallback = null;
static Context thisListFragmentContext = null;
private String[] mListItems;
private TrackerDBAdapter dbHelper;
private List<String> listIDs;
public MyListFragment() {
}
public MyListFragment(MyListFragmentInterface callback) {
mCallback = callback;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View view = inflater.inflate(R.layout.my_list_fragment, container, false);
dbHelper = new TrackerDBAdapter(getActivity());
dbHelper.open();
Cursor cursor = dbHelper.fetchAllTrackerInTheList();
mListItems = new String[dbHelper.getLastInsertedID()];
thisListFragmentContext = getActivity();
int i = 0;
for(cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext())
mListItems[i++] = cursor.getString(1);
dbHelper.close();
listIDs = new ArrayList<String>();
listIDs = Arrays.asList(mListItems);
adapter = new customList_Adaptor(thisListFragmentContext, R.layout.list_row, listIDs);
ListView lv = (ListView) view.findViewById(android.R.id.list);
lv.setAdapter(adapter);
return view;
}
public void addNewTrackerintoListDisplay(TrackerInfo newTracker){
mListItems = append(mListItems, newTracker.getIdnumber());
setListAdapter(new ArrayAdapter<String>(getActivity(),
android.R.layout.simple_list_item_1,
mListItems));
}
@SuppressLint("NewApi")
private String[] append(String[] mListItems2, String idnumber) {
// TODO Auto-generated method stub
final int N = mListItems2.length;
mListItems2 = Arrays.copyOf(mListItems2, N + 1);
mListItems2[N] = idnumber;
return mListItems2;
}
@Override
public void onListItemClick(ListView l, View v, int position, long id) {
mCallback.itemSelected(mListItems[position]);
}
}
Meine Adapterklasse ist wie folgt.
public class customList_Adaptor extends ArrayAdapter<String>{
protected static final int CAMERA_REQUEST = 0;
private Context context;
private List<String> listIDs = new ArrayList<String>();
public customList_Adaptor(Context context, int textViewResourceId,
List<String> objects) {
super(context, textViewResourceId, objects);
this.setContext(context);
this.listIDs = objects;
}
@Override
public int getCount() {
// TODO Auto-generated method stub
if(listIDs != null)
return listIDs.size();
else
return 0;
}
@Override
public String getItem(int arg0) {
// TODO Auto-generated method stub
if(listIDs != null)
return listIDs.get(arg0);
else
return null;
}
@Override
public long getItemId(int arg0) {
// TODO Auto-generated method stub
return arg0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View vi=convertView;
ViewHolder viewHolder=new ViewHolder();
LayoutInflater inflater = (LayoutInflater) this.getContext()
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
if(vi==null){
vi = inflater.inflate(R.layout.list_row, parent, false);
viewHolder.id=(TextView)vi.findViewById(R.id.title);
viewHolder.thumbnailImage=(ImageView)vi.findViewById(R.id.list_image);
viewHolder.arrow=(ImageView)vi.findViewById(R.id.list_arrow);
vi.setTag(viewHolder);
}
else
viewHolder=(ViewHolder) vi.getTag();
// viewHolder.thumbnailImage.setOnClickListener(new OnClickListener(){
//
// @Override
// public void onClick(View arg0) {
// // TODO Auto-generated method stub
// Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
// ((Activity)context).startActivityForResult(cameraIntent, CAMERA_REQUEST);
// }
//
// });
// Setting all values in listview
viewHolder.id.setText(listIDs.get(position));
return vi;
}
public Context getContext() {
return context;
}
public void setContext(Context context) {
this.context = context;
}
}
Ihre Adapter-Klasse setzen Imageview in dieser Ansicht erstellen Onclick Hörer enthält ... Antwort für u –
@Tony Stark ich meine Adapter-Klasse setzen . – batuman
was willst du etwas mehr Freund erklären –