2

私はListView映画のアプリケーションに取り組んでいます。リストは で配列として宣言されstrings.xmlます。要素、TitleGrossおよびがありDate Releasedます。行を長押しすると、ユーザーがその行を編集または削除できるコンテキスト メニューが表示されます。ユーザーが [編集] を選択すると、2 番目の画面に移動しTitleGrossとに対応する 3 つの編集テキストが表示されDateます。EditTextフィールドは、クリックされた行のデータで初期化されます。これが私のコードです:

     @Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    String[] titleList = getResources().getStringArray(R.array.title_array);
    String[] grossList = getResources().getStringArray(R.array.gross_array);
    String[] dateList = getResources().getStringArray(R.array.date_array);

    results = new ArrayList<Lab8_082588FetchDetails>();

    for (int i = 0; i < titleList.length; i++) {
        Lab8_082588FetchDetails sr = new Lab8_082588FetchDetails();
        sr.setTitle(titleList[i]);
        sr.setGross(grossList[i]);
        sr.setDate(dateList[i]);
        results.add(sr);
    }

    adapter = new SampleCustomAdapter(results);
    setListAdapter(adapter);

    ListView lv = getListView();
    lv.setTextFilterEnabled(true);
            registerForContextMenu(lv);


      }
@Override
public void onCreateContextMenu(ContextMenu menu, View v,
        ContextMenuInfo menuInfo) {
    // TODO Auto-generated method stub
    super.onCreateContextMenu(menu, v, menuInfo);
    MenuInflater inflater = getMenuInflater();

    // places the contents of the XML to the menu
    inflater.inflate(R.menu.context_menu, menu);
}

@Override
public boolean onContextItemSelected(MenuItem item) {
    AdapterContextMenuInfo info = (AdapterContextMenuInfo) item
            .getMenuInfo();
    switch (item.getItemId()) {
    case R.id.delete:
        results.remove(info.position);
        adapter.notifyDataSetChanged();
        return true;
    case R.id.edit:
        System.out.println(info.id);
        System.out.println(info.position);

        Intent newData = new Intent(Lab8_082588.this, Lab8_082588Edit.class);
        results.get(info.position);
        TextView movieTitle = (TextView) findViewById(R.id.title);
        TextView movieGross = (TextView) findViewById(R.id.gross);
        TextView movieDate = (TextView) findViewById(R.id.date);

        String startTitle = movieTitle.getText().toString();
        String startGross = movieGross.getText().toString();
        String startDate = movieDate.getText().toString();

        newData.putExtra(Lab8_082588Edit.TITLE_STRING, startTitle);
        newData.putExtra(Lab8_082588Edit.GROSS_STRING, startGross);
        newData.putExtra(Lab8_082588Edit.DATE_STRING, startDate);
        startActivityForResult(newData, Lab8_082588.EDIT_MOVIE);
        return true;
    default:
        return super.onContextItemSelected(item);

    }
}

編集画面の場合:

    public class Lab8_082588Edit extends Activity {

public static final String TITLE_STRING = "TITLE_STRING";
public static final String GROSS_STRING = "GROSS_STRING";
public static final String DATE_STRING = "DATE_STRING";

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

private void initialize() {
    // TODO Auto-generated method stub
    Intent prepopulate = getIntent();
    EditText movieTitle = (EditText) findViewById(R.id.etTitle);
    EditText movieGross = (EditText) findViewById(R.id.etGross);
    EditText movieDate = (EditText) findViewById(R.id.etDate);

    String startTitle = prepopulate.getStringExtra(Lab8_082588Edit.TITLE_STRING);
    String startGross = prepopulate.getStringExtra(Lab8_082588Edit.GROSS_STRING);
    String startDate = prepopulate.getStringExtra(Lab8_082588Edit.DATE_STRING);

    movieTitle.setText(startTitle);
    movieGross.setText(startGross.replaceAll(",", "").replace("$", ""));
    movieDate.setText(startDate);
}

私のFetchDetailsクラス

    public class Lab8_082588FetchDetails implements Comparable<Lab8_082588FetchDetails> {

private String title;
private String gross;
private String date;

public String getTitle() {
    return title;
}

public void setTitle(String title) {
    this.title = title;
}

public String getGross() {
    return gross;
}

public void setGross(String gross) {
    this.gross = gross;
}

public String getDate() {
    return date;
}

public void setDate(String date) {
    this.date = date;
}

@Override
public int compareTo(Lab8_082588FetchDetails another) {
    // TODO Auto-generated method stub
    return title.compareTo(another.title);
}

 }

私のアダプター:

  private class SampleCustomAdapter extends BaseAdapter {

    public SampleCustomAdapter(ArrayList<Lab8_082588FetchDetails> movies) {
        internalList = movies;
    }

    @Override
    public int getCount() {
        // TODO Auto-generated method stub
        return internalList.size();
    }

    @Override
    public Object getItem(int index) {
        // TODO Auto-generated method stub
        return internalList.get(index);
    }

    @Override
    public long getItemId(int position) {
        // TODO Auto-generated method stub
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {

        LayoutInflater inflater = getLayoutInflater();
        View view;

        if (convertView == null) {
            view = inflater.inflate(R.layout.row, null);
        } else {
            view = convertView;
        }

        // extract the views to be populated
        TextView title = (TextView) view.findViewById(R.id.title);
        TextView gross = (TextView) view.findViewById(R.id.gross);
        TextView date = (TextView) view.findViewById(R.id.date);

        // extract the object that will fill these
        Lab8_082588FetchDetails movie = internalList.get(position);

        title.setText(movie.getTitle());
        date.setText(movie.getDate());
        gross.setText(movie.getGross());

        // return the view
        return view;
    }
}

私の問題は、実際、編集テキストが入力されることですが、リスト全体の最初の項目からのデータのみが使用されます (たとえば、タイタニックがリストの最初であり、入力されるのは唯一のものです)。リストビューで n 行目のムービーをクリックしても、まだタイタニックが取得されています。これを解決するにはどうすればよいですか?

編集:どういうわけか、コードはリストの最初の要素のみを考慮していることに気付きました。他の行の要素にアクセスするにはどうすればよいですか?

4

1 に答える 1

1

どういうわけか、コードはリストの最初の要素のみを考慮していることに気付きました。他の行の要素にアクセスするにはどうすればよいですか?

findViewById連続しているアイテムを検索することは絶対にしないでくださいListView。コールバックには、onContextItemSelectedクリックされた要素の位置があるため、それを使用して、この行に関連付けられたデータを取得できます。

case R.id.edit:
    Intent newData = new Intent(Lab8_082588.this, Lab8_082588Edit.class);
    // I hope you implemented the adapter correctly
    Lab8_082588FetchDetails item = (Lab8_082588FetchDetails) getListView().getItemAtPosition(info.position); 
    String startTitle = item.getTitle();
    String startGross = item.getGross();
    String startDate = item.getDate();

    newData.putExtra(Lab8_082588Edit.TITLE_STRING, startTitle);
    newData.putExtra(Lab8_082588Edit.GROSS_STRING, startGross);
    newData.putExtra(Lab8_082588Edit.DATE_STRING, startDate);
    startActivityForResult(newData, Lab8_082588.EDIT_MOVIE);
    return true;
于 2012-08-19T05:48:45.670 に答える