2012-03-26 3 views
1

Я не могу найти, как получить мой ListView (OnListItemClick), чтобы открыть различные действия. Я знаю, что мне почему-то нужно получить некоторый идентификатор строки для моего ListView, но я не знаю, как это сделать. Прямо сейчас каждая строка в моем ListView просто открывает ту же активность. Извините за мой плохой английский, надеюсь, вы понимаете.Android ListView, OnListItemClick, найти идентификатор строки?

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», вам нужно получить «строку идентификатора элемента что была нажата в Listview "

к счастью, 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); 
} 

Если у вас нет идентификатора, вы можете также получить фактический элемент, т.е. RowData объект в вашем случае, от 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); 
} 

В обоих случаях, вы должны изменить свой код в NewActity, поэтому вы извлекаете идентификатор, а не позицию, из дополнительного пакета.

Еще одно обновление:

Позволяет сказать, что мой список есть 10 пунктов, пункт 1, пункт 2, пункт 3, и так далее. Когда щелкнут элемент 1, я хочу, чтобы для открытия нового действия назовем NewActivityOne, а NewActivityOne будет ссылаться на макет с некоторым текстом, называемым layoutone. Пункт 2 также откроет новое мероприятие, NewActivityTwo, которое будет ссылаться на новый макет под названием layouttwo. И именно так я хочу, чтобы это было для всех моих предметов.

  • Если ваши детали мероприятия отличаются только в макете (т.е. не в любом поведении/код), просто использовать putExtra() пройти R.layout.* ID (назовем его «layoutId») к вашему NewActivity и используйте это в setContentView(getIntent().getExtras().getInt("layoutId"));.

  • Если ваши детали деятельности отличаются более широко, создать отдельный Activity класс для каждого элемента списка, а в onListItemClick() создать Intent с respestive класса активности вы хотите отобразить.

В любом случае, вы можете хранить данные для отображения (int layoutId или Class<Activity>) в вашем RowData классе, так что вы можете легко получить доступ к нему в onListItemClick().

+0

Хорошо, я вижу. Но я не понимаю, где найти «id». Является ли это где-то в моем java-файле, как число или что? – Chrfugl

+0

Обычно вы получаете идентификатор из ['(Simple) CursorAdapter'] (http://www.vogella.de/articles/AndroidListView/article.html#cursor), который, в свою очередь, принимает вещи из базы данных.Если вам действительно нужно только фиксированное количество элементов, как сейчас, вы можете проигнорировать ID и вместо этого получить элемент списка кликов из «ListAdapter» - я обновил свой ответ для способа сделать это :) –

+0

Извините, но я Не видите обновление? – Chrfugl

Смежные вопросы