2012-03-26 9 views
1

ListView(OnListItemClick)を取得して別のアクティビティを開く方法がわかりません。私は何とか私のListViewのいくつかの行IDを取得する必要があることを知っているが、私はどのように知っていない。今すぐListViewのすべての行が同じアクティビティを開きます。 私の悪い英語を申し訳ありません、ご理解いただきたいと思います。Android ListView、OnListItemClick、行IDを見つける?

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; 
} 
} 

} 
} 

そして、私のNewActivityは次のようになります。

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"); 
}} 

答えて

10

あなたは「ListViewの行ID」を取得する必要はありません、あなたは項目の」行のIDを取得する必要があり

012:それは幸運なことに、Androidはあなたが現在位置を使用している onListItemClick()の最後のパラメータとして、すぐそこにあなたの行IDを与える Listview

でクリックされました

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); 
} 

あなたがIDをお持ちでない場合、あなたはまた、実際のアイテムを取得することができますが、ListAdapterから、あなたのケースでRowDataオブジェクト、すなわち:

どちらの場合も
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); 
} 

、あなたを変更する必要がありますNewActityのコードで、余分なバンドルから位置ではなくIDを抽出します。

別のアップデート:

は私のリストはように10の項目、項目1、項目2、項目3とを考えてみましょう。アイテム1をクリックすると、新しいアクティビティを開き、そのNewActivityOneを呼び出して、NewActivityOneはlayoutoneというテキストを含むレイアウトを参照します。アイテム2は、新しいアクティビティ、NewActivityTwoを開き、layouttwoという新しいレイアウトを参照します。そして、それは私がすべての私のアイテムのためにそれをしたい方法です。あなたの細部の活動は、レイアウトのみ(すなわちていない行動/コード内)、ちょうどR.layout.* IDを渡すためにputExtra()を使用してを異なる場合

  • あなたNewActivityとする(のが「layoutId」と呼んでみましょう) setContentView(getIntent().getExtras().getInt("layoutId"));でそれを使用してください。

  • あなたの細部の活動がより広くを異なる場合は、すべてのリスト項目のための別のActivityクラスを作成し、onListItemClick()に表示したいrespestiveアクティビティクラスでIntentを作成します。いずれの場合も

、あなたは簡単にonListItemClick()でそれにアクセスできるように、あなたのRowDataクラス(int layoutIdまたはClass<Activity>)を表示するには、詳細情報を格納することができます。

+0

わかりました。しかし、私は "id"を見つける場所を理解できません。それはどこかの番号や何のように、私のJavaファイルで見つけることですか? – Chrfugl

+0

通常、['(Simple)CursorAdapter'](http://www.vogella.de/articles/AndroidListView/article.html#cursor)からIDを取得します。このIDはデータベースから取得します。あなたが本当に必要なだけの数のアイテムを本当に必要とすれば、あなたはIDを無視して、代わりに 'ListAdapter'からクリックされたリストアイテムを得ることができます - これを行うために私の答えを更新しました:) –

+0

申し訳ありません。アップデートは表示されませんか? – Chrfugl