2017-10-24 2 views
0

Ich habe eine Rasteransicht 3x3. Innerhalb dieses Gitters habe ich ImageView s.GridView.setOnItemClickListener löst ganze Zeile

Ich habe OnItemClickListener eingerichtet, aber wenn ich auf ImageView klicke, wird nur der erste in Folge gedrückt, egal welche Spalte ich drücke. Auch kann ich außerhalb der ImageView (leeren Raum) drücken, aber immer noch zuerst ImageView auf diese Zeile gedrückt wird.

XML

<GridView 
    android:id="@+id/test" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:columnWidth="90dp" 
    android:gravity="center" 
    android:horizontalSpacing="10dp" 
    android:numColumns="3" 
    android:stretchMode="columnWidth" 
    android:verticalSpacing="10dp" /> 

MainActivity

GridView gridview = (GridView) findViewById(R.id.test); 
gridview.setAdapter(new HexAdapter(getBaseContext())); 
gridview.setOnItemClickListener(new OnItemClickListener() { 
    public void onItemClick(AdapterView<?> parent, View v, int position, long id) { 
     Log.e("gridView", "hallo" + position); 
    } 
}); 

und das ist mein Adapter

public class HexAdapter extends BaseAdapter { 
    private Context mContext; 

    public HexAdapter(Context c) { 
     mContext = c; 
    } 

    public int getCount() { 
     return mThumbIds.length; 
    } 

    public Object getItem(int position) { 
     return (Object) mThumbIds[position]; 
    } 

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

    public View getView(int position, View convertView, ViewGroup parent) { 
     ImageView imageView; 
     if (convertView == null) { 
      // if it's not recycled, initialize some attributes 
      imageView = new ImageView(mContext); 
      imageView.setLayoutParams(new GridView.LayoutParams(85, 85)); 
      imageView.setScaleType(ImageView.ScaleType.CENTER_CROP); 
      imageView.setPadding(8, 8, 8, 8); 
     } else { 
      imageView = (ImageView) convertView; 
     } 

     imageView.setImageResource(mThumbIds[position]); 
     return imageView; 
    } 

    // references to our images 
    private Integer[] mThumbIds = { 
     R.drawable.logo, R.drawable.logo, 
     R.drawable.logo, R.drawable.logo, 
     R.drawable.logo, R.drawable.logo, 
    }; 
} 

R.drawable.logo ist nur ein zufälliges Bild, ein wählte.

+0

prüfen diese https://stackoverflow.com/questions/20191914/how-to- add-gridview-setonitemclicklistener –

+0

@NovoLucas Ich habe diesen schon rot. Leider muss ich einen onItemClickListener machen. Kein clickListener im Adapter. – CBeTJlu4ok

+0

@NovoLucas siehe https://stackoverflow.com/questions/46343681/android-click-button-behind-another-button, wenn Sie mehr wissen wollen – CBeTJlu4ok

Antwort

2

Ich habe dieses Problem erlebt, und die Lösung kam ich mit ist einfach:

In Ihrem Adapter einen eindeutigen TAG zu jeder Ansicht geben

view.setTag(id); //example 

Und auf ItemClickListener paßt nur die Tags für jede Ansicht und Sie werden sicher sein, dass dies nie passieren wird:

if(view.getTag().equals(id)) 
    doStuff(); 
if(view.getTag().equals(otherId)) 
    doOtherStuff(); 

Und so weiter. Hier

ein Beispiel:

Adapter

public View getView(int position, View convertView, ViewGroup parent) { 
    View v = convertView; 
    ImageView imageView; 
    CustomTextView textView; 
    LinearLayout main_grl; 

    if (v == null) { 
     v = layoutInflater.inflate(R.layout.professions_gridview_item,parent,false); 
    } 

    main_grl = (LinearLayout)v.findViewById(R.id.main_grl); 
    main_grl.setBackground(ContextCompat.getDrawable(mContext,R.drawable.ps_background_selector)); 
    imageView = (ImageView) v.findViewById(R.id.imageView); 
    textView = (CustomTextView) v.findViewById(R.id.textView); 
    imageView.setImageResource(ApplicationConstants.finalListIV[position]); 
    textView.setText(ApplicationConstants.finalListTV[position]); 
    v.setTag(ApplicationConstants.finalListTV[position]); 

    return v; 
} 

Aktivität

@Override 
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) { 
    if((Integer) view.getTag() == someTag){ 
     //doStuff 
    } else if((Integer) view.getTag() == otherTag){ 
     //doOtherStuff 
    } else{ 
     //andSomeOther 
    } 
} 
+1

Haha, was für ein Zufall, ich hatte heute ein Problem mit Tags, wollte ich Verwenden Sie mehr als ein Tag. Danke dafür. –

+0

Leider tut es nicht. Problem ist, dass egal, die Spalte erste Taste in der Zeile gedrückt wird, so dass es immer das gleiche Tag für eine Zeile – CBeTJlu4ok

+0

zurückgibt Überprüfen Sie die bearbeitete Antwort – Ricardo

Verwandte Themen