我似乎找不到如何获取ListView(OnListItemClick)来打开不同的活动。我知道我需要为我的ListView获取一些行id,但我不知道怎么做。现在我的ListView中的每一行都打开了相同的活动。抱歉我英语不好,希望你能理解。
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");
}}
您不需要获得"ListView
的行ID",您需要获得"在Listview
中单击的项目的行ID
幸运的是,Android会给你行ID,作为onListItemClick()
的最后一个参数,你目前使用的位置是:
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,它将引用一个名为layuttwo的新布局。这就是我想要的我所有物品的样子。
如果您的详细活动仅在布局上不同(即在任何行为/代码中都不同),只需使用
putExtra()
将R.layout.*
ID(我们称之为"layoutId")传递给NewActivity
,并在setContentView(getIntent().getExtras().getInt("layoutId"));
中使用该ID。如果您的详细活动差异更大,请为每个列表项创建一个单独的
Activity
类,并在onListItemClick()
中创建一个具有要显示的相应活动类的Intent
。
在任何一种情况下,都可以将要显示的详细信息(int layoutId
或Class<Activity>
)存储在RowData
类中,以便在onListItemClick()
中轻松访问。