2012-03-26 5 views
1

Ich kann anscheinend nicht herausfinden, wie ich meine ListView (OnListItemClick) bekomme, um verschiedene Aktivitäten zu öffnen. Ich weiß, dass ich irgendwie eine Zeilen-ID für meinen ListView bekommen muss, aber ich weiß nicht wie. Gerade jetzt eröffnet jede Zeile in meinem ListView die gleiche Aktivität. Sorry für mein schlechtes Englisch, hoffe du verstehst.Android ListView, OnListItemClick, Zeilen-ID finden?

import java.util.List; 
import java.util.Vector; 

import android.app.Activity; 
import android.app.ListActivity; 
import android.content.Context; 
import android.content.Intent; 
import android.net.ParseException; 
import android.os.Bundle; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.ArrayAdapter; 
import android.widget.ImageView; 
import android.widget.ListView; 
import android.widget.TextView; 


public class MainActivity extends ListActivity { 
private LayoutInflater mInflater; 
private Vector<RowData> data; 
RowData rd; 

static final String[] title = new String[] { 
"Text", 
"Text", 
"Text", 
; 

static final String[] detail = new String[] { 
"Image1", 
"Image2", 
"Image3", 
}; 

private Integer[] imgid = { 
R.drawable.spektr, 
R.drawable.spektr, 
R.drawable.sleep, 



}; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
super.onCreate(savedInstanceState); 
setContentView(R.layout.main); 
mInflater = (LayoutInflater) getSystemService(
Activity.LAYOUT_INFLATER_SERVICE); 
data = new Vector<RowData>(); 
for(int i=0;i<title.length;i++){ 

try { 
rd = new RowData(i,title[i],detail[i]); 
} catch (ParseException e) { 
    e.printStackTrace(); 
} 
data.add(rd); 
} 
CustomAdapter adapter = new CustomAdapter(this, R.layout.list, 
           R.id.title, data); 
setListAdapter(adapter); 
getListView().setTextFilterEnabled(true); 
} 
public void onListItemClick(ListView parent, View v, int position, 
                 long id) {   

Intent intent = new Intent(this, NewActivity.class); 
intent.putExtra("id", item.mId); 
    startActivity(intent); 

} 
private class RowData { 
protected int mId; 
protected String mTitle; 
protected String mDetail; 
RowData(int id,String title,String detail){ 
mId=id; 
mTitle = title; 
mDetail=detail; 
} 
@Override 
public String toString() { 
     return mId+" "+mTitle+" "+mDetail; 
} 
} 
private class CustomAdapter extends ArrayAdapter<RowData> { 

public CustomAdapter(Context context, int resource, 
       int textViewResourceId, List<RowData> objects) {    

super(context, resource, textViewResourceId, objects); 
} 
@Override 
public View getView(int position, View convertView, ViewGroup parent) { 

ViewHolder holder = null; 
TextView title = null; 
TextView detail = null; 
ImageView i11=null; 
RowData rowData= getItem(position); 
if(null == convertView){ 
    convertView = mInflater.inflate(R.layout.list, null); 
    holder = new ViewHolder(convertView); 
    convertView.setTag(holder); 
} 
     holder = (ViewHolder) convertView.getTag(); 
     title = holder.gettitle(); 
     title.setText(rowData.mTitle); 
     detail = holder.getdetail(); 
     detail.setText(rowData.mDetail);              

     i11=holder.getImage(); 
     i11.setImageResource(imgid[rowData.mId]); 
     return convertView; 
} 
    private class ViewHolder { 
    private View mRow; 
    private TextView title = null; 
    private TextView detail = null; 
    private ImageView i11=null; 

    public ViewHolder(View row) { 
    mRow = row; 
} 
    public TextView gettitle() { 
     if(null == title){ 
      title = (TextView) mRow.findViewById(R.id.title); 
     } 
    return title; 
    }  

    public TextView getdetail() { 
     if(null == detail){ 
      detail = (TextView) mRow.findViewById(R.id.detail); 
      } 
    return detail; 
    } 
public ImageView getImage() { 
     if(null == i11){ 
      i11 = (ImageView) mRow.findViewById(R.id.img); 
           } 
     return i11; 
} 
} 

} 
} 

Und mein NewActivity sieht aus wie:

import android.app.Activity; 
import android.os.Bundle; 

public class NewActivity extends Activity{ 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    // TODO Auto-generated method stub 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.poetry); 

    getIntent().getExtras().getInt("id"); 
}} 

Antwort

10

Sie brauchen nicht die „Zeilen-ID des ListView“ zu erhalten, können Sie die „Zeilen-ID des Artikel erhalten müssen dass in den Listview "

Zum Glück geklickt, Android gibt Ihnen die Zeilen-ID genau dort als letzten Parameter von onListItemClick(), wo Sie sich gerade die Position mit:

public void onListItemClick(ListView parent, View v, int position, long id) { 
    Intent intent = new Intent(this, NewActivity.class); 
    // intent.putExtra("position", position); // not what you want 
    intent.putExtra("id", id); // more likely what you want 
    startActivity(intent); 
} 

Wenn Sie keine ID haben, können Sie auch den tatsächlichen Einzelteil erhalten, dh ein RowData Objekt in Ihrem Fall aus den ListAdapter:

public void onListItemClick(ListView parent, View v, int position, long id) { 
    RowData item = (RowData) getListAdapter().getItem(position); 
    Intent intent = new Intent(this, NewActivity.class); 
    intent.putExtra("id", item.mId); 
    startActivity(intent); 
} 

In beiden Fällen müssen Sie Ihre ändern Code in NewActity, also extrahieren Sie die ID, nicht die Position, aus dem zusätzlichen Bundle.

Ein weiteres Update:

Nehmen wir meine Liste 10 Elemente haben, Punkt 1, Punkt 2, Punkt 3 und so weiter. Wenn auf Element 1 geklickt wird, möchte ich, dass eine neue Aktivität geöffnet wird, nennen wir das NewActivityOne, und NewActivityOne verweist auf ein Layout mit einem Text namens layoutone. Punkt 2 öffnet auch eine neue Aktivität, NewActivityTwo, die sich auf ein neues Layout namens Layouttwo bezieht. Und so möchte ich es für alle meine Artikel haben.

  • Wenn Ihre Detail Aktivitäten nur im Layout (dh nicht in jedem Verhalten/code) unterscheiden, nur putExtra() verwenden, um eine R.layout.* ID übergeben (nennen wir es "layoutId"), um Ihre NewActivity und Verwenden Sie das in setContentView(getIntent().getExtras().getInt("layoutId"));.

  • Wenn Ihre Detail-Aktivitäten unterscheiden weiter verbreitet, erstellen Sie eine separate Activity Klasse für jedes Listenelement, und in onListItemClick() eine Intent mit der respestive Aktivitätsklasse erstellen Sie anzeigen möchten.

In jedem Fall können Sie die Details zur Anzeige speichern (int layoutId oder Class<Activity>) in Ihrer RowData Klasse, so dass Sie leicht in onListItemClick() zugreifen können.

+0

Okay ich sehe. Aber ich verstehe nicht, wo ich die "ID" finde. Ist es irgendwo in meiner Java-Datei zu finden, wie eine Nummer oder was? – Chrfugl

+0

Normalerweise erhalten Sie eine ID von einem ['(Simple) CursorAdapter'] (http://www.vogella.de/articles/AndroidListView/article.html#cursor), der wiederum Dinge aus einer Datenbank übernimmt.Wenn Sie wirklich nur eine bestimmte Anzahl von Elementen benötigen, können Sie die ID ignorieren und stattdessen das angeklickte Listenelement aus dem 'ListAdapter' holen - ich habe meine Antwort für eine Möglichkeit aktualisiert :) –

+0

Sorry but i Siehst du das Update nicht? – Chrfugl